Exemple #1
0
        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);
                        }
                    }
                }
            }
        }
Exemple #2
0
        // 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);
                    }
                }
            }
        }