«Свою первую программу я написал в 13 лет - для игры в крестики-нолики». Так начинается автобиографическая книга Билла Гейтса «Дорога в будущее». По странному совпадению, свою первую программу на Pascalя тоже написал по алгоритму игры «Крестики-нолики». Эта простейшая логическая игра, становится стартом для многих программистов, кем и я хочу стать в дальнейшем.
В эту игру нужно играть с человеком, но интереснее, когда твоим противником становится компьютер. Для того чтобы машина «умела» играть, ее надо «научить» - снабдить искусственным интеллектом.
Искусственный интеллект (ИИ, англ. Artificialintelligence, AI) — наука и технология создания интеллектуальных машин, особенно интеллектуальных компьютерных программ. ИИ связан со сходной задачей использования компьютеров для понимания человеческого интеллекта, но не обязательно ограничивается биологически правдоподобными методами.
В этой работе описан мой алгоритм программы игры «Крестики-нолики». Программа создана в FreePascal 2.4.4.
Существует много алгоритмов игры «Крестики-нолики», но этот алгоритм необычен.В простом режиме компьютер сделает ходы на первую попавшуюся пустую клетку.А в сложном режиме создан Искусственный Интеллект для компьютера - смоделировано, как бы думал простой человек, играя в Крестики-Нолики. Перед созданием игры, были проанализированы мысли человека, играющего в Крестики-нолики.
В работе описан интерфейс игры, алгоритм программы.
Вложение | Размер |
---|---|
krestiki-noliki.docx | 121.42 КБ |
Тема: «Как научить компьютер играть в «Крестики-
нолики»
Автор работы:
Джиджоев Владислав Муратович
Научный руководитель:
Джаноян Елена Владимировна,
учитель информатики
Владикавказ
Оглавление
Введение ………………………………………………………………….. 3
Описание интерфейса игры……………………………………………… 5
Описание алгоритма игры ………………………………………………. 6
Заключение ………………………………………………………………. 13
Библиография…………………………………………………………….. 14
Приложение ……………………………………………………. 15
Введение
«Свою первую программу я написал в 13 лет - для игры в крестики-нолики». Так начинается автобиографическая книга Билла Гейтса «Дорога в будущее». По странному совпадению, свою первую программу на Pascalя тоже написал по алгоритму игры «Крестики-нолики». Эта простейшая логическая игра, становится стартом для многих программистов, кем и я хочу стать в дальнейшем.
Крестики-нолики — логическая игра, в которую играют два противника на квадратном поле 3 на 3 клетки или большего размера (вплоть до «бесконечного поля»). Один из игроков играет «крестиками», второй — «ноликами».
Описание игры: «Игроки по очереди ставят на свободные клетки поля 3х3 знаки (один всегда крестики, другой всегда нолики). Первый, выстроивший в ряд 3 свои фигуры по вертикали, горизонтали или диагонали, выигрывает. Первый ход делает игрок, ставящий крестики».[1]
Обычно по завершении партии выигравшая сторона зачёркивает чертой свои три знака (нолика или крестика), составляющих сплошной ряд.
Вот некоторые стратегии игры:
В эту игру нужно играть с человеком, но интереснее, когда твоим противником становится компьютер. Для того чтобы машина «умела» играть, ее надо «научить» - снабдить искусственным интеллектом.
Искусственный интеллект (ИИ, англ. Artificialintelligence, AI) — наука и технология создания интеллектуальных машин, особенно интеллектуальных компьютерных программ. ИИ связан со сходной задачей использования компьютеров для понимания человеческого интеллекта, но не обязательно ограничивается биологически правдоподобными методами.[2]
В своей работе я опишу свой алгоритм программы игры «Крестики-нолики». Программу создал в FreePascal 2.4.4.
FreePascalCompiler (FPC) - это свободно распространяемый компилятор языка Паскаль с открытыми исходными кодами. Он совместим с BorlandPascal 7 и ObjectPascal – Delphi, но при этом обладает рядом дополнительных возможностей, например, поддерживает перегрузку операторов. [3]
Описание интерфейса игры
В программе «Крестики-нолики» существует возможность выбора количества игроков (1 или 2).
Если было выбрано 2 игрока, то в игре участвуют два человека.
Если был выбран 1 игрок, то человек играет с компьютером.
Причем, при игре с компьютером есть возможность выбора сложности игры.
Для хода игрока необходимо указать номер столбика и номер строки. Отсчет производится с верхнего левого угла.
Окончание игры: фиксируется результат и дается возможность выбора продолжения игры.
Описание алгоритма игры
Существует много алгоритмов игры «Крестики-нолики», но мой алгоритм необычен.
В простом режиме компьютер сделает ходы на первую попавшуюся пустую клетку.
if easy then
begin
// простойрежим
for i := 0 to 2 do
begin
if table[i, 0] = 0 then
begin
table[i, 0] := 2;
exit;
end;
if table[i, 1] = 0 then
begin
table[i, 1] := 2;
exit;
end;
if table[i, 2] = 0 then
begin
table[i, 2] := 2;
exit;
end;
end;
end
А в сложном режиме я создал Искусственный Интеллект для компьютера. Но я не переписывал на язык Pascal алгоритм,приведённый выше. Я смоделировал, как бы думал простой человек, играя в Крестики-Нолики. Перед созданием игры, я попытался проанализировать мысли человека, играющего в Крестики-Нолики. С одной стороны, каждый человек думает по-разному, но общий ход мыслей выявить, возможно.
Вот ход мыслей человека:
1. Сначала человек проверяет, может ли он победить, сделав прямо сейчас один ход. Если да, то он ходит так, чтобы победить.
Компьютер это делает так:
for i := 0 to 2 do
begin
if ((table[i, 0] = 2) and (table[i, 1] = 2))
or ((table[i, 0] = 2) and (table[i, 2] = 2))
or ((table[i, 1] = 2) and (table[i, 2] = 2)) then
begin
if table[i, 0] = 0 then
begin
table[i, 0] := 2;
exit;
end;
if table[i, 1] = 0 then
begin
table[i, 1] := 2;
exit;
end;
if table[i, 2] = 0 then
begin
table[i, 2] := 2;
exit;
end;
end;
end;
for i := 0 to 2 do
begin
if ((table[0, i] = 2) and (table[1, i] = 2)) or ((table[0, i] = 2) and (table[2, i] = 2)) or ((table[1, i] = 2) and (table[2, i] = 2)) then
begin
if table[0, i] = 0 then
begin
table[0, i] := 2;
exit;
end;
if table[1, i] = 0 then
begin
table[1, i] := 2;
exit;
end;
if table[2, i] = 0 then
begin
table[2, i] := 2;
exit;
end;
end;
end;
if ((table[0, 0] = 2) and (table[1, 1] = 2)) or ((table[0, 0] = 2) and (table[2, 2] = 2)) or
((table[1, 1] = 2) and (table[2, 2] = 2)) then
begin
if table[0, 0] = 0 then
begin
table[i, 0] := 2;
exit;
end;
if table[1, 1] = 0 then
begin
table[i, 1] := 2;
exit;
end;
if table[2, 2] = 0 then
begin
table[i, 2] := 2;
exit;
end;
end;
if ((table[2, 0] = 2) and (table[1, 1] = 2)) or
((table[2, 0] = 2) and (table[0, 2] = 2)) or
((table[1, 1] = 2) and (table[0, 2] = 2)) then
begin
if table[2, 0] = 0 then
begin
table[2, 0] := 2;
exit;
end;
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
if table[0, 2] = 0 then
begin
table[i, 2] := 2;
exit;
end;
end;
2. Если нет, то человек проверяет, не может ли соперник одним ходом, прямо сейчас, победить. Если да, то человек защищается.
Компьютер делает это так:
// проверка прямой победы человека
Fori := 0 to 2 do
begin
if ((table[i, 0] = 1) and (table[i, 1] = 1)) or ((table[i, 0] = 1) and (table[i, 2] = 1)) or ((table[i, 1] = 1) and (table[i, 2] = 1)) then
begin
if table[i, 0] = 0 then
begin
table[i, 0] := 2;
exit;
end;
if table[i, 1] = 0 then
begin
table[i, 1] := 2;
exit;
end;
if table[i, 2] = 0 then
begin
table[i, 2] := 2;
exit;
end;
end;
end;
for i := 0 to 2 do
begin
if ((table[0, i] = 1) and (table[1, i] = 1)) or ((table[0, i] = 1) and (table[2, i] = 1)) or ((table[1, i] = 1) and (table[2, i] = 1)) then
begin
if table[0, i] = 0 then
begin
table[0, i] := 2;
exit;
end;
if table[1, i] = 0 then
begin
table[1, i] := 2;
exit;
end;
if table[2, i] = 0 then
begin
table[2, i] := 2;
exit;
end;
end;
end;
if ((table[0, 0] = 1) and (table[1, 1] = 1)) or
((table [0, 0] = 1) and (table[2, 2] = 1)) or
((table[1, 1] = 1) and (table[2, 2] = 1)) then
begin
if table[0, 0] = 0 then
begin
table[0, 0] := 2;
exit;
end;
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
if table[2, 2] = 0 then
begin
table[2, 2] := 2;
exit;
end;
end;
if ((table[2, 0] = 1) and (table[1, 1] = 1)) or
((table[2, 0] = 1) and (table[0, 1] = 1)) or
((table[1, 1] = 1) and (table[0, 2] = 1)) then
begin
if table[2, 0] = 0 then
begin
table[2, 0] := 2;
exit;
end;
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
if table[0, 2] = 0 then
begin
table[0, 2] := 2;
exit;
end;
end;
3. Если нет, то человек думает, как бы сделать так, чтобы соперник не схитрил, и не обыграл его тактически.
Компьютер это делает так.
// проверка победы человека через ход.
if (table[0, 0] = 1) and (table[0, 2] = 1) then
begin
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
end;
if (table[0, 0] = 1) and (table[2, 0] = 1) then
begin
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
end;
if (table[0, 2] = 1) and (table[2, 2] = 1) then
begin
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
end;
if (table[2, 0] = 1) and (table[2, 2] = 1) then
begin
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
end;
if (table[2, 2] = 1) and (table[1, 1] = 1) then
begin
if table[0, 2] = 0 then
begin
table[0, 2] := 2;
exit;
end;
end;
4. Далее человек делает «умные ходы», чтобы самому обыграть противника.
Компьютер это делает умные ходы вот так:
// умныеходы
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
5. Если в 4 действии умные ходы сделать нельзя, человек делает ход в любую клетку.
// генерация случайного хода.
Fori := 0 to 2 do
begin
if table[i, 0] = 0 then
begin
table[i, 0] := 2;
exit;
end;
if table[i, 1] = 0 then
begin
table[i, 1] := 2;
exit;
end;
if table[i, 2] = 0 then
begin
table[i, 2] := 2;
end;
end;
Заключение
В данной работе я описал, как была создана моя первая игра. С ее помощью я расширил свои знания в языке программирования Pascal. Попробовал создать искусственный интеллект для компьютера. И данная программа стала стартом моим начинаниям в создании других компьютерных игр. Еще один вывод, который я сделал по окончанию работы, что для того чтобы компьютер что-либо сделал – его надо этому научить, т.е. создать искусственный интеллект. А когда компьютер выигрывает у моих друзей, я им «горжусь», потому что это моя победа.
Библиография
programKrestiki_noliki; // Игра крестики нолики.
usesCrt, MainLoop{Главная подпрограмма в этом модуле + ещё куча подпрограмм};
type
matrix = array[0..2, 0..2] of byte; // матрицаиз 3 элементов.
tset = setof 0..2; // множество чисел в диапазоне от 0 до 3.
var
table: matrix;
c_players: integer; // кол-воигроков
tab: tset;
procedureAbout; { Функция, сообщающая о создателях }
begin
WriteLn('Крестики-нолики v 2.0.Copyright (с) Джиджоев Владислав. 2011 год.');
end;
begin
repeat
cursoron; // показатькурсорвокне
ClrScr; // очистить экран
easy := false; // уровень = СЛОЖНЫЙ!!!
hasWinner := false; //победителей - НЕТ!!!
About; // показываем, кто здесь главный!!!
repeat
Write('Введите кол-во игроков(1, 2): '); ReadLn(c_players); // запрашиваем кол-во геймеров
until ((c_players = 0) or (c_players = 1) or (c_players = 2));
casec_players of
0: exit;
1: begin
Write('Выхотитеигратьвусложнённомрежиме(Y/N)? ');
ReadLn(answer);
answer := upCase(answer);
case answer of
'Y': easy := false;
else easy := true;
end
end
end;
if { началоигры } MainLoop.MainLoop(table, c_players, easy, tab) { конецигры } <> 0 then break;
until false; // Вечныйцикл.
WriteLn('Нажмителюбуюклавишудлявыхода. . .');
cursoroff; // вырубаемкурсор
ReadKey;
end.
unitMainLoop;
interface
type
matrix = array[0..2, 0..2] of byte;
tset = set of 0..3;
var
x, y, i, i2, Winner: integer;
easy, hasWinner: boolean;
answer: char;
functionMainLoop(table: matrix; c_players: integer; easy: boolean; tab: tset): byte;
implementation
usesCrt, computer;
procedureRefreshTab(var tab: tset; table: matrix);
begin
tab := [table[0, 0], table[1, 0], table[2, 0], table[0, 1], table[1, 1], table[2, 1], table[0, 2], table[1, 2], table[2, 2]];
end;
procedure Logic(table: matrix; varhasWinner: boolean; var Winner: integer; tab: tset);
var
i: integer;
begin
// Проверка первого игрока.
for i := 0 to 2 do
begin
if (table[i, 0] = 1) and (table[i, 1] = 1) and (table[i, 2] = 1) then
begin
hasWinner := true;
Winner := 1;
exit
end
end;
for i := 0 to 2 do
begin
if (table[0, i] = 1) and (table[1, i] = 1) and (table[2, i] = 1) then
begin
hasWinner := true;
Winner := 1;
exit
end
end;
if (table[0, 0] = 1) and (table[1, 1] = 1) and (table[2, 2] = 1) then
begin
hasWinner := true;
Winner := 1;
exit
end;
if (table[0, 2] = 1) and (table[1, 1] = 1) and (table[2, 0] = 1) then
begin
hasWinner := true;
Winner := 1;
exit
end;
// Проверка второго игрока.
fori := 0 to 2 do
begin
if (table[i, 0] = 2) and (table[i, 1] = 2) and (table[i, 2] = 2) then
begin
hasWinner := true;
Winner := 2;
exit
end
end;
for i := 0 to 2 do
begin
if (table[0, i] = 2) and (table[1, i] = 2) and (table[2, i] = 2) then
begin
hasWinner := true;
Winner := 2;
exit
end
end;
if (table[0, 0] = 2) and (table[1, 1] = 2) and (table[2, 2] = 2) then
begin
hasWinner := true;
Winner := 2;
exit
end;
if (table[0, 2] = 2) and (table[1, 1] = 2) and (table[2, 0] = 2) then
begin
hasWinner := true;
Winner := 2;
exit
end;
// проверканичьи
RefreshTab(tab, table);
if not (0 in tab) then
begin
hasWinner := true;
Winner := 0;
exit;
end;
end;
procedureDrawNet(table: matrix);
begin
WriteLn('+---+---+---+');
Write('| ');
case table[0, 0] of
0: Write(' | ');
1: Write('x | ');
2: Write('o | ');
end;
case table[1, 0] of
0: Write(' | ');
1: Write('x | ');
2: Write('o | ');
end;
case table[2, 0] of
0: WriteLn(' |');
1: WriteLn('x |');
2: WriteLn('o |');
end;
WriteLn('+---+---+---+');
Write('| ');
case table[0, 1] of
0: Write(' | ');
1: Write('x | ');
2: Write('o | ');
end;
case table[1, 1] of
0: Write(' | ');
1: Write('x | ');
2: Write('o | ');
end;
case table[2, 1] of
0: WriteLn(' |');
1: WriteLn('x |');
2: WriteLn('o |');
end;
WriteLn('+---+---+---+');
Write('| ');
case table[0, 2] of
0: Write(' | ');
1: Write('x | ');
2: Write('o | ');
end;
case table[1, 2] of
0: Write(' | ');
1: Write('x | ');
2: Write('o | ');
end;
case table[2, 2] of
0: WriteLn(' |');
1: WriteLn('x |');
2: WriteLn('o |');
end;
WriteLn('+---+---+---+');
end;
procedureDrawPlayers(c_players: integer; easy: boolean);
begin
Write('Первый игрок: Человек. Второйигрок: ');
if (c_players = 1) then
begin
Write('Компьютер.');
if (not easy) then
Write(' Включёнсложныйрежим.');
WriteLn;
end
else
WriteLn('Человек.');
end;
procedure About;
begin
WriteLn('Крестики-нолики v 2.0. Джиджоев Владислав(с). 2011 год.');
end;
procedureRefreshGameDisplay(table: matrix; c_players: integer; easy: boolean);
begin
ClrScr;
About;
WriteLn;
DrawPlayers(c_players, easy);
WriteLn;
DrawNet(table);
end;
functionMainLoop(table: matrix; c_players: integer; easy: boolean; tab: tset): byte;
begin
MainLoop := 0;
repeat
RefreshGameDisplay(table, c_players, easy);
Logic(table, hasWinner, Winner, tab);
ifhasWinner then
begin
Write('Выиграл ');
if (Winner = 1) and (c_players = 1) then
WriteLn('Человек.');
if (Winner = 1) and (c_players = 2) then
WriteLn('Игрок 1.');
if (Winner = 2) and (c_players = 1) then
WriteLn('компьютер.');
if (Winner = 2) and (c_players = 2) then
WriteLn('Игрок 2.');
if Winner = 0 then
begin
DelLine;
WriteLn('Ничья!');
end;
Write('Выйтиизигры(Y/N)? ');
ReadLn(answer);
upCase(answer);
if answer = 'Y' then
exit(1)
else
exit;
end;
Write('ХодИгрока');
ifc_players = 1 then
WriteLn('.')
else
WriteLn(' 1.');
WriteLn;
repeat
repeat
Write('Номерстолбика: ');
ReadLn(x);
until (x < 4) and (x > 0);
repeat
Write('Номерстроки: ');
ReadLn(y);
until (y < 4) and (y > 0);
if table[x - 1, y - 1] <> 0 then
begin
WriteLn('Ячейказанята.');
continue
end
else
break;
until false;
table[x - 1, y - 1] := 1;
RefreshGameDisplay(table, c_players, easy);
Logic(table, hasWinner, Winner, tab);
ifhasWinner then
begin
Write('Выиграл ');
if (Winner = 1) and (c_players = 1) then
WriteLn('Человек.');
if (Winner = 1) and (c_players = 2) then
WriteLn('Игрок 1.');
if (Winner = 2) and (c_players = 1) then
WriteLn('компьютер.');
if (Winner = 2) and (c_players = 2) then
WriteLn('Игрок 2.');
if Winner = 0 then
begin
DelLine;
WriteLn('Ничья!');
end;
Write('Выйтиизигры(Y/N)? ');
ReadLn(answer);
upCase(answer);
if answer = 'Y' then
exit(1)
else
exit;
end;
Write('Ход ');
ifc_players = 1 then
WriteLn('Компьютера.')
else
WriteLn('Игрока 2.');
WriteLn;
ifc_players = 2 then
begin
repeat
repeat
Write('Номерстолбика: ');
ReadLn(x);
until (x < 4) and (x > 0);
repeat
Write('Номерстроки: ');
ReadLn(y);
until (y < 4) and (y > 0);
if table[x - 1, y - 1] <> 0 then
begin
WriteLn('Ячейказанята.');
continue
end
else
break;
until false;
table[x - 1, y - 1] := 2;
end;
ifc_players = 1 then
begin
WriteLn('Компьютердумает...');
computer.computer(table, easy);
end;
until false; // Вечныйцикл.
end;
end.
unit computer;
interface
type
matrix = array[0..2, 0..2] of byte;
procedure computer(var table: matrix; easy: boolean);
implementation
procedure computer(var table: matrix; easy: boolean);
var
i: integer;
begin
if easy then
begin
// простойрежим
for i := 0 to 2 do
begin
if table[i, 0] = 0 then
begin
table[i, 0] := 2;
exit;
end;
if table[i, 1] = 0 then
begin
table[i, 1] := 2;
exit;
end;
if table[i, 2] = 0 then
begin
table[i, 2] := 2;
exit;
end;
end;
end
else
begin
// сложный режим
// проверка прямой победы компьютера
for i := 0 to 2 do
begin
if ((table[i, 0] = 2) and (table[i, 1] = 2)) or ((table[i, 0] = 2) and (table[i, 2] = 2)) or ((table[i, 1] = 2) and (table[i, 2] = 2)) then
begin
if table[i, 0] = 0 then
begin
table[i, 0] := 2;
exit;
end;
if table[i, 1] = 0 then
begin
table[i, 1] := 2;
exit;
end;
if table[i, 2] = 0 then
begin
table[i, 2] := 2;
exit;
end;
end;
end;
for i := 0 to 2 do
begin
if ((table[0, i] = 2) and (table[1, i] = 2)) or ((table[0, i] = 2) and (table[2, i] = 2)) or ((table[1, i] = 2) and (table[2, i] = 2)) then
begin
if table[0, i] = 0 then
begin
table[0, i] := 2;
exit;
end;
if table[1, i] = 0 then
begin
table[1, i] := 2;
exit;
end;
if table[2, i] = 0 then
begin
table[2, i] := 2;
exit;
end;
end;
end;
if ((table[0, 0] = 2) and (table[1, 1] = 2)) or ((table[0, 0] = 2) and (table[2, 2] = 2)) or ((table[1, 1] = 2) and (table[2, 2] = 2)) then
begin
if table[0, 0] = 0 then
begin
table[i, 0] := 2;
exit;
end;
if table[1, 1] = 0 then
begin
table[i, 1] := 2;
exit;
end;
if table[2, 2] = 0 then
begin
table[i, 2] := 2;
exit;
end;
end;
if ((table[2, 0] = 2) and (table[1, 1] = 2)) or ((table[2, 0] = 2) and (table[0, 2] = 2)) or ((table[1, 1] = 2) and (table[0, 2] = 2)) then
begin
if table[2, 0] = 0 then
begin
table[2, 0] := 2;
exit;
end;
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
if table[0, 2] = 0 then
begin
table[i, 2] := 2;
exit;
end;
end;
// проверка прямой победы человека
fori := 0 to 2 do
begin
if ((table[i, 0] = 1) and (table[i, 1] = 1)) or ((table[i, 0] = 1) and (table[i, 2] = 1)) or ((table[i, 1] = 1) and (table[i, 2] = 1)) then
begin
if table[i, 0] = 0 then
begin
table[i, 0] := 2;
exit;
end;
if table[i, 1] = 0 then
begin
table[i, 1] := 2;
exit;
end;
if table[i, 2] = 0 then
begin
table[i, 2] := 2;
exit;
end;
end;
end;
for i := 0 to 2 do
begin
if ((table[0, i] = 1) and (table[1, i] = 1)) or ((table[0, i] = 1) and (table[2, i] = 1)) or ((table[1, i] = 1) and (table[2, i] = 1)) then
begin
if table[0, i] = 0 then
begin
table[0, i] := 2;
exit;
end;
if table[1, i] = 0 then
begin
table[1, i] := 2;
exit;
end;
if table[2, i] = 0 then
begin
table[2, i] := 2;
exit;
end;
end;
end;
if ((table[0, 0] = 1) and (table[1, 1] = 1)) or ((table [0, 0] = 1) and (table[2, 2] = 1)) or ((table[1, 1] = 1) and (table[2, 2] = 1)) then
begin
if table[0, 0] = 0 then
begin
table[0, 0] := 2;
exit;
end;
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
if table[2, 2] = 0 then
begin
table[2, 2] := 2;
exit;
end;
end;
if ((table[2, 0] = 1) and (table[1, 1] = 1)) or ((table[2, 0] = 1) and (table[0, 1] = 1)) or ((table[1, 1] = 1) and (table[0, 2] = 1)) then
begin
if table[2, 0] = 0 then
begin
table[2, 0] := 2;
exit;
end;
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
if table[0, 2] = 0 then
begin
table[0, 2] := 2;
exit;
end;
end;
// проверка победы человека через ход.
if (table[0, 0] = 1) and (table[0, 2] = 1) then
begin
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
end;
if (table[0, 0] = 1) and (table[2, 0] = 1) then
begin
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
end;
if (table[0, 2] = 1) and (table[2, 2] = 1) then
begin
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
end;
if (table[2, 0] = 1) and (table[2, 2] = 1) then
begin
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
end;
if (table[2, 2] = 1) and (table[1, 1] = 1) then
begin
if table[0, 2] = 0 then
begin
table[0, 2] := 2;
exit;
end;
end;
// умныеходы
if table[1, 1] = 0 then
begin
table[1, 1] := 2;
exit;
end;
// генерация случайного хода.
for i := 0 to 2 do
begin
if table[i, 0] = 0 then
begin
table[i, 0] := 2;
exit;
end;
if table[i, 1] = 0 then
begin
table[i, 1] := 2;
exit;
end;
if table[i, 2] = 0 then
begin
table[i, 2] := 2;
end;
end;
end;
end;
end.
Щелкунчик
Голубая лягушка
Будьте как солнце!
Ласточка. Корейская народная сказка
Кто должен измениться?