БлогNot. Памятка об исправленном (?) баге в шахматной ходилке для сайта

Памятка об исправленном (?) баге в шахматной ходилке для сайта

Ходилка описана и доступна для закачки тут. Исходная позиция 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 просмотра]


теги: ошибка javascript памятка шахматы

К этой статье пока нет комментариев, Ваш будет первым