Правила игры в крестики нолики. Как написать бота, которого будет нельзя обыграть в «крестики-нолики», или Знакомство с правилом «минимакс Как никогда не проигрывать в крестики нолики

В жизни бывают такие моменты, когда появляется свободное время, но абсолютно нечем себя занять. Если рядом с вами находится еще один скучающий человек, то вы вместе можете поиграть в простейшую игру, которая всем известна с детства - в крестики-нолики. У каждого человека на инстинктивном уровне заложено стремление к победе. «Как выигрывать в крестики-нолики?» - спросите вы. Это очень просто. Освоить несколько техник выигрыша вам поможет данная статья.

Итак, разберемся с правилами игры. Стандартный размер поля для крестиков-ноликов - 3х3. Суть игры состоит в том, чтобы поставить три своих крестика или нолика в один ряд по диагонали, вертикали или горизонтали. Ходы делаются игроками по очереди. По правде говоря, ответа на вопрос о том, как выигрывать в крестики-нолики, просто не существует. Ведь если оба игрока не будут допускать ошибок, то выиграть невозможно. В этой статье в основном будут рассмотрены те случаи, когда один из соперников совершает серьезный просчет. Этого вполне достаточно для того, чтобы довести игру до победного финала.

Сейчас мы рассмотрим несколько схем, которые помогут обыграть оппонента на поле размером 3х3. Итак, представим, что вы делаете первый ход. Советуем занять центральную клетку поля. Это даст вам существенное преимущество. В ответ на это ваш соперник может сделать два хода: поставить нолик (крестик) по диагонали от вашей фигуры или же прямо, по горизонтали или вертикали. Если оппонент выбрал второй вариант, то поздравляем! Теперь победа за вами! Следующим ходом можете поставить крестик (нолик) в любую свободную клетку поля, но только не симметрично фигуре противника относительно вашего первого хода. После этого сделайте так, чтобы в двух направлениях у вас стояло по две фигуры, и тогда соперник сможет помешать вам только в одном из них. Это одна из схем того, как выигрывать в крестики-нолики.

Отрабатывать ныне известную вам технику выигрыша можно не только на людях, но и в онлайн режиме. Это действительно очень удобно, ведь Интернет располагает широчайшим спектром приложений по мотивам игры в крестики-нолики. Вы можете выбрать не только достойный уровень сложности, но и уникальный дизайн поля и фигур, которым сможете наслаждаться столько, сколько угодно, а затем в любой момент можете прекратить игру, если она вам надоест. Советуем вам как можно чаще бесплатно играть в крестики-нолики в Интернете, если вы хотите побеждать соперников в реальности.

Как уже было сказано выше, размер поля в крестиках-ноликах может быть любым, но чаще всего используются 3х3, 4х4, 5х5. Чем больше размер поля, тем, соответственно, сложнее выиграть. В этом случае описанные выше схемы победы над оппонентом не работают, так как это уже другие крестики-нолики. 5 в ряд - это цель игры 5х5, и, чтобы выиграть, необходимо не просто знать некоторые стандартные позиции, но и уметь анализировать положение фигур на поле.

Итак, теперь вам известно, как выигрывать в крестики-нолики, поэтому любой соперник будет вам по плечу и не будет представлять для вас никакой угрозы! Желаем удачи в игре, хотя в данном случае она вам не понадобится: ведь вы знаете отличные схемы, которые непременно помогут вам победить!

Крестики-нолики – игра довольно бесхитростная. Небольшое количество клеток – их всего девять – приводит к ограниченному количеству ходов. Поэтому изучить эту игру математикам было достаточно просто. Поэтому классические крестики-нолики – игра решаемая, то есть существует единая стратегия, однозначно приводящая к выигрышу или ничьей. Как же одержать верх над противником?

Когда первый ход предоставляется вам

Если первым ходить должны вы, то, не мудрствуя лукаво, помещайте свою «фигуру» – пусть это будет крестик – в самом углу. Это способно обеспечить вам победу, если соперник не догадается поставить свой нолик на центральное поле. Если его нолик будет стоять в крайнем, но не угловом поле, то следует поместить второй крестик в другом углу, отстоящем от первого в вертикальном или горизонтальном направлении (но не соприкасающемся с этим ноликом). Сопернику придётся поставить свою фигуру между вашими крестиками, а вы спокойно ставите третий крестик в третьем углу. Тогда образуется сразу два выигрышных направления. Соперник не может поставить два нолика одновременно, следовательно, вы одерживаете победу.

Но что, если ваш партнёр нарисовал свой первый нолик в центре? Тогда выигрыша уже не получится, но можно привести игру к ничьей. Следующий крестик должен стоять в противоположном углу, чтобы получилась диагональная линия Х-О-Х. Если после этого соперник поместит свой нолик в одном из угловых полей, то вы победите – достаточно поставить третий крестик в оставшемся углу, образовав две выигрышные линии. Если же противник сделал ход в другую клетку, то это приведёт к ничьей – если, конечно, ошибку не допустите вы.

Также можно поставить второй крест в крайней, но не угловой клетке, которая не соприкасается с вашим первым крестом. Если противник сделает свой очередной ход в углу, то своим третьим крестиком вы должны заблокировать ему линию и создать выигрышную ситуацию. В противном случае исходом партии будет ничья.

Если вы играете вторым

Если первым ходит соперник и совершает безошибочные ходы, то единственная возможность – создать ничью. Из сказанного выше можно понять, что свой первый ход необходимо делать на центральное поле. Свой второй крестик нужно определить в боковую, но не угловую клетку, если нет необходимости блокировать линию сопернику. Придерживаясь этой стратегии, можно создать вожделенную ничью.

Если противник делает свой начальный ход в центре, то вы ставите свой крестик в угол. В дальнейшем нужно парировать угрозы противника, блокируя его выигрышные линии.

Игрок, ходящий вторым, может выиграть только в том случае, если соперник допускает оплошность.

Разновидности крестиков-ноликов

Считается, что крестики-нолики дали начало многим другим, более сложным и интересным настольным играм. Но и сама эта игра имеет усложнённые варианты.

К примеру, «объёмные» крестики-нолики. Такая игра присутствовала на старинной игровой приставке Atari 2600. Четыре плоскости размером 4 х 4 клетки располагаются одна под другой. Выигрышная ситуация из четырёх крестиков или ноликов может создаваться не только на одной плоскости, но и на всех четырёх, причём существует множество вариантов: например, каждый крестик или нолик имеет одну и ту же координату на каждой плоскости, и это считается выигрышем.

Гомоку, или рэндзю – японская игра, которая проводится на больших полях. На соревнованиях это поле 15 на 15 или 19 на 19 клеток, но есть варианты и на «бесконечном» поле. Ходы делаются не в клетки, а на пересечения линий; вместо крестиков и ноликов обычно используются шашки чёрного и белого цветов, однако суть игры всё та же. Выигрывает тот, кто поставит пять своих шашек в ряд.

Не потеряйте. Подпишитесь и получите ссылку на статью себе на почту.

Каждый из нас хотя бы раз в жизни играл в знаменитые крестики-нолики, пытаясь построить в ряд или по диагонали 3 крестика или 3 нолика на девятиклеточном поле. Если вы достаточно тренировались в этой игре, то, наверняка, знаете, что два опытных игрока всегда заканчивают партию вничью, и это делает игру для них неинтересной. В этой статье вы прочитаете о том, как выиграть в крестики-нолики или, по крайней мере, не проиграть, а также узнаете все хитрости и секреты прохождения этой популярной игры.

Немного о правилах. Цель игры выстроить на девятиклеточном поле подряд 3 одинаковых фигуры (3 крестика или 3 нолика) по горизонтали, по вертикали или по диагонали раньше, чем это сделает ваш партнер по игре. Игра в крестики-нолики начинается с хода игрока, который ставит крестик в любой клетке на игровом поле три на три (отметим сразу, что у него гораздо больше шансов выиграть, чем у противника). После этого второй игрок ставит в любой свободной ячейке нолик. Затем снова ходит крестик. Потом опять нолик. И так продолжается до тех пор, пока:

  1. Кто-то из игроков не построит в ряд или по диагонали 3 крестика или 3 нолика, и в результате чего будет признан победителем;
  2. Не останется свободных клеток, и на поле не будет присутствовать трех идущих подряд одинаковых фигур — в этом случае объявляется ничья.

Тактика крестиков

Первый ход крестиков. Самой выгодной позицией является середина игрового поля, или как отмечено на схеме клетка №5. Именно сюда следует вписывать вашу фигуру, если эта ячейка является свободной, и именно поэтому начинающие крестики всегда имеют преимущество. Через центральную ячейку вы можете построить наибольшее количество возможных вариантов выигрыша: две диагонали, одну горизонталь и одну вертикаль.

Второй ход крестиков. После того как вы сделали первый ход, поставив крестик по центру, вам остается ждать ход противника. В целом, у него есть всего 2 возможных варианта действий: поставить нолик в одной из «угловых» ячеек (№1, №3, №7 и №9) или поместить свою фигуру в ячейки №2, №4, №6 или №8. И следует сразу отметить, что от этого хода уже коренным образом зависит ваша возможность выиграть.

Если игрок выбирает одну из недиагональных ячеек №2, №4, №6 или №8, то у вас появляется беспроигрышная стратегия. Другими словами вы сможете победить с вероятностью 100%, если знаете, как верно действовать. Этот алгоритм описан в схеме ниже. В первую очередь вам нужно поставить крестик своим вторым ходом в угловую клетку, вынудив соперника защищаться. А после этого вы занимаете еще одну свободную угловую клетку, в результате чего вы имеете 2 ряда, где не хватает всего одного крестика (это показано на последнем поле схемы). Куда бы соперник ни поставил свой нолик, вы в любом случае побеждаете, имея запасную стратегию.

Если же ваш соперник своим первым ходом выбирает ячейки №1, №3, №7 и №9, тогда вы не имеете абсолютной выигрышной стратегии, и вам следует уповать лишь на дальнейшую невнимательность второго игрока, что в такой простой игре бывает достаточно редко.

Третий и последующие ходы крестиков. Дальнейшие ходы «крестиков» должны быть направлены на построение в ряд 3-х собственных фигур, а также на пресечение маловероятных, но все-таки возможных попыток «ноликов» поставить подряд 3 фигуры.

Также, «крестики» для того, чтобы выиграть могут начинать не только с центральной клетки, но и с угловой. Подробнее об этом .

Алгоритмы ходов ноликов

Если вам выпало играть ноликами, то в большинстве случаев вам предстоит бороться только за ничью. Однако у вас есть шансы победить, если вы играете с совсем неискушенным игроком.

Первый ход ноликов. Если игрок №1 почему-то не занял центральную клетку – смело ставьте туда нолик и действуйте дальше, опираясь на стратегию крестиков, описанную выше. Но, скорее всего, центральная ячейка к моменту вашего начального хода будет уже занята. В этом случае не совершайте непростительную ошибку и не ставьте нолик в ячейки №2, №4, №6 или №8, а выбирайте только диагональные ячейки №1, №3, №7 и №9.

Второй и последующие ходы. Дальнейшие ходы «ноликов» должны быть направлены на пресечение попыток «крестиков» поставить подряд 3 фигуры, а также при возможности, на построение в ряд 3-х ноликов, что является практически невозможным.

Все стратегии игры

На графике, представленном ниже, который можно найти в Википедии , приведены возможные стратегии побед и ничьих в игре крестики-нолики на поле в 9 клеток.

***

Надеюсь, эта статья стала для вас помощником в хитростях крестиков-ноликов, в том числе на деньги и на раздевание, и вы теперь знаете некоторые необходимые тактики и стратегии для того, чтобы выиграть (или, по меньшей мере, не проиграть) в эту замечательную игру. А если у вас есть комментарии, отзывы и предложения – оставляйте их ниже.

На свете существует целая масса интересных и забавных небольших настольных игр. И практически каждая из них имеет какой-то свой секрет, знание которого позволяет быть главным претендентом на победу. В данном случае речь пойдет о прекрасной игре крестики и нолики. Итак, как выиграть в крестики-нолики?

Как уже сказано выше, практически все подобные игры имеют свой секрет. В данном случае этот секрет состоит из умения предвидеть ситуацию и из умения создавать ситуацию. То есть, это как шахматы, только более упрощенный вариант. Так что перед тем, как выиграть в крестики-нолики, нужно научиться нескольким простым приемам.

В первую очередь стоит знать, что главный принцип победы состоит в том, чтобы создать две не до конца заполненные линии. При таком варианте следующий ход соперника будет абсолютно не важен (если, конечно, это не победный ход). Для создания такой благоприятной ситуации лучше всего занимать место в центре поля. Даже более того, по сути, другого способа, как выиграть в крестики-нолики, не существует. Если, конечно, соперник не полный профан (а бывает и такое).

Так вот, для победы крайне желательно походить первому и именно в центр. Если соперник поставил свою фигурку в любую из центральных линий - он автоматически поиграл. Главное в этом случае знать саму суть игры крестики и нолики. Так вот, если

уж соперник поступил столь неосмотрительным образом, свой крестик мы должны поставить в один из углов, причем так, чтобы он одновременно блокировал дальнейшее продвижение нолика. Далее ему не остается ничего другого, как становиться в оборонительную позицию (а делать это нужно было с самого первого хода). Ноль при любом раскладе становится в противоположный угол. Тогда наш крестик следует разместить опять-таки в углу. Что мы имеем? А имеем мы сразу две линии по два крестика. Значит, следующие действия соперника нам абсолютно не важны. При любом его ходе побеждаем мы.

В том случае, если опять-таки ходим первыми мы и ставим свою фигуру в центр, а соперник ставит свою фигуру в угол - то шансы на победу значительно уменьшаются. По сути, существует лишь один возможный вариант, который не даст этой партии свестись к ничьей. Когда соперник ответил на наш ход своим ноликом в углу, необходимо поставить крестик в противоположной стороне. У соперника остаются три возможных хода. Если он опять-таки ставит свою фигуру в угол - это ничья. Если же он выбирает центральные линии - это проигрыш. Как при одном его ходе, так и при другом, все становится очевидным, и уж тут объяснять, как выиграть в крестики-нолики, не нужно.

Что же касается того, когда соперник начинает матч - то при этом происходит практически все то же самое, только с обратной точностью. Ежели его фигура поставлена в центре - нужно становиться в оборонительную позицию и потихоньку забывать, как выиграть в крестики-нолики, ведь здесь единственный возможный вариант - это ничья.

А если его фигура поставлена с первого хода в любую из восьми клеток помимо центральной - то занимать нужно именно этот центр, а там уже действовать по сложившимся обстоятельствам.

Как написать бота, которого будет нельзя обыграть в «крестики-нолики», или Знакомство с правилом «минимакс»

Вполне возможно, что после сотен партий в «крестики-нолики» вы задумывались: каков же оптимальный алгоритм? Но если вы здесь, то вы наверняка ещё и пробовали написать реализацию этой игры. Мы пойдём дальше и напишем бота, который будет невозможно обыграть в «крестики-нолики». Предугадав ваш вопрос «почему?», ответим: благодаря алгоритму .

Как и профессиональный шахматист, этот алгоритм просчитывает действия соперника на несколько ходов вперёд - до тех пор, пока не достигнет конца партии, будь то победа, поражение или ничья. Попав в это конечное состояние, ИИ начислит себе положительное количество очков (в нашем случае +10) за победу, отрицательное (-10) - за поражение, и нейтральное (0) - за ничью.

В то же время алгоритм проводит аналогичные расчёты для ходов игрока. Он будет выбирать ход с наиболее высоким баллом, если ходит ИИ, и ход с наименьшим, если ходит игрок. Используя такую стратегию, минимакс избегает поражения.

Попробуйте сыграть вот в такую игру.

Алгоритм «минимакс» проще всего описать в виде рекурсивной функции, которая:

  1. возвращает значение, если найдено конечное состояние (+10, 0, -10),
  2. проходит по всем пустым клеткам на поле,
  3. вызывает минимакс-функцию для каждой из них (рекурсия),
  4. оценивает полученные значения
  5. и возвращает наилучшее из них.

Если вы не знакомы с рекурсией, то вам стоит посмотреть эту лекцию из гарвардского курса CS50:

Чтобы разобраться в том, как устроен минимакс, давайте напишем его реализацию и смоделируем его поведение. Займёмся этим в двух следующих разделах.

Реализация минимакса

Мы рассмотрим ситуацию, когда игра подходит к концу (смотрите картинку ниже). Поскольку минимакс проходит по всем возможным состояниям игры (а их сотни тысяч), имеет смысл рассматривать эндшпиль - так нам придётся отслеживать меньшее количество рекурсивных вызовов функции (всего 9).

Пусть ИИ играет крестиками, человек - ноликами.

Чтобы упростить работу с полем, объявим его как массив из 9 элементов со значениями, равными содержимому клеток. Заполним его крестиками и ноликами, как на картинке выше, и назовём origBoard .

Var origBoard = ["O",1,"X","X",4,"X",6,"O","O"];

Затем объявим переменные aiPlayer и huPlayer и присвоим им значения "X" и "O" соответственно.

Кроме того, нам потребуется функция, которая ищет победные комбинации и возвращает истинное значение в случае успешного поиска, и функция, которая хранит индексы доступных клеток.

/* начальное состояние доски O | | X --------- X | | X --------- | O | O */ var origBoard = [“O”,1 ,”X”,”X”,4 ,”X”, 6 ,”O”,”O”]; // человек var huPlayer = “O”; // ИИ var aiPlayer = “X”; // возвращает список индексов пустых клеток доски function emptyIndices(board){ return board.filter(s => s != "O" && s != "X"); } // победные комбинации с учётом индексов function winning(board, player){ if((board == player && board == player && board == player) || (board == player && board == player && board == player) || (board == player && board == player && board == player) || (board == player && board == player && board == player) || (board == player && board == player && board == player) || (board == player && board == player && board == player) || (board == player && board == player && board == player) || (board == player && board == player && board == player)) { return true; } else { return false; } }

Итак, давайте определим минимакс-функцию с двумя аргументами: newBoard (новое поле) и player (игрок). Затем найдём индексы свободных клеток на поле и передадим их в переменную availSpots .

// основная минимакс-функция function minimax(newBoard, player){ //доступные клетки var availSpots = emptyIndices(newBoard);

Кроме того, нам нужно отслеживать конечные состояния и возвращать соответствующие значения. Если побеждает «нолик», нужно вернуть -10 , если «крестик» - +10 . Если размер массива availSpots равен нулю, значит, свободных клеток нет, игра закончится ничьёй, и нужно вернуть ноль.

// проверка на терминальное состояние (победа / поражение / ничья) //and returning a value accordingly if (winning(newBoard, huPlayer)){ return {score:-10}; } else if (winning(newBoard, aiPlayer)){ return {score:10}; } else if (availSpots.length === 0){ return {score:0}; }

После этого нужно собрать очки с каждой из пустых клеток. Для этого создадим массив ходов moves и пройдём в цикле по всем пустым клеткам, помещая индексы и очки каждого хода в объект move .

Затем зададим индекс пустой клетки, который хранился в виде числа в origBoard , равным свойству-индексу объекта move . Потом сходим за текущего игрока на пустую клетку нового поля newBoard и вызовем функцию minimax от другого игрока и получившегося поля newBoard . После этого нужно поместить свойство score объекта, возвращённого функцией minimax , в свойство score объекта move .

Если минимакс не находит конечное состояние, он продолжает рекурсивное углубление в ход игры до тех пор, пока не достигнет терминального состояния. После этого он передаёт очки этого «уровня» рекурсии на один уровень выше.

И наконец, функция сбрасывает изменения newBoard и помещает объект move в массив moves .

// массив для хранения всех объектов var moves = ; // цикл по доступным клеткам for (var i = 0; i < availSpots.length; i++){ //create an object for each and store the index of that spot var move = {}; move.index = newBoard]; // совершить ход за текущего игрока newBoard] = player; //получить очки, заработанные после вызова минимакса от противника текущего игрока if (player == aiPlayer){ var result = minimax(newBoard, huPlayer); move.score = result.score; } else{ var result = minimax(newBoard, aiPlayer); move.score = result.score; } // очистить клетку newBoard] = move.index; // положить объект в массив moves.push(move); }

Затем минимаксу нужно выбрать наилучший ход move из массива moves . Ему нужен move с наибольшим счётом, если ходит ИИ, и с наименьшим, если это ход человека. Таким образом, если значение player равно aiPlayer , алгоритм инициализирует переменную bestScore очень маленьким числом и идёт циклом по массиву moves: если ход move приносит больше очков score , чем bestScore , алгоритм запоминает этот move . В случае ходов с одинаковыми очками алгоритм запоминает первый из них.

В случае, когда player равен huPlayer , всё аналогично - только теперь bestScore инициализируется большим числом, а минимакс ищет ход move с наименьшим количеством очков.

В итоге минимакс возвращает объект, хранящийся в bestMove .

// если это ход ИИ, пройти циклом по ходам и выбрать ход с наибольшим количеством очков var bestMove; if(player === aiPlayer){ var bestScore = -10000; for(var i = 0; i < moves.length; i++){ if(moves[i].score > bestScore){ bestScore = moves[i].score; bestMove = i; } } }else{ // иначе пройти циклом по ходам и выбрать ход с наименьшим количеством очков var bestScore = 10000; for(var i = 0; i < moves.length; i++){ if(moves[i].score < bestScore){ bestScore = moves[i].score; bestMove = i; } } } // вернуть выбранный ход (объект) из массива ходов return moves; }

В следующем разделе мы смоделируем работу нашей программы, чтобы понять, как она работает.

Минимакс в действии

Пользуясь схемой ниже, разберем пошаговую модель алгоритма.

Примечание : На схеме большие числа обозначают порядковый номер вызова функции, а уровни - то, на сколько ходов вперёд прошёл алгоритм.

  1. Алгоритму подаются origBoard и aiPlayer . Он составляет список из трёх найденных пустых клеток, проверяет конечность состояния, и проходит циклом по всем пустым клеткам. Затем алгоритм меняет newBoard , помещая aiPlayer в первую пустую клетку. После этого он вызывает сам себя от newBoard и huPlayer и ждёт, пока второй вызов вернёт значение.
  2. Пока первый вызов функции всё ещё работает, запускается второй, создавая список из двух пустых клеток, проверяя конечность состояния и проходя циклом по всем пустым клеткам. Затем второй вызов изменяет newBoard , помещая huPlayer в первую пустую клетку. После этого он вызывает сам себя от newBoard и aiPlayer и ждёт, пока третий вызов вернёт значение.

  3. Поскольку второй вызов обнаружил две пустые клетки, минимакс изменяет newBoard , помещая huPlayer во вторую свободную клетку. Затем он вызывает сам себя от newBoard и aiPlayer .

  4. Алгоритм составляет список пустых клеток и фиксирует победу игрока после проверки конечности состояния. Поэтому он возвращает объект с полем счёта, равным (-10).

    Во втором вызове функции алгоритм получает значения, возвращённые с нижнего уровня третьим и четвёртым вызовами функции. Поскольку ход huPlayer принёс эти два результата, алгоритм выбирает наименьший из них. Так как они одинаковы, алгоритм выбирает первый и передаёт его первому вызову функции.

    На этот момент первый вызов функции получил оценку хода aiPlayer в первую пустую клетку. Затем он изменяет newBoard , помещая aiPlayer во вторую пустую клетку. После этого он вызывает сам себя от newBoard и huPlayer .

  5. В пятом вызове функции алгоритм составляет список пустых клеток и фиксирует победу ИИ после проверки конечности состояния. Поэтому он возвращает объект с полем счёта, равным +10.

    После этого первый вызов изменяет newBoard , помещая aiPlayer в третью пустую клетку. Затем он вызывает сам себя от newBoard и huPlayer .

  6. Шестой вызов составляет список из двух пустых клеток, проверяет конечность состояния и идёт циклом по всем пустым клеткам. Затем он изменяет newBoard , помещая huPlayer в первую пустую клетку. Потом он вызывает сам себя от newBoard и aiPlayer и ждёт, пока седьмой вызов вернёт значение.
  7. Новый вызов составляет список из одной пустой клетки, проверяет конечность состояния и изменяет newBoard , помещая aiPlayer в пустую клетку. После этого он вызывает сам себя от newBoard и huPlayer и ждёт, пока этот вызов вернёт значение.
  8. Восьмой вызов составляет пустой список пустых клеток и фиксирует победу aiPlayer после проверки конечности состояния. Поэтому он возвращает объект с полем счёта, равным (+10), на уровень выше, седьмому вызову.

    Седьмой вызов получил лишь одно, положительное значение от нижних уровней. Поскольку это значение было получено в ход aiPlayer , алгоритм возвращает наибольшее из полученных значений. Поэтому он возвращает положительное значение (+10) на уровень выше, шестому вызову.

    Поскольку шестой вызов обнаружил две пустых клетки, минимакс изменяет newBoard , помещая huPlayer во вторую пустую клетку. Затем он вызывает сам себя от newBoard и aiPlayer .

  9. После этого алгоритм составляет список пустых клеток и фиксирует победу aiPlayer после проверки конечности состояния. Поэтому он возвращает объект с полем счёта, равным (+10), на уровень выше.

    На этом этапе шестой вызов должен выбрать между счётом (+10), который вернул седьмой вызов, и счётом (-10), который вернул девятый вызов. Поскольку ход huPlayer принёс эти два результата, алгоритм выбирает наименьший из них и возвращает его на уровень выше в виде объекта с полями счёта и индекса.

    Наконец, все три ветви первого вызова оцениваются (-10, +10, -10). Поскольку ход aiPlayer принёс эти три результата, алгоритм выбирает объект, содержащий наибольшее количество очков (+10) и его индекс (4).

В рассмотренном выше сценарии минимакс решает, что оптимальным выбором будет ход в центральную клетку поля.

Конец!

К этому моменту вы должны были понять, как устроен алгоритм минимакс. Попробуйте написать его реализацию самостоятельно или посмотрите пример на GitHub или CodePen и оптимизируйте его.

Если вас заинтересовала тема ИИ в играх, советуем почитать наши материалы по этой теме.

Просмотров