Nickolay.info. JavaScript. Шахматная "ходилка" на JavaScript

updated! Показанная ниже ходилка разрабатывалась в 2009-10 гг, с тех пор и прогресс, и Javascript шагнули далеко вперёд :) Новая ходилка, основанная на библиотеках chess.js и chessboard.js, доступна в этой заметке блога, а старая, увы, больше обновляться не будет.

updated! Хочу делать это на большой доске, как на Личессе, и с записью партии в PGN!

Другие версии скрипта можно получить здесь:

 Версия с записью партии в формате PGN и фигурами 36x36px (страница версии в блоге)

 Версия с "золотой" доской и маленькими фигурами 29x29px


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

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

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

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

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

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

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

Например, этот код, передаваемый 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://nickolay.info/jscript/chessJs/chess.js"></script>
<script type="text/javascript" src="http://nickolay.info/jscript/chessJs/chessGui.js"></script>
<script type="text/javascript">
 config.pieceDir = "http://nickolay.info/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://nickolay.info/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 в англоязычной "Википедии"

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

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

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

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

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

<div id="chessDivId" style="width:232px"></div>

вместо

<div id="chessDivId" style="width:328px"></div>

в коде вызова скрипта (29*8=232, а 41*8=328 при прежних размерах картинок).

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 быть не должно.

4. Скачал, развернул, запустил, вижу только "чёрные квадратики" вместо букв в нотации?

Укажите на странице с кодами скрипта кодировку Windows-1251 мета-тегом

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

или перекодируйте файлы скрипта в нужную вам кодировку, например, в Юникод.

5. Не получилось подключить несколько досок на одну страницу, вывод "перепутывается"?

Коды разделов для разных досок должны быть разными. Посмотрите, например, в исходник вот этого примера, здесь успешно работают две разных партии на одной странице. Фича, которую поленился исправить - элемент для вывода FEN должен называться так же, как раздел для доски с допиской 'Span' в конце, например, chessDivId2 и chessDivId2Span.

6. В Internet Explorer не увидел фона полей под картинками?

Где берёте такие браузеры? :) IE6 ещё не умел показывать png с прозрачным фоном. Конвертируйте любым редактором все файлы png из папки pieces в формат gif и поменяйте переменную config в файле chessGui.js:

var config =
{
  pieceDir: 'pieces/',
  pieceExt: '.gif',

Вот архив с готовыми картинками в gif с прозрачным фоном: pieces_gif.zip, 7 Кб.

Рейтинг@Mail.ru

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