Pers.narod.ru. JavaScript. Шахматная "ходилка" на JavaScript

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

Оказалось, велосипед изобретать не нужно, а можно воспользоваться готовым GUI от человека с ником Мистик (возможно, есть более новая ссылка на него).

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

Выглядит "ходилка" так (фигуры уже можно перетаскивать мышкой):

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

Для записи позиций используется стандартная нотация Форсайта—Эдвардса, причём, можно задать позицию с помощью соответствующей кнопки формы, а текущая позиция в этой же нотации выводится под доской.

Скрипт формирует "полную" нотацию в том виде, в каком она описана в "Википедии" по ссылке выше. Часто на шахматных серверах можно скопировать из кода ссылок только расстановку фигур (то, что записано до первого пробела в строке FEN). В этом случае добавьте после расстановки хотя бы очерёдность хода - пробел и букву w (white), если ходят белые, или букву b (black) для хода чёрных. Скрипт предупредит о том, что не указана очерёдность хода, а вот остальные данные к расстановке можно не добавлять, однако, понятно, что в этом случае они будут иметь значения по умолчанию (скажем, рокировки будут считаться разрешёнными).

Например, этот код, передаваемый flash-ходилке с сервера ChessPro.Ru
javascript: lookstep('g1v0n63', '5r1k/5q1p/b2p2RQ/1p3p2/p1nPp2B/2P5/1P6/R6K')
легко перенести в нашу ходилку: нажать кнопку "Задать FEN" и вставить
5r1k/5q1p/b2p2RQ/1p3p2/p1nPp2B/2P5/1P6/R6K b
- получится итоговая позиция из необычайно красивой для современных шахмат партии Юдит Полгар - Борис Гельфанд (кубок мира-2009), которую играющий чёрными Гельфанд сдал венгерской шахматной королеве.

Код для подключения на свой сайт шахматной ходилки может быть, например, таким:

<script type="text/javascript" src="http://pers.narod.ru/jscript/chessJs/chess.js"></script>
<script type="text/javascript" src="http://pers.narod.ru/jscript/chessJs/chessGui.js"></script>
<script type="text/javascript">
 config.pieceDir = "http://pers.narod.ru/jscript/chessJs/" + config.pieceDir;
</script>
<form name="chessFormId" id="chessFormId">
 <div align="center">
  <div id="chessDivId" style="width:328px"></div>
  <p><span id="chessDivIdSpan" style="color:green"></span></p>
  <input id="chessUndoId" type="button" value="Отменить ход"/>
  <input name="btnSetFen" type="button" value="Задать FEN" onclick="SetFen('chessDivId', 'chessUndoId', 'notId')"/>
  <p id="notId"></p>
 </div>
</form>
<script type="text/javascript">
 SetDiagram("chessDivId", 
  "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 
  "chessUndoId","notId");
</script>

Как видно, текущая версия скрипта также пишет обычную шахматную нотацию под доской. Чтобы она этого не делала, не передавайте параметр notId функциям SetFen и SetDiagram.

В этом коде адрес

http://pers.narod.ru/jscript/chessJs/

можно заменить на свой URL к файлам скрипта. Но можно оставить и этот, т.к. скрипт поправленный и будет лежать здесь :)

Итак, для получения на страничке интерактивной шахматной партии, начинающейся с нужной позиции, достаточно поместить FEN-код позиции (который можно получить этим же скриптом) в качестве второго аргумента функции SetDiagram (вместо начальной расстановки rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1) и вставить в страничку код из листинга выше. Разумеется, если на одной странице выводится несколько партий, первые 3 тега <script> можно не дублировать и для следующих партий включать повторно код, начиная с тега <form>.

 Скачать русскоязычный скрипт шахматной доски chessJs.zip с помощью и примером запуска (20 Кб)

 Первая версия скрипта (без стандартной нотации, 18 Кб)

 Нотация FEN в англоязычной "Википедии"

Типовые вопросы по шахматной "ходилке"

1. Как поменять размер доски, вид фигур и т.п.?

Поменять сами картинки в папке pieces на новые (имена картинок лучше не трогать), также поменять настройки в переменной config файла chessGui.js. Например, для картинок отсюда получаем маленькую красно-белую доску:

var config =
{
  pieceDir: 'pieces/',
  pieceExt: '.png',
  bitmapWidth: 29,
  bitmapHeight: 29,
  fieldColorWhite: 'white',
  fieldColorBlack: 'red'
};

2. Можно ли по-другому разместить нотацию, поменять дизайн и т.п.?

Конечно, можно, например, так:

<table border="0" cellpadding="4" cellspacing="0" align="center"><tr><td valign="top" width="200">

  <p id="notId"></p>

</td><td valign="top">

<form name="chessFormId" id="chessFormId">
 <div align="center">
  <div id="chessDivId" style="width:328px"></div>
  <p><span id="chessDivIdSpan" style="color:green"></span></p>
  <input id="chessUndoId" type="button" value="Отменить ход"/>
  <input name="btnSetFen" type="button" value="Задать FEN" 
   onclick="SetFen('chessDivId', 'chessUndoId', 'notId')"/>
 </div>
</form>
<script type="text/javascript">
 SetDiagram("chessDivId", 
  "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 
  "chessUndoId","notId");
</script>

</td></tr></table>

Здесь нотация выводится слева от доски в столбце таблицы шириной 200 пикселов. При выводе справа надо отследить, где находится код JavaScript по отношению к контейнеру notId - если контейнер описан ниже по тексту, чем используется, в ряде браузеров это может вызвать проблему с его "опознанием" интерпретатором.

3. Почему не работает вместе с JQuery?

Когда это писалось, JQuery ещё не был так распространён. Не работает из-за конфликтующих имён. Просто замените везде в файле chessGui.js символ $ (имя функции, которое есть и в JQuery) на другое имя, например, get_Id, проверено, заработает. Ну или, если мне не изменяется память, в JQuery есть метод noConflict.

В последней версии, выложенной здесь, функция уже переименована, так что проблемы совместимости с JQuery быть не должно.

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz