Опубликован: 06.09.2005 | Доступ: свободный | Студентов: 12780 / 1211 | Оценка: 3.98 / 3.46 | Длительность: 12:50:00
ISBN: 978-5-9556-0025-3
Лекция 14:

Методы создания пользовательского интерфейса

< Лекция 13 || Лекция 14: 1234 || Лекция 15 >

Пример пользовательского интерфейса

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

< Лекция 13 || Лекция 14: 1234 || Лекция 15 >
Евгения Поздеева
Евгения Поздеева
Ольга Стебакова
Ольга Стебакова

Вот фрагмент лекции 5 (статья 4):

Проверка множества на пустоту может быть осуществлена довольно просто:

pusto:= true;   for i:= 1 to N do 

if set_arr[i] then begin pusto:= false; break end; {мне кажется здесь должно быть так:

if set_arr[i]<>0 then begin pusto:= false; break end;}

Хотелось бы знать это ошибка в теории или я просто не поняла лекцию?