| Тип данных boolean является |
Методы создания пользовательского интерфейса
Пример пользовательского интерфейса
В качестве примера мы приведем программу, реализующую широко известную игру "Быки и коровы". Эта программа отслеживает все варианты некорректного ввода (первая цифра вводимого числа - не ноль; все цифры различны; вводится именно цифра, а не любой другой символ), а также нажатие клавиш ESCAPE и BACK SPACE.
Автор программы попытался застраховать ее и от пытающегося жульничать игрока, и от случая, когда игрок не понял правил игры или понял их неправильно; постарался учесть возможность "сдваивания" нажатой на клавиатуре клавиши, "промаха" мимо цифровой клавиши или случайного нажатия произвольной клавиши; организовал правильную реакцию на желание пользователя прервать игру.
Мы приводим программу в полном, работающем виде, поскольку лишь 10% ее текста не относятся к обеспечению интерфейса:
program bull_and_cow;
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 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) {Enter}
then 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 совершенно недостаточно даже целой лекции: здесь нужен как минимум полугодичный курс. Поэтому мы не станем и пытаться "объять необъятное". В качестве оправдания заметим лишь, что для того, чтобы писать примитивные графические программки и создавать "хороший" интерфейс, вполне достаточно уже рассмотренных возможностей текстового режима.