如何确定有效的棋步?

时间:2019-03-03 18:52:24

标签: chess

我试图理解为每个棋子确定有效棋步的算法。我遇到的一个具体问题是,确定某件作品何时无法移动超过某个点,因为它被自己的颜色所阻挡,或者能够拍摄另一种相反的颜色但无法越过该点。

我为每件作品准备的简单算法是:

  

有效国王移动,如果棋子从(X1,Y1)移至(X2,Y2),则   仅当| X2-X1 | <= 1并且| Y2-Y1 | <= 1时,移动才有效。

     

有效的Bishop动作,如果棋子从(X1,Y1)移至(X2,Y2),则   当且仅当| X2-X1 | = | Y2-Y1 |。

     

有效的胡克车移动,如果棋子从(X1,Y1)移动到(X2,Y2),则   仅当X2 = X1或Y2 = Y1时,移动才有效。

     

有效的皇后举动,如果皇后的举动有效,则为有效   主教或白手起家。

     

有效骑士移动,如果棋子从(X1,Y1)移至(X2,Y2),则   仅当(| X2-X1 | = 1并且| Y2-Y1 | = 2)或(| X2-X1 | = 2   和| Y2-Y1 | = 1)。

     

有效的Pawn移动,如果棋子从(X1,Y1)移动到(X2,Y2),则   仅当X2 = X1并且Y2-Y1 = 1时,移动才有效(仅对于白色   典当)。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

您需要为此考虑板状态。 我认为,执行此操作的常用方法是检查路径上的每个单元格是否为空。

    public enum PieceColor { Black, White }
    public interface IBoard
    {
        bool IsEmpty(int x, int y);
        PieceColor GetPieceColor(int x, int y);
    }

    IBoard board;

    bool BishopCanMove(PieceColor bishopColor, int fromX, int fromY, int toX, int toY)
    {
        int pathLength = Mathf.Abs(toX - fromX);
        if (pathLength != Mathf.Abs(toY - fromY)) return false; // Not diagonal
        // Also validate if the coordinates are in the 0-7 range

        // Check all cells before the target
        for (int i = 1; i < pathLength; i++)
        {
            int x = fromX + i;
            int y = fromY + i;

            if(board.IsEmpty(x, y)) continue; // No obstacles here: keep going
            else return false; // Obstacle found before reaching target: the move is invalid
        }

        // Check target cell
        if (board.IsEmpty(toX, toY)) return true; // No piece: move is valid

        // There's a piece here: the move is valid only if we can capture
        return board.GetPieceColor(toX, toY) == bishopColor;
    }

IBoard界面仅用于显示要点。您应该拥有一个董事会状态,以某种方式公开这些信息。