Добрый вечер! Конечно, это тема звучала здесь уже не один раз, но я все равно надеюсь на Вашу помощь.
У меня есть программа в которой компьютер должен отгадать загаданное человеком число.
Но она, к сожалению, не работает. С ошибкой я уже справилась, теперь у меня появляется экран с надписью, число, я ввожу коровы и быки и дальше ничего не происходит. Помогите, пожалуйста, разобраться..
Код:
uses crt;
const max=10000;
type mas=array[0..4] of char; **число в виде букв
type chisl=record
cifr: mas;
end;
var ch: array[0..max] of chisl; **множество всех возможных комбинаций
fl: array[0..max] of boolean;
num2: array[0..4] of byte;
a,b,c,d,hod,ii,bk,kr: byte;
i,j: longint;
num: mas;
dop,prov,ok: boolean;
function pr(n1,n2: mas; buk,kor: byte) : boolean; **функция, которая проверяет есть ли совпадения
var i,m: byte; pr1,pr2: boolean;
begin
pr1:=true; pr2:=true;
m:=0;
for i:=1 to 4 do
if n1[i]=n2[i] then m:=m+1;
if m<>buk then
begin
pr1:=false;
end;
if pr1<>false then begin
m:=0;
for i:=1 to 4 do
for j:=1 to 4 do begin
if i<>j then
if n2[i]=n1[j] then m:=m+1;
end;
m:=m div 2;
if m<kor then
begin
pr2:=false;
end;
end;
if (pr1=false) or (pr2=false) then pr:=false
else pr:=true;
end;
function main(a: mas): boolean; **проверка на то, не стоит ли ноль первым (что в моей игре нельзя) и разные ли все цифры (одинаковые также нельзя)
var b: mas; nol,ravn: boolean; i,j: integer;
begin
for i:=1 to 4 do begin
b[i]:=a[i];
if a[1]<>'0' then nol:=true;
end;
for i:=1 to 4 do
for j:=1 to 4 do
if i<>j then begin
if a[i]=b[j] then ravn:=true;
end;
if (nol=true) and (ravn<>true) then main:=true
else main:=false;
end;
**основная часть программы
begin
randomize;
clrscr;
writeln('Загадайте, пожалуйста, число и нажмите Enter');
readln;
i:=0; **создаем множество
for a:=0 to 9 do
for b:=0 to 9 do
for c:=0 to 9 do
for d:=0 to 9 do begin
ch[i].cifr[1]:=chr(a+ord('0'));
ch[i].cifr[2]:=chr(b+ord('0'));
ch[i].cifr[3]:=chr(c+ord('0'));
ch[i].cifr[4]:=chr(d+ord('0'));
i:=i+1;
end;
for j:=1 to max do fl[j]:=true;
repeat *ходы...если первый - то рандомно
if hod=0 then begin
num2[1]:=random(8)+1;
repeat
num2[2]:=random(9)+0;
until num2[2]<>num2[1];
repeat
num2[3]:=random(9)+0;
until (num2[3]<>num2[1]) and (num2[3]<>num2[2]);
repeat
num2[4]:=random(9)+0;
until (num2[4]<>num2[3]) and (num2[4]<>num2[2]) and (num2[4]<>num2[1]);
for i:=1 to 4 do
num[i]:=chr(num2[i]+ord('0'));
end;
if hod>0 then begin **если не первый то, берем следующий из множества
repeat
dop:=false;
for i:=1 to max do
if dop=false then begin
if fl[i]=true then begin
for ii:=1 to 4 do
num[ii]:=ch[i].cifr[ii];
dop:=true;
end;
end;
ok:=main(num);
until ok=true;
end; **вывод на экран числа, и ввод быков и коров пользователем
for i:=1 to 4 do write(num[i]);
writeln;
write('Быки - '); readln(bk); write('Коровы - '); readln(kr);
if bk=4 then write('Ура! Компьютер угадал Ваше число: ')
else begin **проверка и вычеркивание ненужных чисел из множества
for i:=1 to max do
prov:=pr(ch[i].cifr,num,bk,kr);
if (fl[i]=true) and (prov=false) then fl[i]:=false;
end;
hod:=hod+1;
until bk=4;
write('за ', hod, 'ходов!'); **результат
end.