IPB

> Лекция №14.4: Методы создания пользовательского интерфейса
Форум
Загрузка...
 
Час быка
Час быка
Карта Интернета
Internet Map
Яндекс.Метрика

страницы: 1 2 3 4

Содержание

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

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

страницы: 1 2 3 4

Примечания

 
 К началу страницы 
 

Код для вставки: :: :: :: ГОСТ ::
Поделиться: //
 


-
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"