コード例 #1
0
ファイル: Position.cs プロジェクト: Cholix/CholaChess
        public MoveList GetLegalMoves()
        {
            MoveList moveList = new MoveList();

            int   fromSquareIndex;
            int   toSquareIndex;
            ulong bbToSquares;

            ulong bbMyPieces        = Pieces[ColorToMove];
            ulong bbEnemyPieces     = Pieces[1 - ColorToMove];
            ulong bbNotMyPieces     = ~bbMyPieces;
            ulong bbAllPieces       = bbMyPieces | bbEnemyPieces;
            ulong bbEmptySquare     = ~bbAllPieces;
            int   myKingSquareIndex = BitBoard.GetIndexOfFirstBit(Pieces[ColorToMove | BitBoard.PIECE_TYPE_KING]);

            #region Generate King Moves

            fromSquareIndex = myKingSquareIndex;
            bbToSquares     = BitBoard.KingAttack[myKingSquareIndex] & bbNotMyPieces;
            while (bbToSquares != 0)
            {
                toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
                moveList.AddMove(fromSquareIndex, toSquareIndex);
            }

            if (CastleQueenside[ColorToMove] &&
                ((bbAllPieces & BitBoard.Square[myKingSquareIndex - 1]) == 0) &&
                ((bbAllPieces & BitBoard.Square[myKingSquareIndex - 2]) == 0) &&
                ((bbAllPieces & BitBoard.Square[myKingSquareIndex - 3]) == 0) &&
                !IsSquareAttacked(1 - ColorToMove, myKingSquareIndex) &&
                !IsSquareAttacked(1 - ColorToMove, myKingSquareIndex - 1) &&
                !IsSquareAttacked(1 - ColorToMove, myKingSquareIndex - 2))
            {
                moveList.AddMove(myKingSquareIndex, myKingSquareIndex - 2);
            }

            if (CastleKingside[ColorToMove] &&
                ((bbAllPieces & BitBoard.Square[myKingSquareIndex + 1]) == 0) &&
                ((bbAllPieces & BitBoard.Square[myKingSquareIndex + 2]) == 0) &&
                !IsSquareAttacked(1 - ColorToMove, myKingSquareIndex) &&
                !IsSquareAttacked(1 - ColorToMove, myKingSquareIndex + 1) &&
                !IsSquareAttacked(1 - ColorToMove, myKingSquareIndex + 2))
            {
                moveList.AddMove(myKingSquareIndex, myKingSquareIndex + 2);
            }

            #endregion Generate King Moves

            #region Generate Rook & Queen Moves

            ulong bbRooksAndQuens = Pieces[ColorToMove | BitBoard.PIECE_TYPE_ROOK] | Pieces[ColorToMove | BitBoard.PIECE_TYPE_QUEEN];
            while (bbRooksAndQuens != 0)
            {
                fromSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbRooksAndQuens);
                bbToSquares     = BitBoard.GetRookAttacks(fromSquareIndex, bbAllPieces) & bbNotMyPieces;
                while (bbToSquares != 0)
                {
                    toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
                    moveList.AddMove(fromSquareIndex, toSquareIndex);
                }
            }

            #endregion Generate Rook & Queen Moves

            #region Generate Bishop & Queen Moves

            ulong bbBishopsAndQuens = Pieces[ColorToMove | BitBoard.PIECE_TYPE_BISHOP] | Pieces[ColorToMove | BitBoard.PIECE_TYPE_QUEEN];
            while (bbBishopsAndQuens != 0)
            {
                fromSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbBishopsAndQuens);
                bbToSquares     = BitBoard.GetBishopAttacks(fromSquareIndex, bbAllPieces) & bbNotMyPieces;
                while (bbToSquares != 0)
                {
                    toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
                    moveList.AddMove(fromSquareIndex, toSquareIndex);
                }
            }

            #endregion Generate Bishop & Queen Moves

            #region Generate Knight Moves

            ulong knights = Pieces[ColorToMove | BitBoard.PIECE_TYPE_KNIGHT];

            while (knights != 0)
            {
                fromSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref knights);
                bbToSquares     = BitBoard.KnightAttack[fromSquareIndex] & bbNotMyPieces;
                while (bbToSquares != 0)
                {
                    toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
                    moveList.AddMove(fromSquareIndex, toSquareIndex);
                }
            }

            #endregion Generate Knight Moves

            #region Generate Pawn Moves

            ulong pawns = Pieces[ColorToMove | BitBoard.PIECE_TYPE_PAWN];

            if (ColorToMove == BitBoard.COLOR_WHITE)
            {
                #region White pawn

                bbToSquares = (pawns << 8) & bbEmptySquare;
                ulong toSquares2           = ((bbToSquares & BitBoard.Rank[2]) << 8) & bbEmptySquare;
                ulong toSquareForPromotion = bbToSquares & BitBoard.Rank[7];
                bbToSquares &= BitBoard.NotRank[7];
                while (bbToSquares != 0)
                {
                    toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
                    moveList.AddMove(toSquareIndex - 8, toSquareIndex);
                }
                while (toSquares2 != 0)
                {
                    toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref toSquares2);
                    moveList.AddMoveEnPassant(toSquareIndex - 16, toSquareIndex, toSquareIndex - 8);
                }
                while (toSquareForPromotion != 0)
                {
                    toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref toSquareForPromotion);
                    moveList.AddMovePromotion(toSquareIndex - 8, toSquareIndex, BitBoard.PIECE_TYPE_QUEEN);
                    moveList.AddMovePromotion(toSquareIndex - 8, toSquareIndex, BitBoard.PIECE_TYPE_ROOK);
                    moveList.AddMovePromotion(toSquareIndex - 8, toSquareIndex, BitBoard.PIECE_TYPE_BISHOP);
                    moveList.AddMovePromotion(toSquareIndex - 8, toSquareIndex, BitBoard.PIECE_TYPE_KNIGHT);
                }
                //attacks
                bbToSquares = (pawns << 7) & BitBoard.NotFile[7] & (bbEnemyPieces | EnPassant);
                while (bbToSquares != 0)
                {
                    toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
                    moveList.AddMove(toSquareIndex - 7, toSquareIndex);
                }
                bbToSquares = (pawns << 9) & BitBoard.NotFile[0] & (bbEnemyPieces | EnPassant);
                while (bbToSquares != 0)
                {
                    toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
                    moveList.AddMove(toSquareIndex - 9, toSquareIndex);
                }

                #endregion White pawn
            }
            else
            {
                #region Black pawn

                bbToSquares = (pawns >> 8) & bbEmptySquare;
                ulong toSquares2           = ((bbToSquares & BitBoard.Rank[5]) >> 8) & bbEmptySquare;
                ulong toSquareForPromotion = bbToSquares & BitBoard.Rank[0];
                bbToSquares &= BitBoard.NotRank[0];
                while (bbToSquares != 0)
                {
                    toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
                    moveList.AddMove(toSquareIndex + 8, toSquareIndex);
                }
                while (toSquares2 != 0)
                {
                    toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref toSquares2);
                    moveList.AddMoveEnPassant(toSquareIndex + 16, toSquareIndex, toSquareIndex + 8);
                }
                while (toSquareForPromotion != 0)
                {
                    toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref toSquareForPromotion);
                    moveList.AddMovePromotion(toSquareIndex + 8, toSquareIndex, BitBoard.PIECE_TYPE_QUEEN);
                    moveList.AddMovePromotion(toSquareIndex + 8, toSquareIndex, BitBoard.PIECE_TYPE_ROOK);
                    moveList.AddMovePromotion(toSquareIndex + 8, toSquareIndex, BitBoard.PIECE_TYPE_BISHOP);
                    moveList.AddMovePromotion(toSquareIndex + 8, toSquareIndex, BitBoard.PIECE_TYPE_KNIGHT);
                }
                //attacks
                bbToSquares = (pawns >> 7) & BitBoard.NotFile[0] & (bbEnemyPieces | EnPassant);
                while (bbToSquares != 0)
                {
                    toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
                    moveList.AddMove(toSquareIndex + 7, toSquareIndex);
                }
                bbToSquares = (pawns >> 9) & BitBoard.NotFile[7] & (bbEnemyPieces | EnPassant);
                while (bbToSquares != 0)
                {
                    toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
                    moveList.AddMove(toSquareIndex + 9, toSquareIndex);
                }

                #endregion Black pawn
            }

            #endregion Generate Pawn Moves

            return(moveList);
        }
コード例 #2
0
ファイル: Position.cs プロジェクト: Cholix/CholaChess
        public MoveList GetLegalMoves()
        {
            MoveList moveList = new MoveList();

              int fromSquareIndex;
              int toSquareIndex;
              ulong bbToSquares;

              ulong bbMyPieces = Pieces[ColorToMove];
              ulong bbEnemyPieces = Pieces[1 - ColorToMove];
              ulong bbNotMyPieces = ~bbMyPieces;
              ulong bbAllPieces = bbMyPieces | bbEnemyPieces;
              ulong bbEmptySquare = ~bbAllPieces;
              int myKingSquareIndex = BitBoard.GetIndexOfFirstBit(Pieces[ColorToMove | BitBoard.PIECE_TYPE_KING]);

              #region Generate King Moves

              fromSquareIndex = myKingSquareIndex;
              bbToSquares = BitBoard.KingAttack[myKingSquareIndex] & bbNotMyPieces;
              while (bbToSquares != 0)
              {
            toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
            moveList.AddMove(fromSquareIndex, toSquareIndex);
              }

              if(CastleQueenside[ColorToMove]
            && ((bbAllPieces & BitBoard.Square[myKingSquareIndex - 1]) == 0)
            && ((bbAllPieces & BitBoard.Square[myKingSquareIndex - 2]) == 0)
            && ((bbAllPieces & BitBoard.Square[myKingSquareIndex - 3]) == 0)
            && !IsSquareAttacked(1 - ColorToMove, myKingSquareIndex)
            && !IsSquareAttacked(1 - ColorToMove, myKingSquareIndex - 1)
            && !IsSquareAttacked(1 - ColorToMove, myKingSquareIndex - 2))
              {
            moveList.AddMove(myKingSquareIndex, myKingSquareIndex - 2);
              }

              if (CastleKingside[ColorToMove]
            && ((bbAllPieces & BitBoard.Square[myKingSquareIndex + 1]) == 0)
            && ((bbAllPieces & BitBoard.Square[myKingSquareIndex + 2]) == 0)
            && !IsSquareAttacked(1 - ColorToMove, myKingSquareIndex)
            && !IsSquareAttacked(1 - ColorToMove, myKingSquareIndex + 1)
            && !IsSquareAttacked(1 - ColorToMove, myKingSquareIndex + 2))
              {
            moveList.AddMove(myKingSquareIndex, myKingSquareIndex + 2);
              }

              #endregion Generate King Moves

              #region Generate Rook & Queen Moves

              ulong bbRooksAndQuens = Pieces[ColorToMove | BitBoard.PIECE_TYPE_ROOK] | Pieces[ColorToMove | BitBoard.PIECE_TYPE_QUEEN];
              while (bbRooksAndQuens != 0)
              {
            fromSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbRooksAndQuens);
            bbToSquares = BitBoard.GetRookAttacks(fromSquareIndex, bbAllPieces) & bbNotMyPieces;
            while (bbToSquares != 0)
            {
              toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
              moveList.AddMove(fromSquareIndex, toSquareIndex);
            }
              }

              #endregion Generate Rook & Queen Moves

              #region Generate Bishop & Queen Moves

              ulong bbBishopsAndQuens = Pieces[ColorToMove | BitBoard.PIECE_TYPE_BISHOP] | Pieces[ColorToMove | BitBoard.PIECE_TYPE_QUEEN];
              while (bbBishopsAndQuens != 0)
              {
            fromSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbBishopsAndQuens);
            bbToSquares = BitBoard.GetBishopAttacks(fromSquareIndex, bbAllPieces) & bbNotMyPieces;
            while (bbToSquares != 0)
            {
              toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
              moveList.AddMove(fromSquareIndex, toSquareIndex);
            }
              }

              #endregion Generate Bishop & Queen Moves

              #region Generate Knight Moves

              ulong knights = Pieces[ColorToMove | BitBoard.PIECE_TYPE_KNIGHT];

              while (knights != 0)
              {
            fromSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref knights);
            bbToSquares = BitBoard.KnightAttack[fromSquareIndex] & bbNotMyPieces;
            while (bbToSquares != 0)
            {
              toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
              moveList.AddMove(fromSquareIndex, toSquareIndex);
            }
              }

              #endregion Generate Knight Moves

              #region Generate Pawn Moves

              ulong pawns = Pieces[ColorToMove | BitBoard.PIECE_TYPE_PAWN];

              if (ColorToMove == BitBoard.COLOR_WHITE)
              {
            #region White pawn

            bbToSquares = (pawns << 8) & bbEmptySquare;
            ulong toSquares2 = ((bbToSquares & BitBoard.Rank[2]) << 8) & bbEmptySquare;
            ulong toSquareForPromotion = bbToSquares & BitBoard.Rank[7];
            bbToSquares &= BitBoard.NotRank[7];
            while (bbToSquares != 0)
            {
              toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
              moveList.AddMove(toSquareIndex - 8, toSquareIndex);
            }
            while (toSquares2 != 0)
            {
              toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref toSquares2);
              moveList.AddMoveEnPassant(toSquareIndex - 16, toSquareIndex, toSquareIndex - 8);
            }
            while (toSquareForPromotion != 0)
            {
              toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref toSquareForPromotion);
              moveList.AddMovePromotion(toSquareIndex - 8, toSquareIndex, BitBoard.PIECE_TYPE_QUEEN);
              moveList.AddMovePromotion(toSquareIndex - 8, toSquareIndex, BitBoard.PIECE_TYPE_ROOK);
              moveList.AddMovePromotion(toSquareIndex - 8, toSquareIndex, BitBoard.PIECE_TYPE_BISHOP);
              moveList.AddMovePromotion(toSquareIndex - 8, toSquareIndex, BitBoard.PIECE_TYPE_KNIGHT);
            }
            //attacks
            bbToSquares = (pawns << 7) & BitBoard.NotFile[7] & (bbEnemyPieces | EnPassant);
            while (bbToSquares != 0)
            {
              toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
              moveList.AddMove(toSquareIndex - 7, toSquareIndex);
            }
            bbToSquares = (pawns << 9) & BitBoard.NotFile[0] & (bbEnemyPieces | EnPassant);
            while (bbToSquares != 0)
            {
              toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
              moveList.AddMove(toSquareIndex - 9, toSquareIndex);
            }

            #endregion White pawn
              }
              else
              {
            #region Black pawn

            bbToSquares = (pawns >> 8) & bbEmptySquare;
            ulong toSquares2 = ((bbToSquares & BitBoard.Rank[5]) >> 8) & bbEmptySquare;
            ulong toSquareForPromotion = bbToSquares & BitBoard.Rank[0];
            bbToSquares &= BitBoard.NotRank[0];
            while (bbToSquares != 0)
            {
              toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
              moveList.AddMove(toSquareIndex + 8, toSquareIndex);
            }
            while (toSquares2 != 0)
            {
              toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref toSquares2);
              moveList.AddMoveEnPassant(toSquareIndex + 16, toSquareIndex, toSquareIndex + 8);
            }
            while (toSquareForPromotion != 0)
            {
              toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref toSquareForPromotion);
              moveList.AddMovePromotion(toSquareIndex + 8, toSquareIndex, BitBoard.PIECE_TYPE_QUEEN);
              moveList.AddMovePromotion(toSquareIndex + 8, toSquareIndex, BitBoard.PIECE_TYPE_ROOK);
              moveList.AddMovePromotion(toSquareIndex + 8, toSquareIndex, BitBoard.PIECE_TYPE_BISHOP);
              moveList.AddMovePromotion(toSquareIndex + 8, toSquareIndex, BitBoard.PIECE_TYPE_KNIGHT);
            }
            //attacks
            bbToSquares = (pawns >> 7) & BitBoard.NotFile[0] & (bbEnemyPieces | EnPassant);
            while (bbToSquares != 0)
            {
              toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
              moveList.AddMove(toSquareIndex + 7, toSquareIndex);
            }
            bbToSquares = (pawns >> 9) & BitBoard.NotFile[7] & (bbEnemyPieces | EnPassant);
            while (bbToSquares != 0)
            {
              toSquareIndex = BitBoard.GetIndexOfFirstBitAndRemoveIt(ref bbToSquares);
              moveList.AddMove(toSquareIndex + 9, toSquareIndex);
            }

            #endregion Black pawn
              }

              #endregion Generate Pawn Moves

              return moveList;
        }