国际象棋:在国际象棋中实施检查

Chess : implementing check in chess

我正在构建一个国际象棋游戏,我现在正在执行一个检查。 这是我的实现:

export function check(position, color) {
  let king;
  position.forEach((row) => {
    row.forEach((piece) => {
      if (piece.symbol == "k" && piece.color == color) king = piece;
    });
  });
  getAllLegalMoves(position, color === "w" ? "b" : "w").forEach((el) => {
    if (el.row == king.row && el.col == king.col) {
      return true;
    }
  });
  return false;
}

该函数执行以下操作:

  1. 在 8 * 8 二维棋子数组的位置数组中找到国王。
  2. 找出对方的合法走法
  3. 检查国王方格是否在对手可能的走法中

这是将棋子放入新方格的代码:

document.addEventListener("drop", function (event) {
  const { row, col } = dragged.parentNode.dataset;
  const piece = position[row][col];

  if (!piece.canMoveTo(position, event.target.dataset) || piece.color != turn)
    return;

  piece.movePiece(position, event.target.dataset);

  if (check(position, turn)) console.log("check");

  dragged.parentNode.removeChild(dragged);
  event.target.appendChild(dragged);
  if (turn == "w") turn = "b";
  else turn = "w";
});

首先我检查棋子是否可以移动到新的方格,如果是这样我移动棋子并且我检查移动棋子的玩家是否处于检查状态,如果是这样我记录检查,但它总是记录错误。你能帮我吗。谢谢。

答案如下:

export function check(position, color) {
  let king,
    inCheck = false;
  position.forEach((row) => {
    row.forEach((piece) => {
      if (piece.symbol == "k" && piece.color == color) king = piece;
    });
  });
  getAllLegalMoves(position, color === "w" ? "b" : "w").forEach((el) => {
    if (el.row == king.row && el.col == king.col) {
      inCheck = true;
    }
  });
  return inCheck;
}

我的第一个观察结果是您从没有执行任何操作的 forEach 函数返回 true。那么无论如何你总是返回 false 。试试这个:

export function check(position, color) {
  let king;
  position.forEach((row) => {
    row.forEach((piece) => {
      if (piece.symbol == "k" && piece.color == color) king = piece;
    });
  });
  return getAllLegalMoves(position, color === "w" ? "b" : "w").reduce((carry, el) => {
    if (carry) return carry;
    return el.row == king.row && el.col == king.col;
  }, false);
}