Пример пользовательского интерфейса
В качестве примера мы приведем программу, реализующую широко известную игру "Быки и коровы". Эта программа отслеживает все варианты некорректного ввода (первая цифра вводимого числа - не ноль; все цифры различны; вводится именно цифра, а не любой другой символ), а также нажатие клавиш 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.