Про шахматы Фишера и скрипт для начальной расстановки фигур в них
Из всех многочисленных альтернативных шахмат наиболее популярны, пожалуй, шахматы Фишера, по ним проводятся вполне представительные турниры, а некоторые гроссмейстеры (как правило, из "второго эшелона") активно их пропагандируют в качестве замены классике (например, Андрей Девяткин).
Суть фишеровской новации состоит в том, что расстановка фигур по первой линии выбирается случайным образом. Так как в этой случайности есть ограничения (чёрные и белые фигуры стоят симметрично, слоны должны быть разнопольными, а ладьи - с разных сторон от короля), то различных начальных позиций оказывается всего 960, почему шахматы Фишера ещё называют "Шахматы-960".
Идея Фишера была, конечно, в том, чтобы уйти в дебюте от "скучных схем", но выиграли ли мы больше, чем проиграли? На мой скромный любительский взгляд, шахматы Фишера обладают значительным количеством недостатков:
- Уже первый "вполне нормальный" ход белых может быть если не проигрывающим, то уводить в большой "минус" (пример, после 1. e4 f5!)
- Дебюты в Фишере чаще всего сводятся к фланговому развитию. Это не делает игру скучной, но это делает её другой, хотя и всё равно похожей на некоторые "маргинальные" начала в классике, вроде английского. Борьбу за центр и красивые гамбиты в Фишере вряд ли увидишь.
- В Фишере усиливается роль тактики, начиная от выбора первого хода. И кажущееся превосходство в количестве изначальных позиций во многом нивелируется ограниченным количеством дебютных структур, которые могут возникнуть в партиях сильных игроков. А для слабых игроков 960 бессмысленны, мы-то и в классику отлично можем "просто порубиться".
В общем, вот такая присказка, хотя с ней, конечно, можно не соглашаться. А в качестве сказки - маленькая "расставлялка" начальных позиций в шахматы Фишера с возможностью генерации картинки:
Идея такого алгоритма расстановки принадлежит Гансу Бодландеру (Hans L. Bodlaender).
Полный исходник скрипта, включая обрамление HTML, приводится ниже. Его можно сохранить как файл типа .html
, предполагается, что выбрана кодировка Юникода UTF-8.
<!DOCTYPE HTML> <html lang="ru"> <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
).
16.11.2017, 08:25 [3588 просмотров]