Содержание
Пример пользовательского интерфейса
В качестве примера мы приведём программу, реализующую широко известную игру «Быки и коровы». Эта программа отслеживает все варианты некорректного ввода (первая цифра вводимого числа — не ноль; все цифры различны; вводится именно цифра, а не любой другой символ), а также нажатие клавиш ESCAPE и BACK SPACE.
Автор программы попытался застраховать её и от пытающегося жульничать игрока, и от случая, когда игрок не понял правил игры или понял их неправильно; постарался учесть возможность «сдваивания» нажатой на клавиатуре клавиши, «промаха» мимо цифровой клавиши или случайного нажатия произвольной клавиши; организовал правильную реакцию на желание пользователя прервать игру.
Мы приводим программу в полном, работающем виде, поскольку лишь 10% её текста не относятся к обеспечению интерфейса:
uses Crt;
const cifr : set of '0' .. '9' = ['0' .. '9'];
yes : set of Char = ['Y', 'y', 'Д', 'д', 'L', 'l'];
cifr10 : set of 0 .. 9 = [0 .. 9];
type cifr_char = '0' .. '9';
vector = array[1 .. 10] of 0 .. 9;
var zagadano, popytka : vector;
i, j, jj, n : 1 .. 10;
flag : Boolean;
c : cifr_char;
c1 : Char;
set_of_popyt, set_of_zagad : set of 0 .. 9;
num_of_popyt, cow, bull, err : Integer;
procedure error_(st : String; x, y : Integer);
begin
TextColor(LightRed);
Write(' Ошибка: ', st);
GotoXY(WhereX + x, WhereY + y);
TextColor(White);
flag := False;
end;
function check(cc : Char) : Integer;
begin
case cc of
Chr(27) :
begin {Escape}
check := 1;
TextColor(LightGreen);
ClrEol;
Write('До свидания? Y/N');
if ReadKey in yes then
begin
ClrScr;
Halt(0);
end
else
begin
GotoXY(WhereX - 16, WhereY);
ClrEol;
end;
TextColor(White);
end;
Chr(8) :
begin {BackSpace}
check := 2;
if j > 1 then Dec(j);
if popytka[j] = zagadano[j] then
Dec(bull)
else if popytka[j] in set_of_zagad then
Dec(cow);
set_of_popyt := set_of_popyt - [popytka[j]];
GotoXY(WhereX - 1, WhereY);
ClrEol;
end;
Chr(13) :
if j <> n then {Enter}
begin
WriteLn('Недостаточно цифр! Введите число заново.');
GotoXY(1, WhereY - 1);
check := 3;
end;
'0' .. '9' :
begin
Write(cc);
check := 0;
end;
else
begin
Write(cc);
check := 4;
end;
end; {end-of-case}
end;
begin
ClrScr;
TextColor(LightMagenta);
WriteLn(' Поиграем в "Быков и коров"?');
TextColor(Yellow);
WriteLn(' (бык - это цифра, стоящая на своём месте; а корова - просто верная)');
TextColor(Green);
WriteLn(' Итак... Я загадываю число из разных цифр. Вам отгадывать! ');
WriteLn(' (Выход из программы - <ESC> )');
TextColor(Cyan);
Write('Введите количество цифр в угадываемом числе: ');
{$I-};
flag := False;
repeat
TextColor(White);
c1 := ReadKey;
ClrEol;
err := check(c1);
if err= 4 then
error_('введена не цифра!', -27, 0);
if err = 0 then
case c1 of
'0' : begin
WriteLn;
error_('в числе должна быть хотя бы одна цифра!', -3, -1)
end;
'1' : begin
c1 := ReadKey;
flag := True;
case c1 of
'0' : begin
n := 10;
WriteLn(c1)
end;
#13 : n := 1;
else
begin
WriteLn(c1);
error_('в числе может быть не более 10 разных цифр!', -7, -1);
end;
end;{case}
end;
else begin
Val(c1, n, err);
flag := True;
end;
end;
{if n > 10 then}
until flag;
WriteLn;
{-- Zagadyvanie chisla --------------------}
Randomize;
zagadano[1] := Random(9) + 1;
set_of_zagad := [zagadano[1]];
for i := 2 to n do
repeat
zagadano[i] := Random(10);
if not (zagadano[i] in set_of_zagad) then
begin
set_of_zagad := set_of_zagad + [zagadano[i]];
flag := True;
end
else
flag := False;
until flag;
{--- Game --------------------------}
TextColor(LightMagenta);
Write('Начинаем! ');
TextColor(cyan);
ClrEol;
WriteLn('Вводите Ваши числа:');
TextColor(White);
num_of_popyt := 0;
flag := True;
repeat {Ввод очередного числа}
cow := 0;
bull := 0;
set_of_popyt := [];
j := 1;
while j <= n do {Ввод по цифрам}
repeat
c := ReadKey;
err := check(c);
ClrEol;
if err = 4 then
error_('Введена не цифра! Измените последний символ.', -54, 0);
if err = 0 then
if (c = '0') and (j = 1) then
error_('Первой цифрой не может быть ноль! Повторите ввод.', -59, 0)
else
begin
Val(c, popytka[j], err);
if popytka[j] in set_of_popyt then
error_('Одинаковых цифр быть не должно! Измените последнюю цифру.', -67, 0)
else
begin
set_of_popyt := set_of_popyt + [popytka[j]];
flag := True;
if popytka[j] = zagadano[j] then
Inc(bull)
else if popytka[j] in set_of_zagad then
Inc(cow);
Inc(j)
end;
end;
until flag;
ClrEol;
ReadLn;
TextColor(Yellow);
GotoXY(n + 1, WhereY - 1);
WriteLn(' Быков - ', bull, '; коров - ', cow);
Inc(num_of_popyt);
TextColor(White);
until bull = n;
TextColor(Green);
if bull = n then
WriteLn('Поздравляю! Вы выиграли за ', num_of_popyt, ' шагов!');
ReadLn;
ClrScr
end.
Графический режим
Единицей изображения в графическом режиме служит один пиксель, поэтому линии на рисунках получаются почти гладкими. Графический режим используется довольно редко — например, для построения графиков и диаграмм или при создании обучающих программ, игр, скрин–сейверов и т. п.
Для изучения богатых графических возможностей языка Pascal совершенно недостаточно даже целой лекции: здесь нужен как минимум полугодичный курс. Поэтому мы не станем и пытаться «объять необъятное». В качестве оправдания заметим лишь, что для того, чтобы писать примитивные графические программки и создавать «хороший» интерфейс, вполне достаточно уже рассмотренных возможностей текстового режима.