我试图理解为每个棋子确定有效棋步的算法。我遇到的一个具体问题是,确定某件作品何时无法移动超过某个点,因为它被自己的颜色所阻挡,或者能够拍摄另一种相反的颜色但无法越过该点。
我为每件作品准备的简单算法是:
有效国王移动,如果棋子从(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时,移动才有效(仅对于白色 典当)。
任何建议将不胜感激。
答案 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
界面仅用于显示要点。您应该拥有一个董事会状态,以某种方式公开这些信息。