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

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

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

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

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

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


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

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

  свежие записипоиск по блогукомментариистатистикао "вирусах" в архивах .zip

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