БлогNot. Случайные шахматы-2 или майним шахматную криптовалюту :)

Помощь дата->рейтинг Поиск Почта RSS канал Статистика nickolay.info Домой

Случайные шахматы-2 или майним шахматную криптовалюту :)

Не так давно я писал и даже переписывал код для генерации случайной шахматной игры самостоятельно (рандомные партии) или же извлекал его из базы удалённого сервера (реальные партии). С использованием библиотек 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.

 Скачать архив .zip с файлами проекта RandomChess2, развернуть без создания новой папки (39 Кб)

Приложение в работе (фрагмент экрана, фигура на d6 находится в движении)
Приложение в работе (фрагмент экрана, фигура на d6 находится в движении)

Кстати:
бессмысленность мясорубки "случайных шахмат" вам не напоминает сегодняшнюю жизнь под гнётом "мистиков-сатанистов"? :)
Эти заметки писались в те дни, когда информационная накачка населения Эрефии дерьмом достигла, кажется, исторического максимума, и "солнцеликий" осчастливил, наконец, крепостных известием о своих "выборах" на четвёртый срок... Двойка-Русь, куда ты же ползёшь?..


теги: random javascript шахматы статистика программирование игра

комментарии (0)

08.12.2017, 09:06; рейтинг: 154

  свежие записипоиск по блогукомментироватьстатистика

Наверх Яндекс.Метрика
© PerS
вход