public static void GenerateKingMoves(Board board, int sourceSquare, List <Move> pseudoLegalMoves) { int piece = board.pieces[sourceSquare]; foreach (var square in preComputedKingMoves[sourceSquare]) { if (Piece.IsPieceType(board.pieces[square], Piece.none)) { pseudoLegalMoves.Add(new Move(sourceSquare, square)); } else if (Piece.GetPieceColor(piece) != Piece.GetPieceColor(board.pieces[square])) { pseudoLegalMoves.Add(new Move(sourceSquare, square)); } } /* CASTLELING */ if (!Piece.HasMoved(piece)) { /* LONG CASTLE */ if (Piece.IsPieceType(board.pieces[sourceSquare + directions[1]], Piece.none) && Piece.IsPieceType(board.pieces[sourceSquare + 2 * directions[1]], Piece.none) && Piece.IsPieceType(board.pieces[sourceSquare + 3 * directions[1]], Piece.none)) { int rookPiece = board.pieces[sourceSquare + 4 * directions[1]]; if (Piece.IsPieceType(rookPiece, Piece.rook)) { if (!Piece.HasMoved(rookPiece)) { Move move = new Move(sourceSquare, sourceSquare + 2 * directions[1]); move.canCastle = true; move.rookSquareSource = sourceSquare + 4 * directions[1]; move.rookSquareTarget = sourceSquare + directions[1]; pseudoLegalMoves.Add(move); } } } /* SHORT CASTLE */ if (Piece.IsPieceType(board.pieces[sourceSquare + directions[3]], Piece.none) && Piece.IsPieceType(board.pieces[sourceSquare + 2 * directions[3]], Piece.none)) { int rookPiece = board.pieces[sourceSquare + 3 * directions[3]]; if (Piece.IsPieceType(rookPiece, Piece.rook)) { if (!Piece.HasMoved(rookPiece)) { Move move = new Move(sourceSquare, sourceSquare + 2 * directions[3]); move.canCastle = true; move.rookSquareSource = sourceSquare + 3 * directions[3]; move.rookSquareTarget = sourceSquare + directions[3]; pseudoLegalMoves.Add(move); } } } } }
// TODO: this is messy, could be improved, also add en passant public static void GeneratePawnMoves(Board board, int sourceSquare, List <Move> pseudoLegalMoves) { int piece = board.pieces[sourceSquare]; int up = Piece.IsPieceColor(piece, Piece.black) ? directions[0] : directions[2]; if ((Piece.IsPieceColor(piece, Piece.black) && numSquaresToEdge[sourceSquare][0] > 0) || (Piece.IsPieceColor(piece, Piece.white) && numSquaresToEdge[sourceSquare][2] > 0)) { int targetSquareUp = sourceSquare + up; if (Piece.IsPieceType(board.pieces[targetSquareUp], Piece.none)) { Move move = new Move(sourceSquare, targetSquareUp); if ((Piece.IsPieceColor(piece, Piece.black) && numSquaresToEdge[sourceSquare][0] == 1) || (Piece.IsPieceColor(piece, Piece.white) && numSquaresToEdge[sourceSquare][2] == 1)) { move.canPromote = true; } pseudoLegalMoves.Add(move); if (!Piece.HasMoved(piece)) { int targetSquareDoubleUp = targetSquareUp + up; if (Piece.IsPieceType(board.pieces[targetSquareDoubleUp], Piece.none)) { pseudoLegalMoves.Add(new Move(sourceSquare, targetSquareDoubleUp)); } } } if (numSquaresToEdge[sourceSquare][1] > 0) { int targetSquareUpRight = targetSquareUp + directions[1]; if (!Piece.IsPieceType(board.pieces[targetSquareUpRight], Piece.none) && Piece.GetPieceColor(piece) != Piece.GetPieceColor(board.pieces[targetSquareUpRight])) { Move move = new Move(sourceSquare, targetSquareUpRight); if ((Piece.IsPieceColor(piece, Piece.black) && numSquaresToEdge[sourceSquare][0] == 1) || (Piece.IsPieceColor(piece, Piece.white) && numSquaresToEdge[sourceSquare][2] == 1)) { move.canPromote = true; } pseudoLegalMoves.Add(move); } } if (numSquaresToEdge[sourceSquare][3] > 0) { int targetSquareUpLeft = targetSquareUp + directions[3]; if (!Piece.IsPieceType(board.pieces[targetSquareUpLeft], Piece.none) && Piece.GetPieceColor(piece) != Piece.GetPieceColor(board.pieces[targetSquareUpLeft])) { Move move = new Move(sourceSquare, targetSquareUpLeft); if ((Piece.IsPieceColor(piece, Piece.black) && numSquaresToEdge[sourceSquare][0] == 1) || (Piece.IsPieceColor(piece, Piece.white) && numSquaresToEdge[sourceSquare][2] == 1)) { move.canPromote = true; } pseudoLegalMoves.Add(move); } } } }