БлогNot. Про шахматы Фишера и скрипт для начальной расстановки фигур в них

Про шахматы Фишера и скрипт для начальной расстановки фигур в них

Из всех многочисленных альтернативных шахмат наиболее популярны, пожалуй, шахматы Фишера, по ним проводятся вполне представительные турниры, а некоторые гроссмейстеры (как правило, из "второго эшелона") активно их пропагандируют в качестве замены классике (например, Андрей Девяткин).

Суть фишеровской новации состоит в том, что расстановка фигур по первой линии выбирается случайным образом. Так как в этой случайности есть ограничения (чёрные и белые фигуры стоят симметрично, слоны должны быть разнопольными, а ладьи - с разных сторон от короля), то различных начальных позиций оказывается всего 960, почему шахматы Фишера ещё называют "Шахматы-960".

Идея Фишера была, конечно, в том, чтобы уйти в дебюте от "скучных схем", но выиграли ли мы больше, чем проиграли? На мой скромный любительский взгляд, шахматы Фишера обладают значительным количеством недостатков:

  • Уже первый "вполне нормальный" ход белых может быть если не проигрывающим, то уводить в большой "минус" (пример, после 1. e4 f5!)
  • Дебюты в Фишере чаще всего сводятся к фланговому развитию. Это не делает игру скучной, но это делает её другой, хотя и всё равно похожей на некоторые "маргинальные" начала в классике, вроде английского. Борьбу за центр и красивые гамбиты в Фишере вряд ли увидишь.
  • В Фишере усиливается роль тактики, начиная от выбора первого хода. И кажущееся превосходство в количестве изначальных позиций во многом нивелируется ограниченным количеством дебютных структур, которые могут возникнуть в партиях сильных игроков. А для слабых игроков 960 бессмысленны, мы-то и в классику отлично можем "просто порубиться".

В общем, вот такая присказка, хотя с ней, конечно, можно не соглашаться. А в качестве сказки - вот маленькая "расставлялка" начальных позиций в шахматы Фишера с возможностью генерации картинки:

Идея такого алгоритма расстановки принадлежит Гансу Бодландеру (Hans L. Bodlaender).

Полный исходник скрипта, включая обрамление HTML, приводится ниже. Его можно сохранить как файл типа .html, предполагается, что выбрана кодировка Юникода UTF-8.

<!DOCTYPE HTML>
<html>
 <head>
  <meta charset="utf-8">
  <title>Chess960 start position</title>
 </head>
<body>

<div id="fen960"></div>
<script type="text/javascript">
 function genFen (board) { //Построение FEN позиции по матрице фигур board
  var result="";
  var count = 0;
  var chars = "KQRBNPkqrbnp";
  var fields = [];
  for (var i=0; i<board.length; i++) for (var j=0; j<board[i].length; j++) 
   fields.push(board[i][j]); //Переписали матрицу board в вектор fields :)
  for (var i=0; i<fields.length; i++) {
   if (i%8==0 && i!=0) {
    if (count) result += count;
    result += '/';
    count = 0;
   }
   if (chars.indexOf(fields[i])!=-1) {
    if (count) result += count; result += fields[i]; count = 0;
   }
   else count++;
  }
  if (count) result += count;
  return result+' w KQkq - 0 1';
 }

 function printBoard (a) { //Печать в строку str двумерного массива a
  var str = '';
  for (var i=0; i<a.length; i++) str += a[i].join('|')+(i<a.length-1 ? "\n" : '');
  return str;
 }

 function chess960startPos() { //Расстановка белых фигур
  var rank = new Array(8);
  var rnd = function(num) { return Math.floor(Math.random() * ++num) };
  var emptySquares = function() {
   var arr = [];
   for (var i = 0; i < 8; i++) if (rank[i] == undefined) arr.push(i);
   return arr;
  };
  //Расставляем по алгоритму от Hans L. Bodlaender
  rank[rnd(2) * 2] = "B"; //Слон на чёрном поле
  rank[rnd(2) * 2 + 1] = "B"; //Слон на белом поле
  rank[emptySquares()[rnd(5)]] = "Q"; //Ферзь
  rank[emptySquares()[rnd(4)]] = "N"; //Конь 1
  rank[emptySquares()[rnd(3)]] = "N"; //Конь 2
  for (var x = 1; x <= 3; x++) rank[emptySquares()[0]] = x==2 ? "K" : "R";
   //Король между ладьями
  return rank;
 }

 function chess960Board() {
  var board =  [
   [ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
   [ 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'],
   [ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
   [ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
   [ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
   [ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
   [ 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'],
   [ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
  ];
  board[7] = chess960startPos();
  board[0] = board[7].join("").toLowerCase().split(""); //Чёрные стоят симметрично
  return board;
 }

 function chess960Start () {
  var board = chess960Board();
  var fen = genFen (board);
  document.getElementById('fen960').innerHTML = 
   '<pre>' + printBoard(board) + '</pre>FEN: ' + fen + '<br>' +
   '<a href="http://scripts.kislenko.net/genfen2/index.php?fen=' + fen +
   '" target="_blank">Открыть картинку в новом окне/вкладке</a> ' +
   '<a href="#" onclick="chess960Start(); return false;">Ещё раз</a>';
 }

 chess960Start();
</script>
<noscript><div>Извините, требуется включённый Javascript для работы приложения!</div></noscript>

</body></html>

Что полезного в листинге:

  • ещё одна функция для построение FEN позиции по двумерной матрице фигур (genFen);
  • печать в строку str двумерного массива a (printBoard);
  • как переписать матрицу в вектор на яваскрипт (сделано "в лоб", в функции genFen).


теги: javascript random шахматы

16.11.2017, 08:25; рейтинг: 1500