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.