Nickolay.info. Javascript. Пример играющего шахматного скрипта на Javascript
В этой заметке можно поиграть в простенькие шахматы на Javascript, а также скачать себе исходники скрипта.
Игра в шахматы с компьютером онлайн бесплатно без регистрации
компьютер играет белыми компьютер играет черными
Превращать пешки в
Для игры в бесплатные шахматы с компьютером в Вашем браузере должна быть включена поддержка JavaScript.
Для выполнения хода Вам необходимо сделать два клика мышкой: после первого клика мышкой по фигуре на шахматном поле это поле выделяется цветом, после второго клика на другом поле фигура перемещается на это указанное поле. Если Вы передумали ходить выделенной фигурой после щелчка по ней, щёлкните ещё раз по той же фигуре для отмены.
В данной игре на JavaScript реализован простой шахматный алгоритм.
По умолчанию компьютер будет играть черными (установлен флажок «компьютер играет черными»), поэтому можете смело сделать первый ход белыми: e2-e4. Лог игры (запись проведенных игроками ходов) появится на экране под словами Лог игры.
Если Вы захотите сыграть партию с другом, тогда вам следует снять оба флажка и начнется партия для двух человек, компьютер не будет вмешиваться в игровой процесс.
Если Вы хотите понаблюдать за игрой компьютер-компьютер, то следует включить оба флажка.
Чтобы сыграть повторно, обновите эту страницу.
Правила игры в шахматы можно быстро изучить здесь.
Есть и ещё более «крутые» реализации, например, в исходнике страницы по следующей ссылке можно увидеть шахматную программу на Javascript размером. в 1 килобайт! Правда, играет она очень слабо и «забывает» о некоторых правилах, вроде рокировки:
Скачать исходник простых шахмат на Javascript в архиве ZIP (39 Кб)
. с условием, что данный AI будет играть получше, чем вот это, хотя насчёт этого не уверен 🙂
1. Генерация ходов и отрисовка доски
Эти рутинные задачи способны съесть значительную часть времени разработки.
Сами картинки с шахматными фигурами легко найти где угодно.
Для работы понадобится также общепринятая сегодня Javascript-библиотека JQuery, можно скачать и её, но мы просто подключим её извне.
В программе нам останется сделать что-то вроде:
Таким образом, рутина выполнена, а предстоит лишь реализовать алгоритм выбора лучшего хода из тех, что предложит библиотека.
Начнём с функции, которая выберет случайный ход из всех возможных, она не слишком интеллектуальна, но отправной точкой может служить, своего рода Monkey Chess:
Попробуем вычислить, какая из сторон сильнее в некоторой заданной позиции. Для этого нам понадобится таблица относительной силы фигур. Существуют разные версии этих таблиц, мы остановимся на следующей:
Теперь имеет смысл изменить метод calculateBestMove так, чтобы он выбирал ход с наивысшей (или с «наинизшей», если для чёрных) оценкой:
Предполагается, что метод evaluateBoard возвращает оценку переданной ему позиции, а остальные методы уже есть в подключённых библиотеках.
3. Дерево поиска и минимакс
Оценка позиции зависит не только от того, что сейчас на доске, но и от того, каких преимуществ можно добиться ближайшими ходами или каких опасностей нужно ими избежать.
Для пошаговых игр с нулевой суммой, к которым относятся и шахматы, изобретать велосипед не нужно, ведь давно придуман алгоритм минимакс. Его суть в том, что рекурсивное дерево всех возможных ходов игры исследуется до заданной глубины, а позиция оценивается на «листьях» этого дерева.
После этого функция возвращает либо наименьшее, либо наибольшее значение потомка в родительский узел, в зависимости от того, чей просчитывается ход, то есть, мы стараемся минимизировать или максимизировать результат на каждом уровне.
Для простых игр, вроде крестиков-ноликов, существует полное дерево игры, следовательно, можно реализовать «непобедимый» алгоритм, для шахмат построение такого дерева нереально, но с небольшой глубиной расчета depth в 2-3 хода Javascript вполне справится:
Эффективность минимакса в значительной степени зависит от достижимой глубины поиска, но с её увеличением количество оцениваемых позиций растёт слишком быстро.
Именно эту проблему предстоит решать любому шахматному программисту на следующем шаге.
4. Альфа-бета отсечение
Так называется метод оптимизации алгоритма «Минимакс», позволяющий игнорировать некоторые «бесперспективные» ветви в дереве поиска. Это даёт возможность на тех же самых вычислительных ресурсах повысить глубину оценивания для «перспективных» вариантов и не оценивать варианты бессмысленные.
Альфа-бета отсечение основано на том соображении, что мы можем перестать оценивать часть дерева поиска, если найдем шаг, который приводит к худшей ситуации чем та, к которой приводил ранее обнаруженный шаг.
Конечно, «красивым жертвам» это отсечение наш алгоритм не научит, но глубже просчитать форсированный выигрыш поможет.
Алгоритм будет более эффективен, если мы сначала проверим те пути, которые ведут к «хорошим» ходам, то есть, имеющим лучшую оценку за текущий цвет. Отсечение может существенно улучшить работу минимакса.
5. Улучшение функции оценки
Первоначальная функция оценки позиции очень примитивна, она просто подсчитывает суммарный вес материала на доске. Чтобы улучшить оценку, нужно учесть положение фигур. Например, конь сильнее в центре доски, чем на её краю, а слон в углу контролирует меньше полей, чем на другом поле.
Применив это улучшение, мы получаем код, который играет в шахматы уже чуть сильнее условной «обезьяны», по крайней мере, зевать в один ход не должен. Хотя стратегического видения ситуации, разумеется, алгоритму недостаёт.
Внимательный анализ файла js/script.js из прилагаемого листинга поможет вам понять детали, а нам остаётся написать служебные методы для настройки параметров игры и разметку HTML, которая всё подключит и запустит (файл index.html ):
Данная статья является вольным переводом и дополнением вот этого первоисточника, там можно почитать несколько меньший текст на английском и посмотреть больше картинок 🙂
В этой заметке можно поиграть в простенькие шахматы на Javascript, а также скачать себе исходники скрипта (загрузка игры онлайн происходит с другого сайта!)
Игра в шахматы с компьютером онлайн бесплатно без регистрации
компьютер играет белыми компьютер играет черными
Превращать пешки в
Для игры в бесплатные шахматы с компьютером в Вашем браузере должна быть включена поддержка JavaScript.
Для выполнения хода Вам необходимо сделать два клика мышкой: после первого клика мышкой по фигуре на шахматном поле это поле выделяется цветом, после второго клика на другом поле фигура перемещается на это указанное поле.
В данной игре на JavaScript реализован простой шахматный алгоритм.
По умолчанию компьютер будет играть черными (установлен флажок «компьютер играет черными»), поэтому можете смело сделать первый ход белыми: e2-e4. Лог игры (запись проведенных игроками ходов) появится на экране под словами Лог игры.
Если вы захотите сыграть партию с другом, тогда вам следует снять оба флажка и начнется партия для двух человек, компьютер не будет вмешиваться в игровой процесс.
Если вы хотите понаблюдать за игрой компьютер-компьютер, то следует включить оба флажка.
Чтобы сыграть повторно, обновите эту страницу.
Правила игры в шахматы можно быстро изучить здесь.
Есть и ещё более «крутые» реализации, например, в исходнике страницы по следующей ссылке можно увидеть шахматную программу на Javascript размером. в 1 килобайт! Правда, играет она очень слабо и «забывает» о некоторых правилах, вроде рокировки:
На пути к Deep Blue: пошаговое руководство по созданию простого ИИ для игры в шахматы
Авторизуйтесь
На пути к Deep Blue: пошаговое руководство по созданию простого ИИ для игры в шахматы
Рассмотрим некоторые базовые концепции, которые помогут нам создать простой искусственный интеллект, умеющий играть в шахматы:
На каждом шаге мы будем улучшать наш алгоритм с помощью одного из этих проверенных временем методов шахматного программирования. Вы увидите, как каждый из них влияет на стиль игры алгоритма.
Готовый алгоритм можно найти на GitHub.
Шаг 1. Генерация ходов и визуализация шахматной доски
Мы будем использовать библиотеки chess.js для генерации ходов и chessboard.js для визуализации доски. Библиотека для генерации ходов реализует все правила шахмат. Исходя из этого, мы можем рассчитать все ходы для данного состояния доски.
Визуализация функции генерации движения. Исходное положение используется как вход, а на выходе — все возможные ходы из этой позиции.
Использование этих библиотек поможет нам сосредоточиться только на самой интересной задаче — создании алгоритма, который находит лучший ход. Мы начнем с написания функции, которая возвращает случайный ход из всех возможных ходов:
Хотя этот алгоритм не очень солидный шахматист, но это хорошая отправная точка, поскольку его уровня достаточно, чтобы сыграть с нами:
Черные играют случайными ходами
Посмотреть, что получилось на данном этапе, вы можете на JSFiddle.
Шаг 2. Оценка доски
Теперь попробуем понять, какая из сторон сильнее в определенном положении. Самый простой способ добиться этого — посчитать относительную силу фигур на доске, используя следующую таблицу:
С помощью функции оценки мы можем создать алгоритм, который выбирает ход с наивысшей оценкой:
Единственным ощутимым улучшением является то, что теперь наш алгоритм съест фигуру, если это возможно:
Черные играют с помощью простой функции оценки
Посмотреть, что получилось на данном этапе, вы можете на JSFiddle.
Шаг 3. Дерево поиска и минимакс
Затем мы создадим дерево поиска, из которого алгоритм может выбрать лучший ход. Это делается с помощью алгоритма «минимакс».
Прим. перев. В одной из наших статей мы уже имели дело с минимаксом — учились создавать ИИ, который невозможно обыграть в крестики-нолики.
В этом алгоритме рекурсивное дерево всех возможных ходов исследуется до заданной глубины, а позиция оценивается на «листьях» дерева.
23 августа – 31 октября, Онлайн, Беcплатно
После этого мы возвращаем либо наименьшее, либо наибольшее значение потомка в родительский узел, в зависимости от того, чей просчитывается ход (то есть мы стараемся минимизировать или максимизировать результат на каждом уровне).
С минимаксом наш алгоритм начинает понимать основную тактику шахмат:
Минимакс с уровнем глубины 2
Посмотреть, что получилось на данном этапе, вы можете на JSFiddle.
Эффективность минимакса в значительной степени зависит от достижимой глубины поиска. Именно это мы улучшим на следующем шаге.
Шаг 4. Альфа-бета-отсечение
Альфа-бета-отсечение — это метод оптимизации алгоритма «минимакс», который позволяет игнорировать некоторые ветви в дереве поиска. Это позволяет нам намного глубже оценить дерево поиска, используя те же ресурсы.
Альфа-бета-отсечение основано на ситуации, когда мы можем прекратить оценивать часть дерева поиска, если найдем шаг, который приведет к худшей ситуации, чем та, к которой приводил ранее обнаруженный шаг.
Альфа-бета-отсечение не влияет на результат минимакса, оно только ускоряет его.
Этот алгоритм будет более эффективным, если мы сначала проверим те пути, которые ведут к хорошим ходам:
Позиции, которые нам не нужны, если используется альфа-бета-отсечение. Дерево посещается в описанном порядке.
С альфа-бета-отсечением мы получаем значительное улучшение минимакса, как показано в следующем примере:
Количество позиций, которые нужно оценить в случае поиска с глубиной 4 и начальной позицией, изображённой на картинке.
Посмотреть, что получилось на данном этапе, вы можете на JSFiddle.
Шаг 5. Улучшенная функция оценки
Первоначальная функция оценки довольно наивна, поскольку мы просто подсчитываем очки фигур, которые находятся на доске. Чтобы улучшить её, мы начнём учитывать положение фигур. Например, конь в центре доски «дороже», потому что он имеет больше доступных ходов и, следовательно, более активен, чем конь на краю доски.
Мы будем использовать слегка скорректированную версию квадратных таблиц, первоначально описанных в вики Chess Programming.
Визуализация квадратных таблиц. Мы можем уменьшить или увеличить оценку в зависимости от местоположения фигуры.
Применив это улучшение, мы получим алгоритм, который неплохо играет в шахматы, по крайней мере, с точки зрения простого игрока:
Улучшенная оценка и альфа-бета-отсечение с глубиной поиска 3
Посмотреть, что получилось на данном этапе, вы можете на JSFiddle.
Заключение
Сила даже простого шахматного алгоритма состоит в том, что он не совершает глупых ошибок. Тем не менее, ему по-прежнему не хватает стратегического взгляда на ситуацию.
С помощью методов, которые представлены здесь, мы смогли запрограммировать шахматный алгоритм, который может неплохо играть в шахматы. В финальном алгоритме реализация ИИ занимает всего 200 строк кода — это означает, что базовые принципы довольно просты. Вы можете посмотреть окончательную версию программы на GitHub.
Вот некоторые дополнительные улучшения, которые мы могли бы внести в алгоритм:
Если вы хотите узнать о шахматных алгоритмах больше, зайдите на Chess Programming Wiki.
Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.
chess.js has been extensively tested in node.js and most modern browsers.
To install the stable version:
The code below plays a random game of chess:
Constructor: Chess([ fen ])
The Chess() constructor takes an optional parameter which specifies the board configuration in Forsyth-Edwards Notation.
Returns a string containing an ASCII diagram of the current position.
Delete and return the comment for the current position, if it exists.
Delete and return comments for all positions.
Returns the FEN string for the current position.
Returns true if the game has ended via checkmate, stalemate, draw, threefold repetition, or insufficient material. Otherwise, returns false.
Returns the piece on the square:
Retrieve the comment for the current position, if it exists.
Retrieve comments for all positions.
Returns true or false if the side to move is in check.
Returns true or false if the side to move has been checkmated.
Returns true or false if the game is drawn (50-move rule or insufficient material).
Returns true or false if the side to move has been stalemated.
Returns true or false if the current board position has occurred three or more times.
Returns true if the game is drawn due to insufficient material (K vs. K, K vs. KB, or K vs. KN) otherwise false.
The board is cleared, and the FEN string is loaded. Returns true if the position was successfully loaded, otherwise false.
An optional sloppy flag can be used to parse a variety of non-standard move notations:
Returns a list of legal moves from the current position. The function takes an optional parameter which controls the single-square move generation and verbosity.
The piece, captured, and promotion fields contain the lowercase representation of the applicable piece.
The flags field in verbose mode may contain one or more of the following values:
A flag of ‘pc’ would mean that a pawn captured a piece on the 8th rank and promoted.
Returns the game in PGN format. Options is an optional parameter which may include max width and/or a newline character settings.
Remove and return the piece on square.
Reset the board to the initial starting position.
Comment on the current position.
Returns the color of the square (‘light’ or ‘dark’).
Returns the current side to move.
Takeback the last half-move, returning a move object if successful, otherwise null.
Returns a validation object specifying validity or the errors found within the FEN string.
Musical support provided by:
About
A Javascript chess library for chess move generation/validation, piece placement/movement, and check/checkmate/draw detection