Памятка об исправленном (?) баге в шахматной ходилке для сайта
Ходилка описана и доступна для закачки тут. Исходная позиция FEN, в которой всплыла ошибка:
r2qkbnr/3b3p/2p1ppp1/2np4/3P4/1PN1P2P/1BP1QPP1/R3KBNR w KQkq - 0 1
Белые рокируют, получают шах ладьёй... и от него можно не уходить, например, сделать шаг пешкой! Место ошибки, вроде, такое - исходный блок из chess.js:
if (exInfo.isSimple) { var killed = position.board[fileTo + 16*rankTo]; position.board[fileTo + 16*rankTo] = position.board[fileFrom + 16*rankFrom]; position.board[fileFrom + 16*rankFrom] = '.'; var whiteKing = isWhiteKing ? fileTo + 16*rankTo : position.whiteKing; var blackKing = isBlackKing ? fileTo + 16*rankTo : position.blackKing; if (TestCheck(position, position.activeSide, position.activeSide == WHITE ? whiteKing : blackKing)) { position.board[fileFrom + 16*rankFrom] = position.board[fileTo + 16*rankTo]; position.board[fileTo + 16*rankTo] = killed; return false; } position.whiteKing = whiteKing; position.blackKing = blackKing; }
Это используется в GUI для перерисовки позиции:
if (!exInfo.isSimple) RefreshPositionDiv(div);
После рокировки exInfo.isSimple = false;
Получается, что при следующем ходе мы не проконтролируем шах рокировавшей стороне!
Правильно:
var killed = position.board[fileTo + 16*rankTo]; if (exInfo.isSimple) { position.board[fileTo + 16*rankTo] = position.board[fileFrom + 16*rankFrom]; position.board[fileFrom + 16*rankFrom] = '.'; } var whiteKing = isWhiteKing ? fileTo + 16*rankTo : position.whiteKing; var blackKing = isBlackKing ? fileTo + 16*rankTo : position.blackKing; if (TestCheck(position, position.activeSide, position.activeSide == WHITE ? whiteKing : blackKing)) { position.board[fileFrom + 16*rankFrom] = position.board[fileTo + 16*rankTo]; position.board[fileTo + 16*rankTo] = killed; return false; } position.whiteKing = whiteKing; position.blackKing = blackKing;
Второй тест:
r3kbnr/ppp1pppp/2nq4/3N1b2/3P4/4P3/PPPB1PPP/R2QKBNR b KQkq - 0 1
Чёрные рокируют, получают шах конем и могут потом не уходить от него. В исправленной версии такого нет.
Надеюсь, не осталось ещё одного бага с пешками...
r3kbnr/pp1b1ppp/n1Pppq2/8/6P1/4PP2/PPP4P/RNBQKBNR b KQkq - 0 1
Чёрные рокируют, любой шах пешкой с взятием, не уйти от него в исправленной версии не получится... Будем надеяться, одним багом меньше.
r3kbnr/pp1qpppp/2np4/2p5/b1P5/2NPP3/PP1BQPPP/R3KBNR w KQkq - 0 1
Ход белых, рокироваться через битое поле или после хода ладьёй (королём) по-прежнему нельзя.
Кстати, выборы президента ФИДЕ Карпов безумному Кирсану проиграл (это 4 разные ссылки) :( Илюмжинова открыто поддерживал помощник президента А. Дворкович - одна из самых тёмных и загадочных фигур нынешней политики, по мнению наблюдателей. Уж больно быстро сделал карьеру даже для еврейского мальчика...
30.09.2010, 00:18 [9173 просмотра]