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

Здравствуйте, читатели моего блога, сегодня я расскажу вам о том, как выиграть в крестики нолики.

Замечательная игра, которая не требует много подготовки, нашли ручку или карандаш, листик и напарника.

На самом деле, игра простая и, одновременно, сложная. Многие подходят к ней не серьезно, поэтому проигрывают. Скажу честно, я сам не понимал, как можно в нее играть, но затем, проанализировал все возможные ходы и понял, что здесь все упирается в математику.

Почему данная игра, очень простая? Все дело в том, что здесь всего 9 клеток, то есть у вас есть 1 из 9 начальных вариантов, а затем это количество уменьшается на 1. То есть, если вы сделали свой ход, то у вашего противника уже появляется не 9 вариантов, а всего лишь 8, потому, что 1 клетка уже занята.

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

Как выигрывать в крестики нолики

Основные понятия, которые нужно знать:

Поле – условное поле 3×3 клетки, где и происходит битва.

Крестики – вот такие значки «х», они ходят первые.

Нолики – вот такие значки «0», они ходят вторые.

Победа – когда игрок собирает подряд 3 крестика или 3 нолика.

Вот пример поля.

Для того, чтобы вы могли правильно анализировать давайте пронумеруем каждую клетку.

Вот хотя бы так, чтобы вы понимали, где какое поле.

Стратегия выигрыша в 3×3

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

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

Начнемс…

Самая лучшая стратегия. Крестики делают ход на 5 клетку, которая находится в середине.

Дальше, ЗАПОМНИТЕ, что если нолики делают свой второй ход не на ДИАГОНАЛЬНУЮ КЛЕТКУ, то они проигрывают. Не важно, на какую клетку, они делают ход: 2, 4, 6, 8, если они поставили нолик на любое из этих полей, то они форсировано проигрывают.

Для примера, вы поставили на 5, они поставили на 2, теперь вы ставите на 1 или 3, угрожая сделать 3 крестика по диагонали. Ну, ок, вы поставили на 1, получается, что если вы поставите на поле 9 крестик, то вы выиграете. Вы вынуждаете поставить нолик на поле 9, но теперь вы изысканно побеждаете, ставя крестик на поле 7.

Получается, что вы угрожаете поставить три крестика по диагонали ходом 3 и по вертикали ходом – 4. Красота, не правда ли?

Лучшая защита за нолики – это, после ходя 5 за крестики, делать ходы: 1, 3, 7, 9, в таком случае, вы, при внимательности, всегда будете делать ничью. Запомните это простое правило и вы никогда не проиграете.

Хитрая стратегия за крестики

Но, ведь игрок, вовсе, не обязан делать первый ход в середину, то есть на клетку – 5. Тут, есть весьма крутая ловушка, вы делаете первый ход на угловое поле.

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

Если, к примеру, крестики делают ход на клетку – 1, то ошибкой будет делать ход – 4 и 9, в этих случаях, форсировано выигрывают крестики.

Давайте разберем эти варианты:

А) Крестики – 1, нолики – 4, крестики – 5, нолики – 9 (вынуждено), крестики – 3 с выигрышем на поля 2 или 7 в зависимости от ответа ноликов.

В) Крестики – 1, нолики – 9, крестики – 3, нолики – 2 (вынуждено), крестики – 7 с выигрышем на поля 4 или 5 в зависимости от ответа ноликов.

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

Я желаю вам побед, если я что-то забыл написать, то напомните мне, можно даже в комментарии.

Всем удачи, пока!

С уважением, Юрий Ваценко!

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

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

Как и профессиональный шахматист, этот алгоритм просчитывает действия соперника на несколько ходов вперёд - до тех пор, пока не достигнет конца партии, будь то победа, поражение или ничья. Попав в это конечное состояние, ИИ начислит себе положительное количество очков (в нашем случае +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 и оптимизируйте его.

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

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

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

Сейчас игры детства приобрели "мобильный" характер и доступны онлайн. Но правила игры и стратегия победы остались прежними. Освоив простой алгоритм из этой заметки, вы легко сможете выиграть крестики нолики у зои, победить 5 в ряд в мета школе и никогда не проиграете живому человеку.

Крестики-нолики, правила игры

Игровое поле представляет собой квадрат размером 3х3 нарисованный на листке бумаги и расчерченный на девять клеток. Две линии проводятся вдоль квадрата, две линии поперек.

Варианты, когда игровое поле имеет размеры от 4 х 4 до бесконечности, рассмотрим ниже, после разбора комбинаций игры в поле 3х3.

Базовые принципы общие, и освоив алгоритм "три в ряд", вы сможете уверенно играть в более сложные и интересные варианты этой древней игры.

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

Игроки по очереди меняются, кому играть за крестиков и ноликов.

Древние китайцы вместо рисованных символов "Х" и "0" на поле ставили камни, черные и белые. Сейчас дома в качестве поля можно использовать шахматную доску и шашками обозначать клетку, на которую сделан ход.

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

Стратегия победы пошагово видеоразбор

Небольшой видео ролик, для тех, кому так проще воспринимать информацию. Кому интереснее читать, листаем дальше.

    Возможны два варианта исхода игры:

  1. Вы победили.
  2. Ничья. Закончились пустые клетки на игровом поле и ходить больше некуда.

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

Для удобства рассказа, я каждый квадрат игрового поля обозначил цифрами, от 1 до 9.

(5) - центральная клетка.

(1), (3), (7), (9) - угловые клетки.

(2), (4), (6), (8) - боковые клетки.

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

Ситуация №1, крестики ходят в центр

Когда крестики первым ходом занимают центральную клетку (5), ноликам остается ходить в угловую клетку или в боковую.

На этом ходу уже все решается. Сходили нолики в угловую клетку - это ничья. Если нолики сходили в любую боковую клетку - вы победили. Можно начинать новую партию, эта игра дальше не имеет смысла.

В нашем примере нолики сходили в боковую клетку (8).

Крестики ответным ходом занимают любую угловую клетку, для примера клетку (1) и получают линию из двух крестиков (см. рисунок).

Главная премудрость игры и основа всей тактики держится на двух принципах:

Принцип 1. Занимай ту клетку, которая принесет тебе немедленную победу;

Принцип 2. Если такой клетки нет, занимай клетку, которая принесет немедленную победу сопернику.

Нолики сейчас своим ходом выиграть не могут и по второму принципу занимают клетку (9), в свою очередь образуя линию из двух ноликов, см. шаг 4.

Крестики занимая клетку (7) нейтрализуют угрозу со стороны ноликов и одновременно с этим строят две линии из своих фигур. Для победы в следующем ходе крестикам нужно будет занять клетку (3) или (4). См. шаг 5.

Такое построение, когда одним ходом создается две угрозы, называется ВИЛКА.

Нолики в шестом шаге заняв клетку (3) закрывают одну угрозу со стороны крестиков.

Крестики по принципу 1, ходят в клетку (4) и одерживают победу.

Ситуация №2, крестики ходят в центр

Предположим, что теперь вы играете ноликами. Чтоб не проиграть эту встречу, первым ходом нужно занять угловую клетку. Без разницы какую, на ваш вкус (1), (3), (7) или (9). Для примера возьмем (1), см. рисунок ниже, шаг 2.

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

Нолики закрывают линию крестиков, и создают свою угрозу - см. шаг 4.

Крестики по принципу 2 ходят в квадрат (4), нолики отвечают в квадрат (6). См. шаг 5 и 6.

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

Вилку крестикам при таком начале игры построить не получится, но и ноликам не дадут. Если по невнимательности, после 6-го шага, нолики сходят в угловую клетку (9) вместо боковой (2) или (8), то крестики одержат победу построив горизонтальную линию (2)-(5)-(8).

Ситуация №3, крестики ходят в угол

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

Ход ноликов, как и в ситуации №1, от этого хода зависит исход игры. Если нолики сходили в боковую клетку, то вы построите вилку и победите.

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

В случае хода ноликами на боковую клетку, шаг 2, вы занимаете еще одну угловую клетку, образуя угрозу - линию из двух фигур. См. шаг 3.

Центр, клетку (5) умышленно оставим пустой для ноликов. Часто, нолики вместо того, чтоб закрыть вашу угрозу ходом в боковую клетку (2), радостно занимают центр.

Если противник попался на уловку и сходил в клетку (5), мы занимаем клетку (2) и линия построена (1)-(2)-(3)

Не будем недооценивать соперника, и он в шаге 4 закрыл нашу угрозу ходом на боковую клетку (2)

Крестикам ничего не остается, как по первому принципу занять центральную клетку (5) и построить вилку.

Теперь, см. шаг 6, куда бы нолик не ткнулся, у нас останется свободной одна из двух угловых клеток (7) или (9), ход в которую и принесет нам победу.

Ситуация №4, крестики ходят на боковую клетку

Ход сам по себе в плане будущей победы не оправдан. Варианты исходов - ничья, или проигрыш по невнимательности.

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

Рендзю, жемчужная нить, гомоку, пять в ряд

Когда вам стало тесно и скучно в игровом поле 3х3, и играть три в ряд уже не спортивно, переходим на большую игровую площадь.

Рендзю - настояльная логическая игра для двух игроков, была известна еще в древнем Китае и Японии. Спортивный вариант классических крестиков-ноликов.

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

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

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

По правилам, первый ход делают черные и им запрещено делать вилки 3х3, 4х4, а так же ряд из 6 и более "камней" своего цвета подряд.

Зато черные могут делать вилки размером 3х4, когда за один ход образуются две перекрещивающиеся линии - одна длиной три камня, вторая из 4 камней. Так что нет повода расслабляться у того, кто играет белыми.

    Белые, за то, что ходят вторыми - имеют следующие преимущества:

  • Могут строить вилки любого размера и любой кратности;
  • Победу белым приносит линия не только 5 в ряд, но и из большего числа камней;
  • Для своей победы белые могут вынудить построить черных линию из 6 и более камней подряд.

Ничья

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

Если оба игрока подряд отказались от хода, объявляется ничья.

Закончились все свободные клетки - ничья.

Получается, игрок еще может пропустить ход, потому что ему некуда ходить.

Гомоку, отличия от рендзю

  1. Для черных отсутсвуют фолы (запрещенные ходы), и черные могут строить вилки любой кратности и длины.
  2. Ряд из шести и более камней одного цвета не приносит победы ни одной из сторон.

Гомоку имеют более мягкие правила, для удобства игры в обычной жизни. Правила рендзю ориентированы на спортивные состязания.

Сервисы, где можно играть онлайн

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

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

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

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

С вами был Александр Утышев

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

Алгоритм победы

Для того чтобы научиться выигрывать или, по крайней мере, не проигрывать в крестики - нолики, нужно запастись вниманием и… терпением. При отсутствии ошибок с той или иной стороны игра будет заканчиваться ничьей бесконечно. Главный принцип, определяющий, как выиграть в крестики - нолики, заключается в создании ситуации, при которой после любого хода противника игрок заполнит одну из двух линий, то есть поставит три крестика или три нолика подряд. Пример такой ситуации показан на схеме №1.

Х О О
Х
Х

Схема №1 (При любом ходе нолика крестики выигрывают).

Порядок действий

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

О
Х
Х

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

О
! !
! !

Схема №3 (Занятие крестиком помеченных клеток ведет к проигрышу)

Поняв тактику, можно попробовать играть в вариант крестиков ноликов 5х5 на бесконечном поле. Для этого необходимы только тетрадный лист в клетку и ручка. Задача игры – выстроить линию из 5 фигур. Тактика крестиков будет заключаться в построении вилок, а нолики будут вынуждены блокировать атаки, то есть пресекать линии из 3 крестиков и блокировать вилки.

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

Для начала хочу определиться с основными моментами. Во-первых, существует множество разновидностей игры гомоку, я остановился на таком варианте: игровое поле 15х15, крестики ходят первыми, выигрывает тот, кто первый построит 5 в ряд. Во-вторых, игровой алгоритм расчета хода компьютером для простоты буду называть AI.

Спасибо за внимание. Надеюсь, вам было также приятно читать и играть, как мне - реализовывать:)

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

Update 1
1. На 10% увеличил значимость весов для атаки. Теперь атака для AI предпочтительнее защиты при прочих равных. Например, если 4ка у AI и у пользователя, то AI предпочтет выиграть.

2. Изменил значения весов по шаблонам. При более четкой балансировки весов можно добиться лучшей игры AI.
Значения весов у шаблонов сейчас такие:
99999 - xxxxx - пять в ряд (финальная выигрышная линия)
7000 - _xxxx_ - открытая четверка
4000 - _xxxx - полузакрытая четверка (две таких четверки предпочтительнее одной открытой, возможно «интереснее игра» будет)
2000 - _x_xxx, _xx_xx, _xxx_x - полузакрытая четверка с брешью (2 таких четверки равны одной открытой четверке и «предпочтительнее» открытой тройки; но если только 1 такая четверка, то открытая тройка предпочтительнее)
3000 - _xxx_ - открытая тройка
1500 - _xxx - полузакрытая тройка
800 - _xx_x, _x_xx - полузакрытая тройка с брешью
200 - _xx_ открытая двойка
Также небольшие веса (от 1 до 20-30) есть вокруг всех ходов, для создания «небольшой случайности хода».

Статьи по теме: