program X0; type map=array [1..3,1..3] of integer; //игровое поле 0-пусто, 1 - ход одного игрока, -1 - ход другого игрока //функция возвращает номер выигравшего игрока, в противном случае ноль function if_win(a:map):integer; var i:integer; begin if_win:=0; if ((((a[1,1]=a[2,2]) and (a[2,2]=a[3,3])) or ((a[1,3]=a[3,1]) and (a[2,2]=a[1,3]))) and (a[2,2]<>0)) then if_win:=a[2,2] else for i:=1 to 3 do begin if ((a[1,i]=a[2,i]) and (a[2,i]=a[3,i]) and (a[1,i]<>0)) then if_win:=a[1,i]; if ((a[i,1]=a[i,2]) and (a[i,2]=a[i,3]) and (a[i,1]<>0)) then if_win:=a[i,1]; end; end; //проверяем, есть ли свободные места на поле //true eсли есть function adding(a:map):boolean; var i2,i3:integer; begin adding:=false; for i2:=1 to 3 do for i3:=1 to 3 do if a[i2,i3]=0 then adding:=true; end; //функция возвращает то, что получится, если игрок (-num_player) походит на х,у //num_player - номер игрока который должен походить!!, 1 или -1, на поле ставят 1 и -1 соответственно //значение функции равно номеру игрока, который выиграет 0 - ничья function vibor2(e:map;x,y,num_player:integer):integer; var best:boolean; //если найден выигрышный вариант, программа больше не ищет who_win:integer; //номер того кто выиграл m,pr:integer; //временные переменные i2,i3:integer; //для циклов a:map; begin //копирование массива е в а for i2:=1 to 3 do for i3:=1 to 3 do a[i2,i3]:=e[i2,i3]; vibor2:=0; a[x,y]:=-num_player; who_win:=if_win(a); if who_win<>0 then //если кто-то выиграл, то vibor2:=who_win; else if adding(a) then begin // программа доходит досюда, если никто не выиграл и на поле есть свободные клетки best:=false; //прошу обратить внимание и не перепутать номер игрока m:=-num_player; for i2:=1 to 3 do for i3:=1 to 3 do if ((not best) and (a[i2,i3]=0)) then //если не неайден выигрышный вариант и клетка свободна begin pr:=vibor2(a,i2,i3,-num_player); if pr=num_player then begin m:=num_player; best:=true; end; if ((m=-num_player) and (pr=0)) then m:=0; //фактически, выбираем лучший вариант end; vibor2:=m; end; end; //как можно заметить, эта функция только возвращает то,что получится при ходе на х,у //1 - выиграет первый игрок, (-1) - выиграет второй игрок (при правильной игре) и 0 если ничья //также была функция (коряво написана,её тут нет) которая смотрела лучшие варианты и случайным образом выбирала из них