Игра «Угадай число» — Pascal(Паскаль)

program numbers;
uses Crt;
     const
     MAXLEV=5;{ максимально возможный уровень сложности }
     CURLEV=3;{ текущий уровень сложности }
     K_ENTER=13;
     K_ESC=27;
type
     ArOfint=array[1..MAXLEV]of integer;
var
     igrok:ArOfint;{ комбинация игрока }
     comp:ArOfint;{ комбинация компьютера }

     level:integer;{ уровень сложности ■ число цифр в числе }

     nu:integer;{ угадано чисел }
     nm:integer;{ из них на своих местах }

     KeyCode:integer;{ код клавиши,нажатием которой игрок завершил ввод }

     otl:boolean;

     i:integer;

{ " получить " строку цифр у компьютера }
procedure GetComp(var a:ArOfInt;n:integer);
var
     i:integer;
begin
     randomize;
     for i:=1 to n do
     a[i]:=random(10);
     if otl then begin
          writeln;
          write('Комбинация компьютера: ');
          for i:=1 to n do write(a[i]);
          writeln;
     end;
end;


{ Сколько цифр угадано? }
function ugad(comp,igrok:ArOfInt;n:integer):integer;
var
     u:integer;{ угадано цифр }
     i,j:integer;
     found:boolean;{ TRUE,если igrok[i]=comp[j]}
begin
     u:=0;
     for i:=1 to n do { проверим каждую цифру игрока }
     begin
          j:=1;
          found:=FALSE;
          { будем igrok[i]последовательно сравнивать с числами
          компьютера }
          repeat
               if igrok[i]=comp[j] then
                    begin
                         comp[j]:=-1;{ пометим найденное число }
                         u:=u+1;
                         found:=TRUE;
                    end
                    else j:=j+1;
          until (j>n)or found
     end;
     ugad:=u;
end;

{ Сколько цифр на своих местах? }
function mesto(comp,igrok:ArOfInt;n:integer):integer;
var
     m:integer;
     i:integer;
begin
     m:=0;
     for i:=1 to n do
          if comp[i]=igrok[i]
               then m:=m+1;
     mesto:=m;
end;

{ Процедура вводит с клавиатуры строку цифр заданной длины.}
{ Используя клавишу <BackSpace>,можно исправлять введенные цифры.}
{ Процедура завершает работу,если введено заданное количество цифр }
{ и нажата клавиша <Enter>.}
function GetIgrok(var a:ArOfint;n:integer;mes:string):integer;
var
     ch:char;{ символ }
     dec:integer;{ десятичный код символа }
     x,y:integer;{ положение курсора }
     i:integer;
     code:integer;
begin
     i:=1;
     write(mes);
     repeat
          ch:=readkey;
          dec:=ord(ch);
          if(ch >='0') and (ch<='9') and (i<=n)
               then begin
                    write(ch);
                    val(ch,a[i],code);
                    i:=i+1;
               end
          else
               if(dec=8) and (i > 1)
                    then begin
                         i:=i-1;
                         x:=whereX;
                         y:=whereY;
                         gotoXY(x-1,y);
                         write(' ');
                         gotoXY(x-1,y);
                    end;
     until((i>n) and (dec=K_ENTER)) or (dec=K_ESC);
     getigrok:=dec;
end;{ GeIgrok }

procedure pravila(n:integer);
begin
     writeln;
     writeln;
     writeln('Компьютер задумал число из ',n,' цифр. Вы должны его отгадать.');
     writeln('После ввода очередного числа программа сообщает');
     writeln('сколько цифр');
     writeln('угадано, и сколько из них находятся на своих местах.');
     writeln('         Например,');
     writeln('если задумано число 4345 и введено 4251,');
     writeln('         то угаданы две цифры,');
     writeln('и одна цифра находится на своем месте.');
     writeln('При вводе можно использовать <Backspace>.');
     writeln('         После ввода числа');
     writeln('следует нажать клавишу <Enter> или <Esc> -');
     writeln('         для прекращения игры.');
     writeln;
end;

begin { основная процедура }
     level:=CURLEV;
     otl:=FALSE;
     pravila(level);{ вывести правила игры }
     GetComp(comp,level);
     repeat
          KeyCode:=GetIgrok(igrok,level,'Ваш вариант-> ');
          if KeyCode<>K_ESC then begin
               nu:=ugad(comp,igrok,level);
               nm:=mesto(comp,igrok,level);
               writeln('Угадано:',nu,'. На своих местах:',nm);
          end;
     until ((nu=level) and (nm=level)) or (KeyCode=K_ESC);
     if KeyCode<>K_ESC
          then writeln('***ВЫ УГАДАЛИ ЧИСЛО!***')
          else begin
               writeln('Игра завершена по нажатию <Esc>.');
               write('Задуманное число:');
               for i:=1 to level do write(comp[i]);
               writeln;
          end;
     write('Нажмите <Enter> для завершения.');
     readln;
end.

Leave a Comment

− 2 = 6