예제 #1
0
        public static void GeneratePawnMoves(Board board, MovesList movesList)
        {
            int piece     = board.side + pawnBit;
            int direction = board.side == white ? boardWidth : -boardWidth;


            Func <int, bool> promotionZone;
            Func <int, bool> pawnStartZone;

            if (board.side == white)
            {
                promotionZone = (int Square) => Square > (int)H6;
                pawnStartZone = (int square) => square < (int)A3;
            }
            else
            {
                pawnStartZone = (int Square) => Square > (int)H6;
                promotionZone = (int square) => square < (int)A3;
            }

            for (int i = 0; i < board.pieces[piece].Count; i++)
            {
                int square   = board.pieces[piece][i];
                int toSquare = square + direction;
                // promotions
                if (promotionZone(square))
                {
                    if (board[toSquare] == empty)
                    {
                        AddMove.PromotionMove(board, Move.Write(square, toSquare, 0, 0, false, false, false), movesList);
                    }
                    //captures
                    if ((board[toSquare + 1] & border) == enemy)
                    {
                        AddMove.PromotionMove(board, Move.Write(square, toSquare + 1, board[toSquare + 1], 0, false, false, false), movesList);
                    }

                    if ((board[toSquare - 1] & border) == enemy)
                    {
                        AddMove.PromotionMove(board, Move.Write(square, toSquare - 1, board[toSquare - 1], 0, false, false, false), movesList);
                    }
                }
                else
                {
                    if (board[toSquare] == empty)
                    {
                        AddMove.QuietPawnMove(board, Move.Write(square, toSquare, 0, 0, false, false, false), movesList);
                        //pawnstart
                        if (pawnStartZone(square) && (board[toSquare + direction] == empty))
                        {
                            AddMove.QuietPawnMove(board, Move.Write(square, toSquare + direction, 0, 0, false, true, false), movesList);
                        }
                    }
                    //captures
                    if ((board[toSquare + 1] & border) == enemy)
                    {
                        AddMove.PawnCaptureMove(board, Move.Write(square, toSquare + 1, board[toSquare + 1], 0, false, false, false), movesList);
                    }

                    if ((board[toSquare - 1] & border) == enemy)
                    {
                        AddMove.PawnCaptureMove(board, Move.Write(square, toSquare - 1, board[toSquare - 1], 0, false, false, false), movesList);
                    }
                    //enpassant
                    if (toSquare + 1 == board.enpassantSquare)
                    {
                        AddMove.EnpassantMove(board, Move.Write(square, board.enpassantSquare, board[board.enpassantSquare], 0, true, false, false), movesList);
                    }

                    if (toSquare - 1 == board.enpassantSquare)
                    {
                        AddMove.EnpassantMove(board, Move.Write(square, board.enpassantSquare, board[board.enpassantSquare], 0, true, false, false), movesList);
                    }
                }
            }
        }