Dagazserver: Знакомьтесь, Гарбо Чесс



DagazServer: Знакомьтесь, Гарбо Чесс

Кто мне сказал: «Это не сработает»? Если я этого захочу, то это сбудется! Земфира Плюйте в глаза тому, кто говорит что можно объять необъятное! Козьма Прутков»
Плоды мысли " Новогодние праздники снова наступили внезапно.

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

Есть готовые шахматные движки куча .

Я решил остановиться на Гарбошесс-JS — простая и понятная реализация на JavaScript, названная в честь известной актрисы Грета Гарбо (это видно на фото).

Прежде всего, я должен сказать несколько слов о своем Веб-сайт .

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

При регистрации вам не нужно предоставлять какую-либо конфиденциальную информацию (Email при желании можно сохранить в профиле пользователя и позже).

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



DagazServer: Знакомьтесь, Гарбо Чесс

Игра, выбранная на карте, запоминается.

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

Вы можете запустить игру (с помощью кнопки «Запуск») или просмотреть сеансы ожидания подключения второго игрока («Присоединиться») и ранее сыгранные игры («Просмотр»), если таковые имеются.

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

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

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

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

Другая опция реализована не для всех игр, но если в форме стоит галочка «Играть против ИИ», ждать вообще ничего не придется.

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

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

Для Шахмат такое решение совершенно не подходит, но возможность поиграть с ботом все же есть.



Что вы хотите?

Обычный бот, встроенный в игру, для Dagaz не является чем-то новым.

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

К имени html файла добавляется суффикс "-ai", позволяющий серверу загрузить правильную сборку при выборе режима игры с ботом.

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

Например, этот бот используется очень часто

   

(function() { function RandomAi(params) { this.params = params; if (_.isUndefined(this.params.rand)) { this.params.rand = _.random; } } var findBot = Dagaz.AI.findBot; Dagaz.AI.findBot = function(type, params, parent) { if ((type == "random") || (type == "solver")) { return new RandomAi(params); } else { return findBot(type, params, parent); } } RandomAi.prototype.setContext = function(ctx, board) { ctx.board = board; } RandomAi.prototype.getMove = function(ctx) { var moves = Dagaz.AI.generate(ctx, ctx.board); if (moves.length == 0) { return { done: true, ai: "nothing" }; } if (moves.length == 1) { return { done: true, move: moves[0], ai: "once" }; } var ix = this.params.rand(0, moves.length - 1); return { done: true, move: moves[ix], ai: "random" }; } })();

Я не шучу.

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

Конечно, есть и более сложные боты, но, в целом, они не очень сильны.

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

Для встроенного бота оно не может превышать 2-3 секунд, так как все расчеты производятся непосредственно в браузере пользователя и из-за однопоточной природы JavaScript все остальные действия в это время блокируются.

Если вы подождете слишком долго, браузер выдаст предупреждение о возможном зацикливании на странице или молча остановит все запущенные скрипты (это произошло в Safari).

Понятно, как бороться с этими двумя неприятностями.

Поскольку у нас есть сервер, нам необходимо разработать клиент, который подключается к нему через ОТДЫХ и реагирование на действия других пользователей.

Другими словами, вам нужно разработать внешнего бота.

Вы можете использовать тот же JavaScript в качестве языка разработки и запускать бота в Node.js, на том же хосте, что и сервер (или где-то еще, не важно).

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

Все эти мечты можно осуществить с помощью небольшого конечный автомат , работающий по следующей схеме:

DagazServer: Знакомьтесь, Гарбо Чесс

После запуска бот выполняет инициализацию, авторизуется на сервере, а затем переходит к циклу опроса: ищет на сервере сессии, в которых он должен выполнить следующий ход (TURN), загружает текущую позицию (RECO), передает свою описание к Garbo Chess, и полученный ответный ход отправляется на сервер (MOVE).

Если ожидающих сессий нет, бот приступает к проверке наличия ожидающих сессий, созданных ботом (CHCK); если их нет и общее количество сессий, в которых участвует бот, меньше указанного, он создает новую (SESS).

При возникновении ошибок (например, в случае устаревания токена JWT) бот возвращается к фазе инициализации (INIT) для выполнения повторной авторизации, а если там уже произошла ошибка (если сервер недоступен или что-то в этом роде аналогично), он переходит в фазу СТОП и останавливается.

Здесь Так все это похоже.

Бот может играть с несколькими игроками одновременно, но в любой момент времени занимается не более чем одной игрой.

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

Кроме того, это не самый эффективный способ использования Garbo Chess. Движок поддерживает режим, в котором анализ игры осуществляется непрерывно (запускается в отдельном потоке).

Веб-работник -а), но в этом случае играть можно только с одним противником.



САН, ФЕН, ПГН

Прежде всего нужно было договориться с шахматным движком.

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

В первом случае действительным стандартом является ФЕН и именно в таком виде описание позиции должно быть передано в Garbo Chess. С этим случилась небольшая засада Конечно, в Дагазе я описываю и позиции.

Это функционал, без которого очень сложно обойтись.

Представьте себе, что доиграв до середины игры, мы вышли из игры, а затем снова зашли в нее (или просто перезагрузили страницу).

Было бы глупо проходить все ходы с самого начала.

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

Следующий ход игра получает обычным способом, после загрузки html. Благодаря этому игрок при загрузке игры всегда видит анимацию последнего хода противника (или нескольких ходов).

А если он не успел детально обдумать этот ход, он всегда может просто перезагрузить страницу.

Таким образом, модули описания позиции, такие как этот - важная часть проекта.

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

Почему я не использовал ФЕН? Просто потому, что Дагаз – это не только шахматы.

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

В любом случае, мне нужен был FEN, и я делал .

В ответ на полученное описание Garbo Chess, поработав некоторое время, возвращает лучший (по ее мнению) ход (всего пару позиций типа «e2e4» и тип фигуры, если есть трансформация).

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

Я не хотел, чтобы эти игры ломались, и добавил дефис, разделяющий позиции (то, что в старых играх не использовалась нотация FEN, не имело значения; при игре в уже завершенные партии описания позиций не используются).

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

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

Я вижу два способа справиться с этим:

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

Что касается книги дебютов, то она полезна сама по себе.

Шахматные движки предназначены для миттельшпиль .

В дебют И эндшпиль они не так эффективны.

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

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

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

я уже использовал открытие столов в Дагазе, в формате SGF , но серверу пришлось реорганизовать их по-другому.

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

Утилита тут очень помогла pgn2fen , обнаруженный в блоге Николая Кисленко, работающего как с SAN, так и с Длинная алгебраическая запись .

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

был выбран.

В целом новая схема данных выглядела так:

DagazServer: Знакомьтесь, Гарбо Чесс

Здесь стоит упомянуть еще об одном моменте.

Я добавил табличку «ai_settings» для хранения настроек бота применительно к игроку в конкретной игре.

Это своего рода рейтинг.

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

При поражениях она уменьшается.

Таким образом, бот может адаптироваться к силе игрока, с которым он играет.

Что случилось

Этот один из бот-игр на сайте.

И это не открывающаяся ловушка (можно проверять это самостоятельно)! При ограничении времени на расчет хода в 1-2 секунды бот вполне разумно играет против человека и может делать ставки красивый коврики .

Возможности бота не ограничиваются классическими шахматами.

Подойдет любая игра, в которой правила хода фигур не меняются, например « Фишер шахматы " или " Буденный шахматы ".

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

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

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

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

Понятно, что ни к чему хорошему это привести не может, поэтому я добавил атрибут setup_required , что требует присутствия FEN во время загрузки сеанса.

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

Также без каких-либо изменений можно играть" шахматы в темноте ".

Если проявить немного фантазии, то можно пойти еще дальше.

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

Если вдуматься, станет ясно.

Взорвать мину – это просто потерять фигуру.

Бот не пойдет на мины, если будет их учитывать - это просто невыгодно, а суть миссии как раз в том, чтобы заманить его фигуры в ловушку.

Решение простое – информация о минах просто не должна передаваться боту.



DagazServer: Знакомьтесь, Гарбо Чесс

Вот что происходит: я я добавить в ФЕН описание мин, но прежде чем переносить в Гарбо Чесс, просто я прибираюсь мины из описания, и после получения ответа возвращаю на позицию те мины, которые не взорвались в результате хода бота.

Теперь вы можете заманить бота в ловушку уже ДагазСервер .



Что дальше

Существует множество шахматных партий: Шатрандж , Макрук — бот умеет ими играть, нужно просто добавить новые фигуры в Garbo Chess. Есть игры на маленькие доски .

Наконец, Garbo Chess можно переосмыслить как универсальный движок, подходящий для более широкого класса игр.

Есть много возможностей для развития, если есть желание.

Теги: #Разработка игр #шахматы #Логические игры #JavaScript #Дагаз #шахматы

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.