Прошу помочь 2м нуждающимся (мне и DRAKON'у).
Есть у нас такая программа крестики-нолики.
Я (не знаю как DRAKON) не прошу комментировать текст программы (сам бы на вашем месте не стал)
прошу лишь показать и пояснить хотя бы 2 места в программе: проверка 5 символов в ряд и как компьютер определяет место для своего хода.
Я думаю так, проверка 5 в ряд здесь:
Код
type tvert=array[1..20] of integer;
const vert : tvert = (0,0,0,0,0, -1,-2,-3,-4,-5,
0,0,0,0,0, 1,2,3,4,5);
hor : tvert = (-1,-2,-3,-4,-5, 0,0,0,0,0,
1,2,3,4,5, 0,0,0,0,0);
diag1 : tvert = (-1,-2,-3,-4,-5, -1,-2,-3,-4,-5,
1,2,3,4,5, 1,2,3,4,5);
diag2 : tvert = (1,2,3,4,5, -1,-2,-3,-4,-5,
-1,-2,-3,-4,-5, 1,2,3,4,5);
const ee=10;
function evaluate(color:integer):longint;
var ii,jj,i,j,k,l,pos,ev,pol : longint;
fl,fl1,win,fl2 : boolean;
procedure ev_(vert:tvert);
var i : integer;
begin
pos:=1;
pol:=1;
fl:=false;
fl1:=true;
fl2:=false;
for i:=1 to 4 do begin
if field[ii+vert[i],jj+vert[i+5]]=color then
begin
if fl1 then pos:=pos+1;
pol:=pol*ee;
end
else
case field[ii+vert[i],jj+vert[i+5]] of
null,rad1,rad2: begin
if i<4 then
if field[ii+vert[i+1],jj+vert[i+6]]=color then
fl:=true
else
break
else
if field[ii+vert[i+1],jj+vert[i+6]]=color then begin
pol:=pol*ee;
fl2:=true;
end;
fl1:=false;
end;
else begin
fl:=true;
k:=i;
break;
end;
end;{case}
end;
fl1:=true;
for i:=11 to 14 do begin
if field[ii+vert[i],jj+vert[i+5]]=color then begin
if fl1 then pos:=pos+1;
pol:=pol*ee;
end
else
case field[ii+vert[i],jj+vert[i+5]] of
null,rad1,rad2: begin
if i<14 then
if field[ii+vert[i+1]+0,jj+vert[i+6]]=color then
fl2:=true
else
break
else
if field[ii+vert[i+1]+0,jj+vert[i+6]]=color then begin
pol:=pol*ee;
end;
fl1:=false;
end;
else begin
if fl and(k+i-10<5) then pol:=0;
fl:=true;
break;
end;
end;{case}
end;
if pol>10000000 then pol:=10000000;
if fl or fl2 then ev:=ev+pol
else ev:=ev+pol*ee;
if pos>4 then win:=true;
end;
begin
ev:=0;
win:=false;
for ii:=1 to n do begin
for jj:=1 to n do begin
if field[ii,jj]=color then begin
ev_(vert);
ev_(hor);
ev_(diag1);
ev_(diag2);
end;{if}
if win then break;
end;
if win then break;
end;
if win then ev:=inf;
evaluate:=ev;
end;
function ev_step(color:integer;ii,jj:longint):longint;
var i,j,k,l,pos,ev,pol : longint;
fl,fl1,win,fl2 : boolean;
procedure ev_(vert:tvert);
var i : integer;
begin
pos:=1;
pol:=1;
fl:=false;
fl1:=true;
fl2:=false;
for i:=1 to 4 do begin
if field[ii+vert[i],jj+vert[i+5]]=color then
begin
if fl1 then pos:=pos+1;
pol:=pol*ee;
end
else
case field[ii+vert[i],jj+vert[i+5]] of
null,rad1,rad2: begin
if i<4 then
if field[ii+vert[i+1],jj+vert[i+6]]=color then
fl:=true
else
break
else
if field[ii+vert[i+1],jj+vert[i+6]]=color then begin
pol:=pol*ee;
fl2:=true;
end;
fl1:=false;
end;
else begin
fl:=true;
k:=i;
break;
end;
end;{case}
end;
fl1:=true;
for i:=11 to 14 do begin
if field[ii+vert[i],jj+vert[i+5]]=color then begin
if fl1 then pos:=pos+1;
pol:=pol*ee;
end
else
case field[ii+vert[i],jj+vert[i+5]] of
null,rad1,rad2: begin
if i<14 then
if field[ii+vert[i+1]+0,jj+vert[i+6]]=color then
fl2:=true
else
break
else
if field[ii+vert[i+1]+0,jj+vert[i+6]]=color then begin
pol:=pol*ee;
end;
fl1:=false;
end;
else begin
if fl and(k+i-10<5) then pol:=0;
fl:=true;
break;
end;
end;{case}
end;
if pol>10000000 then pol:=10000000;
if fl or fl2 then ev:=ev+pol
else ev:=ev+pol*ee;
if pos>4 then win:=true;
end;
begin
win:=false;
if field[ii,jj]=color then begin
ev_(vert);
ev_(hor);
ev_(diag1);
ev_(diag2);
end;{if}
if win then ev:=inf;
ev_step:=ev;
end;
Что здесь происходит?
Помогите найти как компьютер ходит?(если можно поясните принцип)
И ещё 2 маленьких вопроса:
Что за массивы заполняются в начале программы?
Зачем так много процедур в модуле?(зачем они вообще)
Если чем поможете можем и отблагодарить. Заранее не могу, т.к уже нет времени. Просто физически не смогу.
Заранее благодарен.