Кто мне сказал: «Это не сработает»?
Если я этого захочу, то это сбудется!
Земфира
Плюйте в глаза тому, кто говорит
что можно объять необъятное!
Козьма Прутков» Плоды мысли "
Новогодние праздники снова наступили внезапно.
Такое обилие свободного времени просто необходимо было разбавить каким-нибудь осмысленным занятием, и я решил присоединить его к своему сервер бот для игры шахматы .
Есть готовые шахматные движки куча .
Я решил остановиться на Гарбошесс-JS — простая и понятная реализация на JavaScript, названная в честь известной актрисы Грета Гарбо (это видно на фото).
Прежде всего, я должен сказать несколько слов о своем Веб-сайт .
Поскольку вся идея заключается в том, чтобы люди играли друг с другом онлайн, сайт требует регистрации.
При регистрации вам не нужно предоставлять какую-либо конфиденциальную информацию (Email при желании можно сохранить в профиле пользователя и позже).
Приведенная мной выше ссылка, по которой отображается список всех доступных игр, работает без регистрации, но если вы решите пойти дальше, вам потребуются логин и пароль.
Игра, выбранная на карте, запоминается.
Таким образом, после ввода имени пользователя и пароля вы попадаете на вкладку запуска этой игры.
Вы можете запустить игру (с помощью кнопки «Запуск») или просмотреть сеансы ожидания подключения второго игрока («Присоединиться») и ранее сыгранные игры («Просмотр»), если таковые имеются.
Если вы запустите игру, будет создана новая сессия, ожидающая подключения второго игрока.
Вы попадете в игру, сможете сделать ход (если вы выбрали игру первым игроком), но ожидание обратного хода может занять некоторое время (фактически нет гарантии, что кто-нибудь подключится к эта сессия вообще).
По этой причине я рекомендую просмотреть список ожидающих сессий для интересующей вас игры, прежде чем создавать новую сессию с помощью запуска.
Вы избавите себя от лишнего ожидания и, возможно, доставите удовольствие другому человеку.
Другая опция реализована не для всех игр, но если в форме стоит галочка «Играть против ИИ», ждать вообще ничего не придется.
Эта опция запускает игровой режим с ботом, который практически мгновенно реагирует на сделанные ходы.
Как правило, речь идет об очень простых ботах, без каких-либо сложных расчетов (хотя выигрыш некоторые из них , тем не менее, это может быть сложно).
Для Шахмат такое решение совершенно не подходит, но возможность поиграть с ботом все же есть.
Что вы хотите?
Обычный бот, встроенный в игру, для 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, на том же хосте, что и сервер (или где-то еще, не важно).
Можно добавить дополнительный функционал Если бот ничего не делает, он может создавать новые игровые сессии для выбранной игры, подключаться к ним как второй игрок и ждать подключения игрока-человека.
Все эти мечты можно осуществить с помощью небольшого конечный автомат , работающий по следующей схеме:
После запуска бот выполняет инициализацию, авторизуется на сервере, а затем переходит к циклу опроса: ищет на сервере сессии, в которых он должен выполнить следующий ход (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 как «дежурного бота» для шахматных игр, чтобы фронтенд автоматически включал бота в созданную игру при выборе опции «Играть против ИИ».
был выбран.
В целом новая схема данных выглядела так:
Здесь стоит упомянуть еще об одном моменте.
Я добавил табличку «ai_settings» для хранения настроек бота применительно к игроку в конкретной игре.
Это своего рода рейтинг.
В случае победы игрока дополнительное время, отведенное боту на «размышление», увеличивается.
При поражениях она уменьшается.
Таким образом, бот может адаптироваться к силе игрока, с которым он играет.
Что случилось
Этот один из бот-игр на сайте.И это не открывающаяся ловушка (можно проверять это самостоятельно)! При ограничении времени на расчет хода в 1-2 секунды бот вполне разумно играет против человека и может делать ставки красивый коврики .
Возможности бота не ограничиваются классическими шахматами.
Подойдет любая игра, в которой правила хода фигур не меняются, например « Фишер шахматы " или " Буденный шахматы ".
Правда, здесь есть небольшая загвоздка Шахматному движку необходимо знать, с какой позиции началась игра.
Если первым ходит человек, проблем нет - после совершения хода FEN-описание позиции передается на сервер, но если первым ходит бот, описывать позицию некому, так как сервер ничего не знает о специфика игры.
Пришлось пойти на небольшую хитрость - загрузить FEN-описание стартовой позиции, даже если игра после загрузки ждет хода бота.
Может быть, есть что-то вроде гоночная ситуация , когда бот получает описание сессии до того, как игровой интерфейс успевает загрузить и сохранить ФЕН исходной позиции.
Понятно, что ни к чему хорошему это привести не может, поэтому я добавил атрибут setup_required , что требует присутствия FEN во время загрузки сеанса.
Если FEN еще не сгенерирован, сервер возвращает ошибку, при получении которой бот просто приступает к повторной авторизации, после чего продолжает выполнение в обычном режиме.
Также без каких-либо изменений можно играть" шахматы в темноте ".
Если проявить немного фантазии, то можно пойти еще дальше.
Вспомните, как проходят миссии кампании в знаменитых " Битва против шахмат "? Здесь в качестве бота используется обычный шахматный движок Фриц .
Если вдуматься, станет ясно.
Взорвать мину – это просто потерять фигуру.
Бот не пойдет на мины, если будет их учитывать - это просто невыгодно, а суть миссии как раз в том, чтобы заманить его фигуры в ловушку.
Решение простое – информация о минах просто не должна передаваться боту.
Вот что происходит: я я добавить в ФЕН описание мин, но прежде чем переносить в Гарбо Чесс, просто я прибираюсь мины из описания, и после получения ответа возвращаю на позицию те мины, которые не взорвались в результате хода бота.
Теперь вы можете заманить бота в ловушку уже ДагазСервер .
Что дальше
Существует множество шахматных партий: Шатрандж , Макрук — бот умеет ими играть, нужно просто добавить новые фигуры в Garbo Chess. Есть игры на маленькие доски .Наконец, Garbo Chess можно переосмыслить как универсальный движок, подходящий для более широкого класса игр.
Есть много возможностей для развития, если есть желание.
Теги: #Разработка игр #шахматы #Логические игры #JavaScript #Дагаз #шахматы
-
Что Не Так С Webassembly?
19 Oct, 24 -
Cisco Cli В Bash
19 Oct, 24 -
Обучение По Программе Masa В Израиле
19 Oct, 24 -
Мы Часто Меняем Содержимое Сайта.
19 Oct, 24 -
Почему Нет Распродаж В Интернет-Магазинах?
19 Oct, 24