Случайные шахматы-2 или майним шахматную криптовалюту :)
random chess, randomchess2, mad chess, random chess game, случайные партии в шахматы, исход шахмат, шахматы для обезьян, monkey chess
Не так давно я писал и даже переписывал код для генерации случайной шахматной игры самостоятельно (рандомные партии) или же извлекал его из базы удалённого сервера (реальные партии). С использованием библиотек chessboard.js и chess.js, ссылки на которые есть в предыдущей статье, задача становится куда приятнее для программирования.
В отличие от предыдущего скрипта, случайная партия развивается и записывается динамически, а с помощью небольшой серверной части ведётся общая статистика игр - какое получается количество ничьих, побед одной из сторон, а также какова средняя длина партии в ходах. AJAX-код - простейший, примерно как здесь, поэтому полные исходники не привожу, а лишь прикреплю в архиве. Тем не менее, ниже показана содержательная часть кода скрипта, демонстрирующая применение некоторых возможностей шахматных JS-фреймворков.
Запустив на некоторое время этот скрипт у себя в браузере, вы способствуете накоплению статистики о процентах "случайных" побед в шахматах, возможно, по законам больших чисел, это соответствует и проценту побед при любой "непредвзятой" игре сторон, например, при выборе хода с помощью сколь угодно сложной оценочной функции.
Скрипт RandomChess2 в работе, открыть в новом окне (вкладке)
Код главного файла index.html
(без стандартного обрамления HTML):
<div class="info"> <span id="instructionLink" style="cursor:pointer; text-decoration: underline;" onclick="switchShow();">ИНСТРУКЦИЯ</span> <span id="reloadLink" style="cursor:pointer; text-decoration: underline;" onclick="reloadMe();">ЗАНОВО</span> <span id="stat"></span> <span id="timer"></span> </div> <div class="info" id="instructionBox" style="display: none;"> <p>Следите за развитием партии и дождитесь её окончания :) <br>После этого станут видны ссылка на статистику и время, оставшееся до новой игры. <br>Чтобы выделить текст партии под доской, щёлкните по нему один раз. <br>После этого можно нажать Ctrl+C для копирования текста партии в Буфер Обмена. <br>Щёлкните "ЗАНОВО", чтобы прервать текущую игру и начать новую немедленно. </p> </div> <div id="board" class="board"></div> <div class="info"> <p><b>Позиция</b>: <span id="fen"></span></p> <p><b>Партия</b>: <span id="pgn" onclick="selectPgn();"></span></p> </div> <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> <script src='http://scripts.kislenko.net/aichess/js/chess.js'></script> <script src='http://scripts.kislenko.net/aichess/js/chessboard.js'></script> <script src='script.js'></script> <noscript> <div align="center"> Извините, для работы приложения нужен включённый Javascript в браузере </div> </noscript>
Код файла script.js
, реализующего основной функционал скрипта:
var delay = 330, //задержка между ходами в миллисекундах mainPause = 30, //задержка между партиями в секундах board, game = new Chess (), pgnEl = $('#pgn'), fenEl = $('#fen'), mainTimeout; var makeRandomMove = function() { var possibleMoves = game.moves(); if (game.game_over() === true || game.in_draw() === true || possibleMoves.length === 0) { window.clearTimeout (mainTimeout); var res = (game.in_stalemate() || game.in_draw() ? 0 : (game.in_checkmate() ? (game.turn() === game.BLACK ? 1 : -1) : '0')); //Получить победителя из game var tokens = game.fen().split(' '); var num = tokens[5]; //Получить количество ходов из FEN if (res==-1) num--; //Если победили чёрные, следующий ход не был начат $.post("./script.php", {res: res, num: num}); $('#stat').html('<a href="./stat.php" target="_blank">СТАТИСТИКА</a>'); window.setTimeout (showTimer, 1000, mainPause); return; } var randomIndex = Math.floor(Math.random() * possibleMoves.length); game.move(possibleMoves[randomIndex]); var fen = game.fen(); board.position(fen); fenEl.html(fen); pgnEl.html(game.pgn()); mainTimeout = window.setTimeout(makeRandomMove, delay); }; board = ChessBoard('board', 'start'); window.setTimeout(makeRandomMove, delay); function switchShow (id) { //Переключалка видимости для вывода инструкции var div=document.getElementById ('instructionBox'); div.style.display = div.style.display == "none" ? "block" : "none"; document.getElementById ('instructionLink').innerHTML = div.style.display == "block" ? "СКРЫТЬ ИНСТРУКЦИЮ" : "ИНСТРУКЦИЯ"; return false; } function selectPgn() { //Выделить PGN по клику var span = document.getElementById('pgn'); var range = document.createRange(); range.selectNodeContents(span); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } function reloadMe() { //Перезагрузка window.location.reload(true); } function showTimer (timer) { //Таймер if (timer==0) { reloadMe(); } else { $('#timer').html('(ДО ПЕРЕЗАГРУЗКИ: '+(--timer)+' сек.)'); window.setTimeout(showTimer, 1000, timer); } }
Ниже показан скриншот работы приложения и прикреплён архив с исходниками, которые могут измениться или улучшиться по отношению к приведённым в статье фрагментам.
В текущей сборке скрипта также использованы немного другие шахматные фигурки, просто для разнообразия, обычно такой набор называют Chess Alpha.

Приложение в работе (фрагмент экрана, фигура на d6 находится в движении)
Вот сборка всего этого с реального хостинга PHP7, в Юникоде (utf-8), со всеми нужными файлами, главная папка уже есть внутри архива:
Скачать сборку RandomChess2 (HTML5+JS) с реального хостинга в архиве .zip (98 Кб)
Просто поместите развёрнутое содержимое архива в папку public_html
на хостинге посредством ftp-клиента, получится, например,
как вот тут
(ссылка для "быстрой" игры; служит только для демонстрации, её URL не подходит для копирования).
Кстати:
бессмысленность мясорубки "случайных шахмат" вам не напоминает сегодняшнюю жизнь под гнётом "мистиков-сатанистов"? :)
Эти заметки писались в те дни, когда информационная накачка населения Эрефии дерьмом достигла, кажется, исторического максимума, и "солнцеликий" осчастливил, наконец, крепостных известием о своих "выборах" на четвёртый срок... Двойка-Русь, куда ты же ползёшь?..
08.12.2017, 09:06 [3392 просмотра]