Beispiel #1
0
        public static bool isOwnKingAttackable_TEST(ChessBoard cb, ColoredBitBoard legalMove, ChessPieceColors color)
        {
            bool flag;

            flag = isOwnKingAttackable(cb, legalMove, color);
            return(flag);
        }
Beispiel #2
0
        public void BestMoveTest_WhiteDepth2()
        {
            ChessBoard input = new ChessBoard();

            input.InitializeScenario(new ScenarioList {
                { BoardSquare.C2, ChessPieceType.Pawn, ChessPieceColors.White },
                { BoardSquare.B3, ChessPieceType.Pawn, ChessPieceColors.Black },
                { BoardSquare.H1, ChessPieceType.King, ChessPieceColors.White },
                { BoardSquare.B4, ChessPieceType.King, ChessPieceColors.Black },
                { BoardSquare.D3, ChessPieceType.Pawn, ChessPieceColors.Black }
            });

            //Used for depth 2
            bool            depth2MoveEqual = false;
            ColoredBitBoard depth2Test      = NegaMax.GetBestMove(input, 2, ChessPieceColors.White, GenerateStaticMoves_Depth12, GetStaticMaterialValueDepth2_White);
            PawnBitBoard    optimalMove     = new PawnBitBoard(ChessPieceColors.White);

            optimalMove.Bits = BoardSquare.D3;
            if (depth2Test is PawnBitBoard)
            {
                depth2Test = (PawnBitBoard)depth2Test;
                if (depth2Test.Bits == optimalMove.Bits)
                {
                    depth2MoveEqual = true;
                }
            }
            Assert.True(depth2MoveEqual);
        }
Beispiel #3
0
        private static bool isOwnKingAttackable(ChessBoard cb, ColoredBitBoard legalMove, ChessPieceColors color)
        {
            List <ColoredBitBoard> legalMoves  = new List <ColoredBitBoard>();
            EmptyBitBoard          blackPieces = new EmptyBitBoard();
            EmptyBitBoard          whitePieces = new EmptyBitBoard();
            EmptyBitBoard          allPieces   = new EmptyBitBoard();

            cb.Update(legalMove);

            blackPieces = MoveGenUtils.SetBlackBoard(cb);
            whitePieces = MoveGenUtils.SetWhiteBoard(cb);
            allPieces   = MoveGenUtils.SetWholeBoard(cb);

            legalMoves.AddRange(GeneratePseudoLegalNonSlidingMoves(cb, color, blackPieces, whitePieces, allPieces));
            legalMoves.AddRange(GeneratePseudoLegalSlidingMoves(cb, color, blackPieces, whitePieces, allPieces));

            foreach (ColoredBitBoard cbb in legalMoves)
            {
                if (color == ChessPieceColors.White && (cb.BlackKing.Bits & cbb.Bits) != 0)
                {
                    cb.Undo();
                    return(true);
                }
                else if (color == ChessPieceColors.Black && (cb.WhiteKing.Bits & cbb.Bits) != 0)
                {
                    cb.Undo();
                    return(true);
                }
            }

            cb.Undo();
            return(false);
        }
Beispiel #4
0
        public static List <KingBitBoard> KingBitBoardResults(ChessBoard inputChessBoard, ChessPieceColors color, BitBoard blackPieces, BitBoard whitePieces, BitBoard allPieces)
        {
            List <KingBitBoard> result = new List <KingBitBoard>();
            KingBitBoard        legalWhiteKingMoves = new KingBitBoard(ChessPieceColors.White);
            KingBitBoard        legalBlackKingMoves = new KingBitBoard(ChessPieceColors.Black);
            List <KingBitBoard> sepKingsOutput      = new List <KingBitBoard>();

            if (color == ChessPieceColors.White)
            {
                legalWhiteKingMoves = ComputeWhiteKing(inputChessBoard.WhiteKing, inputChessBoard, blackPieces, whitePieces, allPieces);
                sepKingsOutput      = ColoredBitBoard.SplitBitBoard(legalWhiteKingMoves).ToList();
                foreach (KingBitBoard sepKBB in sepKingsOutput)
                {
                    result.Add(sepKBB);
                }
                _numberOfWhiteKingMoves = result.Count;
            }
            else
            {
                legalBlackKingMoves = ComputeBlackKing(inputChessBoard.BlackKing, inputChessBoard, blackPieces, whitePieces, allPieces);
                sepKingsOutput      = ColoredBitBoard.SplitBitBoard(legalBlackKingMoves).ToList();
                foreach (KingBitBoard sepKBB in sepKingsOutput)
                {
                    result.Add(sepKBB);
                }
                _numberOfBlackKingMoves = result.Count;
            }

            return(result);
        }
        public void ConvertStringMoveToBitBoard_IsNullReturned_Equal()
        {
            ChessBoard chessBoard               = new ChessBoard();
            StringBitboardConverter converter   = new StringBitboardConverter(chessBoard, ChessPieceColors.White);
            string          stringMove          = "e4e5";
            ColoredBitBoard correctMoveBitBoard = converter.ConvertStringMoveToBitBoard(stringMove);

            Assert.Equal(null, correctMoveBitBoard);
        }
        public void SplitBitboard_IfCountZero_Equal()
        {
            PawnBitBoard bb = new PawnBitBoard(ChessPieceColors.Black);

            bb.Bits = 0x0;

            PawnBitBoard[] bbArr = new PawnBitBoard[0];
            Assert.Equal(bbArr, ColoredBitBoard.SplitBitBoard(bb));
        }
Beispiel #7
0
        private static bool isEnemyKingAttackable(ChessBoard cb, ColoredBitBoard legalMove, ChessPieceColors color)
        {
            List <ColoredBitBoard> legalMoves  = new List <ColoredBitBoard>();
            EmptyBitBoard          blackPieces = new EmptyBitBoard();
            EmptyBitBoard          whitePieces = new EmptyBitBoard();
            EmptyBitBoard          allPieces   = new EmptyBitBoard();

            cb.Update(legalMove);

            blackPieces = MoveGenUtils.SetBlackBoard(cb);
            whitePieces = MoveGenUtils.SetWhiteBoard(cb);
            allPieces   = MoveGenUtils.SetWholeBoard(cb);

            if (legalMove is PawnBitBoard)
            {
                legalMoves.AddRange(PawnMoveGen.PawnBitBoardResults(cb, color, blackPieces, whitePieces, allPieces));
            }
            else if (legalMove is BishopBitBoard)
            {
                legalMoves.AddRange(BishopMoveGen.BishopBitBoardResults(cb, color, blackPieces, whitePieces, allPieces));
            }
            else if (legalMove is KingBitBoard)
            {
                legalMoves.AddRange(KingMoveGen.KingBitBoardResults(cb, color, blackPieces, whitePieces, allPieces));
            }
            else if (legalMove is KnightBitBoard)
            {
                legalMoves.AddRange(KnightMoveGen.KnightBitBoardResults(cb, color, blackPieces, whitePieces, allPieces));
            }
            else if (legalMove is QueenBitBoard)
            {
                legalMoves.AddRange(QueenMoveGen.QueenBitBoardResults(cb, color, blackPieces, whitePieces, allPieces));
            }
            else if (legalMove is RookBitBoard)
            {
                legalMoves.AddRange(RookMoveGen.RookBitBoardResults(cb, color, blackPieces, whitePieces, allPieces));
            }

            foreach (ColoredBitBoard cbb in legalMoves)
            {
                if (color == ChessPieceColors.White && (cb.BlackKing.Bits & cbb.Bits) != 0)
                {
                    cb.Undo();
                    return(true);
                }
                else if (color == ChessPieceColors.Black && (cb.WhiteKing.Bits & cbb.Bits) != 0)
                {
                    cb.Undo();
                    return(true);
                }
            }

            cb.Undo();
            return(false);
        }
Beispiel #8
0
        public void Update(
            ChessPieceType pieceType,
            ColoredBitBoard oldBoard,
            ColoredBitBoard newBoard)
        {
            ulong difference = (ulong)oldBoard.Bits ^ (ulong)newBoard.Bits;
            ulong from       = difference & (ulong)oldBoard.Bits;
            ulong to         = difference & (ulong)newBoard.Bits;

            Update(pieceType, oldBoard.Color, (BoardSquare)to, (BoardSquare)from);
        }
Beispiel #9
0
        public void Undo_BlackRookRank2Forward_Equal()
        {
            ChessBoard testBoard = new ChessBoard();

            testBoard.InitializeGame();

            ColoredBitBoard[] InitMoves = new ColoredBitBoard[] {
                new PawnBitBoard(ChessPieceColors.White),
                new PawnBitBoard(ChessPieceColors.Black),
                new PawnBitBoard(ChessPieceColors.White),
                new RookBitBoard(ChessPieceColors.Black),
                new PawnBitBoard(ChessPieceColors.White),
                new RookBitBoard(ChessPieceColors.Black),
                new PawnBitBoard(ChessPieceColors.White),
                new RookBitBoard(ChessPieceColors.Black),
                new PawnBitBoard(ChessPieceColors.White)
            };

            InitMoves[0].Bits = testBoard.WhitePawn.Bits ^ BoardSquare.H2 ^ BoardSquare.H4;
            InitMoves[1].Bits = testBoard.BlackPawn.Bits ^ BoardSquare.A7 ^ BoardSquare.A5;
            InitMoves[2].Bits = InitMoves[0].Bits ^ BoardSquare.H4 ^ BoardSquare.H5;
            InitMoves[3].Bits = testBoard.BlackRook.Bits ^ BoardSquare.A8 ^ BoardSquare.A6;
            InitMoves[4].Bits = InitMoves[2].Bits ^ BoardSquare.H5 ^ BoardSquare.H6;
            InitMoves[5].Bits = InitMoves[3].Bits ^ BoardSquare.A6 ^ BoardSquare.D6;
            InitMoves[6].Bits = InitMoves[4].Bits ^ BoardSquare.G2 ^ BoardSquare.G4;
            InitMoves[7].Bits = InitMoves[5].Bits ^ BoardSquare.D6 ^ BoardSquare.D4;
            InitMoves[8].Bits = InitMoves[6].Bits ^ BoardSquare.G4 ^ BoardSquare.G5;
            int MoveNo = 0;

            foreach (ColoredBitBoard CBB_Mobil in InitMoves)
            {
                ulong expectedHashKey = testBoard.BoardHash.Key;
                testBoard.Update(CBB_Mobil);
                testBoard.Undo();
                Assert.Equal(expectedHashKey, testBoard.BoardHash.Key);
                testBoard.Update(CBB_Mobil);

                MoveNo++;
            }

            ulong        expectedKey = testBoard.BoardHash.Key;
            RookBitBoard move        = new RookBitBoard(ChessPieceColors.Black);

            move.Bits = InitMoves[7].Bits ^ BoardSquare.D4 ^ BoardSquare.D6;

            testBoard.Update(move);
            testBoard.Undo();

            Assert.Equal(expectedKey, testBoard.BoardHash.Key);
        }
Beispiel #10
0
 public TranspositionEntry(
     ulong hash,
     int depth,
     double score,
     bool ancient,
     EntryType nodeType)
 {
     Hash     = hash;
     Depth    = depth;
     Score    = score;
     Ancient  = ancient;
     NodeType = nodeType;
     BestMove = null;
 }
 public TranspositionEntry(
     ulong hash,
     int depth,
     double score,
     int ancient,
     TranspositionEntryType nodeType,
     ColoredBitBoard move)
 {
     Hash     = hash;
     Depth    = depth;
     Score    = score;
     Ancient  = ancient;
     NodeType = nodeType;
     Move     = move;
 }
Beispiel #12
0
        public static List <KnightBitBoard> KnightBitBoardResults(ChessBoard inputChessBoard, ChessPieceColors color, BitBoard blackPieces, BitBoard whitePieces, BitBoard allPieces)
        {
            List <KnightBitBoard> result = new List <KnightBitBoard>();
            List <Tuple <KnightBitBoard, KnightBitBoard> > legalKnightMoves = new List <Tuple <KnightBitBoard, KnightBitBoard> >();
            List <KnightBitBoard> sepKnightsInput  = new List <KnightBitBoard>();
            List <KnightBitBoard> sepKnightsOutput = new List <KnightBitBoard>();

            if (color == ChessPieceColors.White)
            {
                sepKnightsInput = ColoredBitBoard.SplitBitBoard(inputChessBoard.WhiteKnight).ToList();
                foreach (KnightBitBoard sepKnightBB in sepKnightsInput)
                {
                    legalKnightMoves.Add(new Tuple <KnightBitBoard, KnightBitBoard>(sepKnightBB, ComputeWhiteKnight(inputChessBoard, sepKnightBB, blackPieces, whitePieces, allPieces)));
                }
                for (int i = 0; i < legalKnightMoves.Count; i++)
                {
                    sepKnightsOutput = ColoredBitBoard.SplitBitBoard(legalKnightMoves[i].Item2).ToList();
                    foreach (KnightBitBoard sepKnightOutBB in sepKnightsOutput)
                    {
                        KnightBitBoard boardResult = new KnightBitBoard(color);
                        boardResult.Bits = (inputChessBoard.WhiteKnight.Bits ^ legalKnightMoves[i].Item1.Bits) | sepKnightOutBB.Bits;
                        result.Add(boardResult);
                    }
                }
            }
            else
            {
                sepKnightsInput = ColoredBitBoard.SplitBitBoard(inputChessBoard.BlackKnight).ToList();
                foreach (KnightBitBoard sepKnightBB in sepKnightsInput)
                {
                    legalKnightMoves.Add(new Tuple <KnightBitBoard, KnightBitBoard>(sepKnightBB, ComputeBlackKnight(inputChessBoard, sepKnightBB, blackPieces, whitePieces, allPieces)));
                }
                for (int i = 0; i < legalKnightMoves.Count; i++)
                {
                    sepKnightsOutput = ColoredBitBoard.SplitBitBoard(legalKnightMoves[i].Item2).ToList();
                    foreach (KnightBitBoard sepKnightOutBB in sepKnightsOutput)
                    {
                        KnightBitBoard boardResult = new KnightBitBoard(color);
                        boardResult.Bits = (inputChessBoard.BlackKnight.Bits ^ legalKnightMoves[i].Item1.Bits) | sepKnightOutBB.Bits;
                        result.Add(boardResult);
                    }
                }
            }
            return(result);
        }
Beispiel #13
0
        public static List <BishopBitBoard> BishopBitBoardResults(ChessBoard inputChessBoard, ChessPieceColors color, BitBoard blackPieces, BitBoard whitePieces, BitBoard allPieces)
        {
            List <BishopBitBoard> result = new List <BishopBitBoard>();
            List <Tuple <BishopBitBoard, BishopBitBoard> > legalBishopMoves = new List <Tuple <BishopBitBoard, BishopBitBoard> >();
            List <BishopBitBoard> sepBishopsInput  = new List <BishopBitBoard>();
            List <BishopBitBoard> sepBishopsOutput = new List <BishopBitBoard>();

            if (color == ChessPieceColors.White)
            {
                sepBishopsInput = ColoredBitBoard.SplitBitBoard(inputChessBoard.WhiteBishop).ToList();
                foreach (BishopBitBoard sepBishopBB in sepBishopsInput)
                {
                    legalBishopMoves.Add(new Tuple <BishopBitBoard, BishopBitBoard>(sepBishopBB, ComputeWhiteBishop(sepBishopBB, whitePieces, allPieces)));
                }
                for (int i = 0; i < legalBishopMoves.Count; i++)
                {
                    sepBishopsOutput = ColoredBitBoard.SplitBitBoard(legalBishopMoves[i].Item2).ToList();
                    foreach (BishopBitBoard sepBishopOutBB in sepBishopsOutput)
                    {
                        BishopBitBoard boardResult = new BishopBitBoard(color);
                        boardResult.Bits = (inputChessBoard.WhiteBishop.Bits ^ legalBishopMoves[i].Item1.Bits) | sepBishopOutBB.Bits;
                        result.Add(boardResult);
                    }
                }
            }
            else
            {
                sepBishopsInput = ColoredBitBoard.SplitBitBoard(inputChessBoard.BlackBishop).ToList();
                foreach (BishopBitBoard sepBishopBB in sepBishopsInput)
                {
                    legalBishopMoves.Add(new Tuple <BishopBitBoard, BishopBitBoard>(sepBishopBB, ComputeBlackBishop(sepBishopBB, blackPieces, allPieces)));
                }
                for (int i = 0; i < legalBishopMoves.Count; i++)
                {
                    sepBishopsOutput = ColoredBitBoard.SplitBitBoard(legalBishopMoves[i].Item2).ToList();
                    foreach (BishopBitBoard sepBishopOutBB in sepBishopsOutput)
                    {
                        BishopBitBoard boardResult = new BishopBitBoard(color);
                        boardResult.Bits = (inputChessBoard.BlackBishop.Bits ^ legalBishopMoves[i].Item1.Bits) | sepBishopOutBB.Bits;
                        result.Add(boardResult);
                    }
                }
            }
            return(result);
        }
Beispiel #14
0
        private static void EvalFail()
        {
            ChessBoard lolBoard = new ChessBoard();

            lolBoard.InitializeGame();
            //White
            PawnBitBoard pawnWhite = new PawnBitBoard(ChessPieceColors.White);

            pawnWhite.Bits = BoardSquare.A2 | BoardSquare.B2 | BoardSquare.C2 | BoardSquare.D2 | BoardSquare.E2 | BoardSquare.F2 | BoardSquare.G2 | BoardSquare.H3;

            PawnBitBoard pawnBlack = new PawnBitBoard(ChessPieceColors.Black);

            pawnBlack.Bits = BoardSquare.A7 | BoardSquare.B7 | BoardSquare.C7 | BoardSquare.D7 | BoardSquare.E7 | BoardSquare.F5 | BoardSquare.G7 | BoardSquare.H7;

            lolBoard.Update(pawnWhite);
            lolBoard.Update(pawnBlack);
            ColoredBitBoard bestMove = NegaMax.GetBestMove(lolBoard, 3, ChessPieceColors.White, MoveGen.GenerateLegalMoves, Eval.EvaluateState);
        }
        public void ConvertStringMoveToBitBoard_IsCorrectBitBoardReturned_Equals()
        {
            ChessBoard chessBoard = new ChessBoard();

            chessBoard.BlackKnight.Bits = BoardSquare.B8 | BoardSquare.G8;
            string stringMove = "b8c6";

            StringBitboardConverter converter = new StringBitboardConverter(chessBoard, ChessPieceColors.Black);

            ColoredBitBoard currentMoveBitBoard = converter.ConvertStringMoveToBitBoard(stringMove);

            ColoredBitBoard correctMoveBitBoard = new KnightBitBoard(ChessPieceColors.Black);

            correctMoveBitBoard.Bits = BoardSquare.C6 | BoardSquare.G8;

            Assert.Equal(currentMoveBitBoard.GetType(), correctMoveBitBoard.GetType());
            Assert.Equal(currentMoveBitBoard.Bits, correctMoveBitBoard.Bits);
        }
Beispiel #16
0
        public void Undo_WhiteRookRank2Backward_Equal()
        {
            ChessBoard testBoard = new ChessBoard();

            testBoard.InitializeGame();

            ColoredBitBoard[] InitMoves = new ColoredBitBoard[] {
                new PawnBitBoard(ChessPieceColors.White),
                new KnightBitBoard(ChessPieceColors.Black),
                new RookBitBoard(ChessPieceColors.White),
                new KnightBitBoard(ChessPieceColors.Black),
                new RookBitBoard(ChessPieceColors.White),
                new KnightBitBoard(ChessPieceColors.Black),
                new RookBitBoard(ChessPieceColors.White),
                new KnightBitBoard(ChessPieceColors.Black)
            };

            InitMoves[0].Bits = testBoard.WhitePawn.Bits ^ BoardSquare.H2 ^ BoardSquare.H4;
            InitMoves[1].Bits = testBoard.BlackKnight.Bits ^ BoardSquare.B8 ^ BoardSquare.A6;
            InitMoves[2].Bits = testBoard.WhiteRook.Bits ^ BoardSquare.H1 ^ BoardSquare.H3;
            InitMoves[3].Bits = InitMoves[1].Bits ^ BoardSquare.A6 ^ BoardSquare.B8;
            InitMoves[4].Bits = InitMoves[2].Bits ^ BoardSquare.H3 ^ BoardSquare.D3;
            InitMoves[5].Bits = InitMoves[3].Bits ^ BoardSquare.B8 ^ BoardSquare.A6;
            InitMoves[6].Bits = InitMoves[4].Bits ^ BoardSquare.D3 ^ BoardSquare.D4;
            InitMoves[7].Bits = InitMoves[5].Bits ^ BoardSquare.A6 ^ BoardSquare.B8;

            foreach (ColoredBitBoard CBB_Mobil in InitMoves)
            {
                testBoard.Update(CBB_Mobil);
            }

            ulong        expectedKey = testBoard.BoardHash.Key;
            RookBitBoard move        = new RookBitBoard(ChessPieceColors.White);

            move.Bits = InitMoves[6].Bits ^ BoardSquare.D4 ^ BoardSquare.D2;

            testBoard.Update(move);
            testBoard.Undo();

            Assert.Equal(expectedKey, testBoard.BoardHash.Key);
        }
        public string ConvertBitBoardMoveToString(ColoredBitBoard bitBoard)
        {
            ColoredBitBoard toBitBoard   = bitBoard.DeepCopy();
            ColoredBitBoard fromBitBoard = _chessBoard.GetOldBitBoardFromBitBoard(toBitBoard);

            System.Diagnostics.Debug.Assert(bitBoard.Bits != fromBitBoard.Bits);

            EmptyBitBoard containerBitBoard = new EmptyBitBoard();

            containerBitBoard.Bits = fromBitBoard.Bits;
            fromBitBoard.Bits      = (fromBitBoard.Bits | toBitBoard.Bits) ^ toBitBoard.Bits;
            toBitBoard.Bits        = (fromBitBoard.Bits | toBitBoard.Bits) ^ containerBitBoard.Bits;

            string stringMove = fromBitBoard.Bits.ToString().ToLower() + toBitBoard.Bits.ToString().ToLower();

            if (fromBitBoard is PawnBitBoard)
            {
                PawnBitBoard toPawnBitBoardPromotion = (PawnBitBoard)toBitBoard;
                if (toPawnBitBoardPromotion.IsPromoted)
                {
                    switch (toPawnBitBoardPromotion.Promotion)
                    {
                    case PawnBitBoard.PromotionPiece.Queen:
                        return(stringMove + "q");

                    case PawnBitBoard.PromotionPiece.Rook:
                        return(stringMove + "r");

                    case PawnBitBoard.PromotionPiece.Bishop:
                        return(stringMove + "b");

                    case PawnBitBoard.PromotionPiece.Knight:
                        return(stringMove + "n");

                    default:
                        throw new ArgumentOutOfRangeException("A promoted pawn bit board must contain a promotion type.");
                    }
                }
            }
            return(stringMove);
        }
Beispiel #18
0
        /// <summary>
        /// Decides the best move for the player given by the color parameter, with a search
        /// of the given depth.
        /// </summary>
        public static ColoredBitBoard GetBestMove(ChessBoard board, int depth, ChessPieceColors color, GenerateMoveDelegate GenerateMoves, GetMaterialDelegate GetMaterialValue)
        {
            Debug.Assert(board != null);
            Debug.Assert(depth > 0);
            Debug.Assert(GenerateMoves != null);
            Debug.Assert(GetMaterialValue != null);

            //Alpha, have to add one to change symbol later otherwise overflow.
            double a = int.MinValue + 1;
            //Beta value.
            double                 b        = int.MaxValue;
            double                 val      = 0;
            ColoredBitBoard        bestMove = null;
            List <ColoredBitBoard> moves    = GenerateMoves(board, color);
            var ttEntry = new TranspositionEntry(board.BoardHash.Key, depth, val, false, EntryType.Exact);

            foreach (ColoredBitBoard move in moves)
            {
                board.Update(move);
                if (color == ChessPieceColors.Black)
                {
                    val = -NegaMaxAlgorithm(board, depth - 1, -b, -a, ChessPieceColors.White, GenerateMoves, GetMaterialValue);
                }
                else if (color == ChessPieceColors.White)
                {
                    val = -NegaMaxAlgorithm(board, depth - 1, -b, -a, ChessPieceColors.Black, GenerateMoves, GetMaterialValue);
                }
                if (val > a)
                {
                    a                = val;
                    bestMove         = move;
                    ttEntry.BestMove = move;
                    ttEntry.Score    = a;
                }

                board.Undo();
            }
            TranspositionTable.TranspositionCache.Add(ttEntry);
            return(bestMove);
        }
        public void SplitBitboard_UseCase_Equal()
        {
            PawnBitBoard bb = new PawnBitBoard(ChessPieceColors.Black);

            bb.Bits = BoardSquare.H1 | BoardSquare.G1 | BoardSquare.E1;
            PawnBitBoard bb_1 = new PawnBitBoard(ChessPieceColors.Black);

            bb_1.Bits = BoardSquare.H1;
            PawnBitBoard bb_2 = new PawnBitBoard(ChessPieceColors.Black);

            bb_2.Bits = BoardSquare.G1;
            PawnBitBoard bb_4 = new PawnBitBoard(ChessPieceColors.Black);

            bb_4.Bits = BoardSquare.E1;

            IEnumerable <BitBoard> splits = ColoredBitBoard.SplitBitBoard(bb);

            Assert.Equal(3, splits.Count());
            Assert.Contains(bb_1, splits, new BitBoardEqualityComparer());
            Assert.Contains(bb_2, splits, new BitBoardEqualityComparer());
            Assert.Contains(bb_4, splits, new BitBoardEqualityComparer());
        }
Beispiel #20
0
        private static double EvaluatePosition(ChessBoard board)
        {
            List <int>      indexes;
            double          blackResult     = 0;
            double          whiteResult     = 0;
            double          result          = 0;
            List <BitBoard> blackEnumerator = new List <BitBoard>()
            {
                board.BlackBishop, board.BlackKing, board.BlackKnight,
                board.BlackPawn, board.BlackQueen, board.BlackRook,
            };
            List <BitBoard> whiteEnumerator = new List <BitBoard>()
            {
                board.WhiteBishop, board.WhiteKing, board.WhiteKnight,
                board.WhitePawn, board.WhiteQueen, board.WhiteRook,
            };


            foreach (ColoredBitBoard bb in blackEnumerator)
            {
                indexes = BitBoard.PositionIndexFromBoardSquare(ColoredBitBoard.SplitBitBoardToBoardSquares(bb).ToList());
                foreach (int index in indexes)
                {
                    blackResult += bb.PositionValues[index - 1];
                }
            }

            foreach (ColoredBitBoard bb in whiteEnumerator)
            {
                indexes = BitBoard.PositionIndexFromBoardSquare(ColoredBitBoard.SplitBitBoardToBoardSquares(bb).ToList());
                foreach (int index in indexes)
                {
                    whiteResult += bb.PositionValues[index - 1];
                }
            }
            result = whiteResult - blackResult;
            return(result);
        }
Beispiel #21
0
        public static List <ColoredBitBoard> SortMovesByPV(List <ColoredBitBoard> legalMoves, ChessBoard inputChessBoard, BitBoard blackMoves, BitBoard whiteMoves)
        {
            TranspositionEntry entry = TranspositionTable.TranspositionCache[inputChessBoard.BoardHash.Key];

            if (entry == null || entry.BestMove == null)
            {
                return(legalMoves);
            }
            ColoredBitBoard bestmove = entry.BestMove;

            if (bestmove is PawnBitBoard && ((PawnBitBoard)bestmove).Color == ChessPieceColors.White && legalMoves[0].Color == ChessPieceColors.White)
            {
                Debug.Assert(bestmove.Bits != inputChessBoard.WhitePawn.Bits);
            }
            ColoredBitBoard bestmoveInLegalMoves = legalMoves.Find(p => p.Equals(bestmove));

            if (bestmoveInLegalMoves != null)
            {
                legalMoves.Remove(bestmoveInLegalMoves);
                legalMoves.Insert(0, bestmove);
            }
            return(legalMoves);
        }
Beispiel #22
0
        /// <summary>
        /// Implementation of the NegaMax algorithm.
        /// <param name="board"></param>
        /// <param name="depth"></param>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="color"></param>
        /// <param name="GenerateMoves"></param>
        /// <param name="GetMaterialValue"></param>
        /// <returns></returns>
        public static double NegaMaxAlgorithm(
            ChessBoard board,
            int depth, double a, double b,
            ChessPieceColors color,
            GenerateMoveDelegate GenerateMoves,
            GetMaterialDelegate GetMaterialValue
            )
        {
            ColoredBitBoard bestMove = null;
            var             hashBeforeTermCondition = board.BoardHash.Key;
            var             termCondition           = IsTerminal(board, color, GenerateMoves);

            Debug.Assert(hashBeforeTermCondition == board.BoardHash.Key);
            if (termCondition == TerminalConditions.Win ||
                termCondition == TerminalConditions.Draw ||
                depth == 0)
            {
                return((int)color * (GetMaterialValue(board)));
            }
            else
            {
                bool  usingTT         = false;
                ulong hash_beforeMove = board.BoardHash.Key;
                var   ttEntry         = TranspositionTable.TranspositionCache[board.BoardHash.Key];
                if (ttEntry != null &&
                    ttEntry.Hash == board.BoardHash.Key &&
                    ttEntry.Depth >= depth
                    )
                {
                    if (ttEntry.NodeType == EntryType.Alpha && ttEntry.Score <= a)
                    {
                        return(a);
                    }

                    if (ttEntry.NodeType == EntryType.Beta && ttEntry.Score >= b)
                    {
                        return(b);
                    }
                    if (ttEntry.NodeType == EntryType.Exact)
                    {
                        return(ttEntry.Score);
                    }
                    usingTT = true;
                }

                TranspositionEntry newEntry = new TranspositionEntry(board.BoardHash.Key, depth, 0, false, EntryType.Alpha);

                List <ColoredBitBoard> moves = new List <ColoredBitBoard>();
                moves = GenerateMoves(board, color);

                foreach (ColoredBitBoard move in moves)
                {
                    double val = 0;
                    board.Update(move);
                    var hashBeforeRec = board.BoardHash.Key;
                    if (color == ChessPieceColors.White)
                    {
                        val = -NegaMaxAlgorithm(board, depth - 1, -b, -a, ChessPieceColors.Black, GenerateMoves, GetMaterialValue);
                    }
                    else if (color == ChessPieceColors.Black)
                    {
                        val = -NegaMaxAlgorithm(board, depth - 1, -b, -a, ChessPieceColors.White, GenerateMoves, GetMaterialValue);
                    }
                    Debug.Assert(hashBeforeRec == board.BoardHash.Key);
                    board.Undo();
                    usingTT = false;
                    if (val >= b)
                    {
                        if (!usingTT)
                        {
                            newEntry.NodeType = EntryType.Beta;
                            newEntry.Score    = val;
                            TranspositionTable.TranspositionCache.Add(newEntry);
                            Debug.Assert(hash_beforeMove == board.BoardHash.Key, "Board hash changed during update/undo");
                        }
                        return(val);
                    }
                    if (val >= a)
                    {
                        a                 = val;
                        bestMove          = move;
                        newEntry.NodeType = EntryType.Exact;
                    }

                    Debug.Assert(hash_beforeMove == board.BoardHash.Key, "Board hash changed during update/undo");
                }
                if (!usingTT)
                {
                    if (newEntry.NodeType == EntryType.Exact)
                    {
                        newEntry.BestMove = bestMove;
                    }
                    newEntry.Score = a;
                    TranspositionTable.TranspositionCache.Add(newEntry);
                }
                return(a);
            }
        }
Beispiel #23
0
        /*  private static void WinBoardCastlingFAIL( ChessBoard chessBoard, ChessPieceColors winboardColor ) {
         *  _winboardConverter = new StringBitboardConverter( chessBoard, winboardColor );
         *  ColoredBitBoard bitBoardMoveRecived = _winboardConverter.ConvertStringMoveToBitBoard( "E8G8" );
         *  chessBoard.Update( bitBoardMoveRecived );
         * }*/
        private static void FAILFAILtest()
        {
            ChessBoard lolboard = new ChessBoard();

            lolboard.InitializeGame();

            PawnBitBoard pawnWhite = new PawnBitBoard(ChessPieceColors.White);

            pawnWhite.Bits = BoardSquare.E4 | BoardSquare.B2 | BoardSquare.C2 | BoardSquare.D2 | BoardSquare.H2 | BoardSquare.G2 | BoardSquare.F2 | BoardSquare.A2;
            lolboard.Update(pawnWhite);

            PawnBitBoard pawnBlack = new PawnBitBoard(ChessPieceColors.Black);

            pawnBlack.Bits = BoardSquare.A7 | BoardSquare.B7 | BoardSquare.C7 | BoardSquare.D7 | BoardSquare.E5 | BoardSquare.F7 | BoardSquare.G7 | BoardSquare.H7;
            lolboard.Update(pawnBlack);

            KnightBitBoard lilleKnejtWhite = new KnightBitBoard(ChessPieceColors.White);

            lilleKnejtWhite.Bits = BoardSquare.C3 | BoardSquare.G1;
            lolboard.Update(lilleKnejtWhite);

            KnightBitBoard lilleKnejtBlack = new KnightBitBoard(ChessPieceColors.Black);

            lilleKnejtBlack.Bits = BoardSquare.C6 | BoardSquare.G8;
            lolboard.Update(lilleKnejtBlack);

            KnightBitBoard lilleKnejtWhitenummer2 = new KnightBitBoard(ChessPieceColors.White);

            lilleKnejtWhitenummer2.Bits = BoardSquare.C3 | BoardSquare.F3;
            lolboard.Update(lilleKnejtWhitenummer2);

            PawnBitBoard pawnBlacknummerto = new PawnBitBoard(ChessPieceColors.Black);

            pawnBlacknummerto.Bits = BoardSquare.A7 | BoardSquare.B7 | BoardSquare.C7 | BoardSquare.D5 | BoardSquare.E5 | BoardSquare.F7 | BoardSquare.G7 | BoardSquare.H7;
            lolboard.Update(pawnBlacknummerto);
            //INGEN FEJL!
            PawnBitBoard pawnWhitenummerto = new PawnBitBoard(ChessPieceColors.White);

            pawnWhitenummerto.Bits = BoardSquare.A2 | BoardSquare.B2 | BoardSquare.C2 | BoardSquare.D2 | BoardSquare.D5 | BoardSquare.G2 | BoardSquare.F2 | BoardSquare.H2;
            lolboard.Update(pawnWhitenummerto);
            //Måske fejl?
            KnightBitBoard lilleKnejtBlacknummerto = new KnightBitBoard(ChessPieceColors.Black);

            lilleKnejtBlacknummerto.Bits = BoardSquare.B4 | BoardSquare.G8;
            lolboard.Update(lilleKnejtBlacknummerto);

            KnightBitBoard lilleKnejtWhitenummer3 = new KnightBitBoard(ChessPieceColors.White);

            lilleKnejtWhitenummer3.Bits = BoardSquare.C3 | BoardSquare.E5;
            lolboard.Update(lilleKnejtWhitenummer3);

            KnightBitBoard lilleKnejtBlacknummertre = new KnightBitBoard(ChessPieceColors.Black);

            lilleKnejtBlacknummertre.Bits = BoardSquare.B4 | BoardSquare.F6;
            lolboard.Update(lilleKnejtBlacknummertre);

            BishopBitBoard lillebishopruner = new BishopBitBoard(ChessPieceColors.White);

            lillebishopruner.Bits = BoardSquare.C1 | BoardSquare.B5;
            lolboard.Update(lillebishopruner);



            ColoredBitBoard bestMove = NegaMax.GetBestMove(lolboard, 2, ChessPieceColors.Black, MoveGen.GenerateLegalMoves, Eval.EvaluateState);
        }
Beispiel #24
0
        private static void anotherIllegalMoveFromMovegen()
        {
            //Winboard winboard = new Winboard();
            ChessBoard lolBoard = new ChessBoard();

            lolBoard.InitializeGame();

            //White
            PawnBitBoard pawnWhite = new PawnBitBoard(ChessPieceColors.White);

            pawnWhite.Bits = BoardSquare.A3 | BoardSquare.C3 | BoardSquare.C4 | BoardSquare.F4 | BoardSquare.G4 | BoardSquare.H3;

            BishopBitBoard bishopWhite = new BishopBitBoard(ChessPieceColors.White);

            bishopWhite.Bits = 0;

            KingBitBoard kingWhite = new KingBitBoard(ChessPieceColors.White);

            kingWhite.Bits = BoardSquare.C2;

            RookBitBoard rookWhite = new RookBitBoard(ChessPieceColors.White);

            rookWhite.Bits = BoardSquare.A1 | BoardSquare.E2;

            KnightBitBoard knightWhite = new KnightBitBoard(ChessPieceColors.White);

            knightWhite.Bits = BoardSquare.B1;

            QueenBitBoard queenWhite = new QueenBitBoard(ChessPieceColors.White);

            queenWhite.Bits = 0;

            //Black
            PawnBitBoard pawnBlack = new PawnBitBoard(ChessPieceColors.Black);

            pawnBlack.Bits = BoardSquare.A7 | BoardSquare.B7 | BoardSquare.C6 | BoardSquare.E7 | BoardSquare.F7 | BoardSquare.G7 | BoardSquare.H7;

            RookBitBoard rookBlack = new RookBitBoard(ChessPieceColors.Black);

            rookBlack.Bits = BoardSquare.D8 | BoardSquare.H8;

            BishopBitBoard bishopBlack = new BishopBitBoard(ChessPieceColors.Black);

            bishopBlack.Bits = BoardSquare.F8;

            QueenBitBoard queenBlack = new QueenBitBoard(ChessPieceColors.Black);

            queenBlack.Bits = BoardSquare.D1;

            KingBitBoard kingBlack = new KingBitBoard(ChessPieceColors.Black);

            kingBlack.Bits = BoardSquare.C8;

            KnightBitBoard knightBlack = new KnightBitBoard(ChessPieceColors.Black);

            knightBlack.Bits = 0;


            //RookBitBoard badMove = new RookBitBoard( ChessPieceColors.Black );
            //badMove.Bits = BoardSquare.B8;
            lolBoard.Update(pawnWhite);
            lolBoard.Update(knightWhite);
            lolBoard.Update(queenWhite);
            lolBoard.Update(rookWhite);
            lolBoard.Update(bishopWhite);
            lolBoard.Update(kingWhite);
            lolBoard.Update(pawnBlack);
            lolBoard.Update(rookBlack);
            lolBoard.Update(bishopBlack);
            lolBoard.Update(queenBlack);
            lolBoard.Update(kingBlack);
            lolBoard.Update(knightBlack);


            ColoredBitBoard bestMove = NegaMax.GetBestMove(lolBoard, 3, ChessPieceColors.White, MoveGen.GenerateLegalMoves, Eval.EvaluateState);
        }
Beispiel #25
0
        private static void sacrificeQueenDebugStuffSomethingTestMethod()
        {
            //Winboard winboard = new Winboard();
            ChessBoard lolBoard = new ChessBoard();

            lolBoard.InitializeGame();

            //White
            PawnBitBoard pawnWhite = new PawnBitBoard(ChessPieceColors.White);

            pawnWhite.Bits = BoardSquare.A4 | BoardSquare.C2 | BoardSquare.D3 | BoardSquare.E4 | BoardSquare.F2 | BoardSquare.G2;

            BishopBitBoard bishopWhite = new BishopBitBoard(ChessPieceColors.White);

            bishopWhite.Bits = BoardSquare.E2 | BoardSquare.H4;

            KingBitBoard kingWhite = new KingBitBoard(ChessPieceColors.White);

            kingWhite.Bits = BoardSquare.E1;

            RookBitBoard rookWhite = new RookBitBoard(ChessPieceColors.White);

            rookWhite.Bits = BoardSquare.B1 | BoardSquare.H1;

            KnightBitBoard knightWhite = new KnightBitBoard(ChessPieceColors.White);

            knightWhite.Bits = BoardSquare.D2;

            QueenBitBoard queenWhite = new QueenBitBoard(ChessPieceColors.White);

            queenWhite.Bits = BoardSquare.D1;

            //Black
            PawnBitBoard pawnBlack = new PawnBitBoard(ChessPieceColors.Black);

            pawnBlack.Bits = BoardSquare.A7 | BoardSquare.B7 | BoardSquare.C5 | BoardSquare.E5 | BoardSquare.H5;
            RookBitBoard rookBlack = new RookBitBoard(ChessPieceColors.Black);

            rookBlack.Bits = BoardSquare.A8 | BoardSquare.H7;

            BishopBitBoard bishopBlack = new BishopBitBoard(ChessPieceColors.Black);

            bishopBlack.Bits = BoardSquare.C8 | BoardSquare.F8;

            QueenBitBoard queenBlack = new QueenBitBoard(ChessPieceColors.Black);

            queenBlack.Bits = BoardSquare.B4;

            KingBitBoard kingBlack = new KingBitBoard(ChessPieceColors.Black);

            kingBlack.Bits = BoardSquare.F7;

            KnightBitBoard knightBlack = new KnightBitBoard(ChessPieceColors.Black);

            knightBlack.Bits = BoardSquare.B8;


            //RookBitBoard badMove = new RookBitBoard( ChessPieceColors.Black );
            //badMove.Bits = BoardSquare.B8;
            lolBoard.Update(pawnWhite);
            lolBoard.Update(knightWhite);
            lolBoard.Update(queenWhite);
            lolBoard.Update(rookWhite);
            lolBoard.Update(bishopWhite);
            lolBoard.Update(kingWhite);
            lolBoard.Update(pawnBlack);
            lolBoard.Update(rookBlack);
            lolBoard.Update(bishopBlack);
            lolBoard.Update(queenBlack);
            lolBoard.Update(kingBlack);
            lolBoard.Update(knightBlack);

            List <ColoredBitBoard> legalMoves = new List <ColoredBitBoard>();

            legalMoves = MoveGen.GenerateLegalMoves(lolBoard, ChessPieceColors.Black);
            ColoredBitBoard bestMove = NegaMax.GetBestMove(lolBoard, 3, ChessPieceColors.Black, MoveGen.GenerateLegalMoves, Eval.EvaluateState);

            Console.Write(legalMoves.ToString() + bestMove.ToString());
        }
Beispiel #26
0
        public static List <PawnBitBoard> PawnBitBoardResults(ChessBoard inputChessBoard, ChessPieceColors color, BitBoard blackPieces, BitBoard whitePieces, BitBoard allPieces)
        {
            List <PawnBitBoard> result = new List <PawnBitBoard>();
            List <Tuple <PawnBitBoard, PawnBitBoard> > legalPawnMoves = new List <Tuple <PawnBitBoard, PawnBitBoard> >();
            List <PawnBitBoard> sepPawnsInput  = new List <PawnBitBoard>();
            List <PawnBitBoard> sepPawnsOutput = new List <PawnBitBoard>();

            if (color == ChessPieceColors.White)
            {
                sepPawnsInput = ColoredBitBoard.SplitBitBoard(inputChessBoard.WhitePawn).ToList();
                foreach (PawnBitBoard spb in sepPawnsInput)
                {
                    var newMove = new Tuple <PawnBitBoard, PawnBitBoard>(spb, ComputeWhitePawn(spb, inputChessBoard, blackPieces, whitePieces, allPieces));

                    legalPawnMoves.Add(newMove);
                }
                for (int i = 0; i < legalPawnMoves.Count; i++)
                {
                    sepPawnsOutput = ColoredBitBoard.SplitBitBoard(legalPawnMoves[i].Item2).ToList();
                    foreach (PawnBitBoard sepPBB in sepPawnsOutput)
                    {
                        if ((sepPBB.Bits & (BoardSquare)MoveGenUtils.RANK_8) != BoardSquare.Empty)
                        {
                            PawnBitBoard boardResult_B = new PawnBitBoard(color);
                            PawnBitBoard boardResult_R = new PawnBitBoard(color);
                            PawnBitBoard boardResult_N = new PawnBitBoard(color);
                            PawnBitBoard boardResult_Q = new PawnBitBoard(color);
                            boardResult_B.Bits = sepPBB.Bits;
                            boardResult_R.Bits = sepPBB.Bits;
                            boardResult_N.Bits = sepPBB.Bits;
                            boardResult_Q.Bits = sepPBB.Bits;
                            boardResult_B.Promote(PawnBitBoard.PromotionPiece.Bishop);
                            boardResult_R.Promote(PawnBitBoard.PromotionPiece.Rook);
                            boardResult_N.Promote(PawnBitBoard.PromotionPiece.Knight);
                            boardResult_Q.Promote(PawnBitBoard.PromotionPiece.Queen);
                            boardResult_B.Bits = (inputChessBoard.WhitePawn.Bits ^ legalPawnMoves[i].Item1.Bits) | sepPBB.Bits;
                            boardResult_R.Bits = (inputChessBoard.WhitePawn.Bits ^ legalPawnMoves[i].Item1.Bits) | sepPBB.Bits;
                            boardResult_N.Bits = (inputChessBoard.WhitePawn.Bits ^ legalPawnMoves[i].Item1.Bits) | sepPBB.Bits;
                            boardResult_Q.Bits = (inputChessBoard.WhitePawn.Bits ^ legalPawnMoves[i].Item1.Bits) | sepPBB.Bits;
                            result.Add(boardResult_B);
                            result.Add(boardResult_R);
                            result.Add(boardResult_N);
                            result.Add(boardResult_Q);
                        }
                        else
                        {
                            PawnBitBoard boardResult = new PawnBitBoard(color);
                            boardResult.Bits = (inputChessBoard.WhitePawn.Bits ^ legalPawnMoves[i].Item1.Bits) | sepPBB.Bits;

                            var         oldBoard = inputChessBoard.GetOldBitBoardFromBitBoard(inputChessBoard.WhitePawn);
                            BoardSquare bitsDiff = (BoardSquare)((ulong)oldBoard.Bits ^ (ulong)boardResult.Bits);
                            System.Diagnostics.Debug.Assert(new EmptyBitBoard((BoardSquare)((ulong)oldBoard.Bits ^ (ulong)boardResult.Bits)).Count == 2, "More than one piece moved");

                            result.Add(boardResult);
                        }
                    }
                }
            }
            else
            {
                sepPawnsInput = ColoredBitBoard.SplitBitBoard(inputChessBoard.BlackPawn).ToList();
                foreach (PawnBitBoard spb in sepPawnsInput)
                {
                    legalPawnMoves.Add(new Tuple <PawnBitBoard, PawnBitBoard>(spb, ComputeBlackPawn(spb, inputChessBoard, blackPieces, whitePieces, allPieces)));
                }
                for (int i = 0; i < legalPawnMoves.Count; i++)
                {
                    sepPawnsOutput = ColoredBitBoard.SplitBitBoard(legalPawnMoves[i].Item2).ToList();
                    foreach (PawnBitBoard sepPBB in sepPawnsOutput)
                    {
                        if ((sepPBB.Bits & (BoardSquare)MoveGenUtils.RANK_1) != BoardSquare.Empty)
                        {
                            PawnBitBoard boardResult_B = new PawnBitBoard(color);
                            PawnBitBoard boardResult_R = new PawnBitBoard(color);
                            PawnBitBoard boardResult_N = new PawnBitBoard(color);
                            PawnBitBoard boardResult_Q = new PawnBitBoard(color);
                            boardResult_B.Bits = sepPBB.Bits;
                            boardResult_R.Bits = sepPBB.Bits;
                            boardResult_N.Bits = sepPBB.Bits;
                            boardResult_Q.Bits = sepPBB.Bits;
                            boardResult_B.Promote(PawnBitBoard.PromotionPiece.Bishop);
                            boardResult_R.Promote(PawnBitBoard.PromotionPiece.Rook);
                            boardResult_N.Promote(PawnBitBoard.PromotionPiece.Knight);
                            boardResult_Q.Promote(PawnBitBoard.PromotionPiece.Queen);
                            boardResult_B.Bits = (inputChessBoard.BlackPawn.Bits ^ legalPawnMoves[i].Item1.Bits) | sepPBB.Bits;
                            boardResult_R.Bits = (inputChessBoard.BlackPawn.Bits ^ legalPawnMoves[i].Item1.Bits) | sepPBB.Bits;
                            boardResult_N.Bits = (inputChessBoard.BlackPawn.Bits ^ legalPawnMoves[i].Item1.Bits) | sepPBB.Bits;
                            boardResult_Q.Bits = (inputChessBoard.BlackPawn.Bits ^ legalPawnMoves[i].Item1.Bits) | sepPBB.Bits;
                            result.Add(boardResult_B);
                            result.Add(boardResult_R);
                            result.Add(boardResult_N);
                            result.Add(boardResult_Q);
                        }
                        else
                        {
                            PawnBitBoard boardResult = new PawnBitBoard(color);
                            boardResult.Bits = (inputChessBoard.BlackPawn.Bits ^ legalPawnMoves[i].Item1.Bits) | sepPBB.Bits;
                            result.Add(boardResult);
                        }
                    }
                }
            }
            return(result);
        }
Beispiel #27
0
        private static void anotherBlackQueenSideCastleFail()
        {
            ChessBoard lolBoard = new ChessBoard();

            lolBoard.InitializeGame();

            //White
            PawnBitBoard pawnWhite = new PawnBitBoard(ChessPieceColors.White);

            pawnWhite.Bits = BoardSquare.A2 | BoardSquare.C3 | BoardSquare.E3 | BoardSquare.H3;

            BishopBitBoard bishopWhite = new BishopBitBoard(ChessPieceColors.White);

            bishopWhite.Bits = 0;

            RookBitBoard rookWhite = new RookBitBoard(ChessPieceColors.White);

            rookWhite.Bits = BoardSquare.A1;

            KnightBitBoard knightWhite = new KnightBitBoard(ChessPieceColors.White);

            knightWhite.Bits = BoardSquare.B1;

            QueenBitBoard queenWhite = new QueenBitBoard(ChessPieceColors.White);

            queenWhite.Bits = BoardSquare.E2;

            KingBitBoard kingWhite = new KingBitBoard(ChessPieceColors.White);

            kingWhite.Bits = BoardSquare.D2;

            //black
            PawnBitBoard pawnBlack = new PawnBitBoard(ChessPieceColors.Black);

            pawnBlack.Bits = BoardSquare.A7 | BoardSquare.B7 | BoardSquare.C5 | BoardSquare.F7 | BoardSquare.G7 | BoardSquare.H5;

            BishopBitBoard bishopBlack = new BishopBitBoard(ChessPieceColors.Black);

            bishopBlack.Bits = BoardSquare.E4 | BoardSquare.F8;

            RookBitBoard rookBlack = new RookBitBoard(ChessPieceColors.Black);

            rookBlack.Bits = BoardSquare.A8 | BoardSquare.H8;

            KnightBitBoard knightBlack = new KnightBitBoard(ChessPieceColors.Black);

            knightBlack.Bits = BoardSquare.F4;

            QueenBitBoard queenBlack = new QueenBitBoard(ChessPieceColors.Black);

            queenBlack.Bits = BoardSquare.H3;

            KingBitBoard kingBlack = new KingBitBoard(ChessPieceColors.Black);

            kingBlack.Bits = BoardSquare.C8;

            //Update

            lolBoard.Update(pawnWhite);
            lolBoard.Update(knightWhite);
            lolBoard.Update(queenWhite);
            lolBoard.Update(rookWhite);
            lolBoard.Update(bishopWhite);
            lolBoard.Update(kingWhite);
            lolBoard.Update(pawnBlack);
            lolBoard.Update(rookBlack);
            lolBoard.Update(bishopBlack);
            lolBoard.Update(queenBlack);
            lolBoard.Update(kingBlack);
            lolBoard.Update(knightBlack);

            ColoredBitBoard bestMove = NegaMax.GetBestMove(lolBoard, 3, ChessPieceColors.White, MoveGen.GenerateLegalMoves, Eval.EvaluateState);
        }
Beispiel #28
0
 public static bool isEnemyKingAttackable_TEST(ChessBoard cb, ColoredBitBoard legalMove, ChessPieceColors color)
 {
     return(isEnemyKingAttackable(cb, legalMove, color));
 }
Beispiel #29
0
        private static void f3d5failmove()
        {
            //Winboard winboard = new Winboard();
            ChessBoard lolBoard = new ChessBoard();

            lolBoard.InitializeGame();

            //White
            PawnBitBoard pawnWhite = new PawnBitBoard(ChessPieceColors.White);

            pawnWhite.Bits = BoardSquare.A3 | BoardSquare.B3 | BoardSquare.C3 | BoardSquare.D3 | BoardSquare.H4;

            BishopBitBoard bishopWhite = new BishopBitBoard(ChessPieceColors.White);

            bishopWhite.Bits = BoardSquare.C1;

            KingBitBoard kingWhite = new KingBitBoard(ChessPieceColors.White);

            kingWhite.Bits = BoardSquare.F2;

            RookBitBoard rookWhite = new RookBitBoard(ChessPieceColors.White);

            rookWhite.Bits = BoardSquare.A1 | BoardSquare.H1;

            KnightBitBoard knightWhite = new KnightBitBoard(ChessPieceColors.White);

            knightWhite.Bits = BoardSquare.B1 | BoardSquare.G1;

            QueenBitBoard queenWhite = new QueenBitBoard(ChessPieceColors.White);

            queenWhite.Bits = BoardSquare.F3;

            //Black
            PawnBitBoard pawnBlack = new PawnBitBoard(ChessPieceColors.Black);

            pawnBlack.Bits = BoardSquare.A7 | BoardSquare.B7 | BoardSquare.C5 | BoardSquare.D7 | BoardSquare.G7 | BoardSquare.G4 | BoardSquare.H7;

            RookBitBoard rookBlack = new RookBitBoard(ChessPieceColors.Black);

            rookBlack.Bits = BoardSquare.A8 | BoardSquare.F8;

            BishopBitBoard bishopBlack = new BishopBitBoard(ChessPieceColors.Black);

            bishopBlack.Bits = BoardSquare.C8 | BoardSquare.D6;

            QueenBitBoard queenBlack = new QueenBitBoard(ChessPieceColors.Black);

            queenBlack.Bits = BoardSquare.G6;

            KingBitBoard kingBlack = new KingBitBoard(ChessPieceColors.Black);

            kingBlack.Bits = BoardSquare.G8;

            KnightBitBoard knightBlack = new KnightBitBoard(ChessPieceColors.Black);

            knightBlack.Bits = BoardSquare.D5;


            //RookBitBoard badMove = new RookBitBoard( ChessPieceColors.Black );
            //badMove.Bits = BoardSquare.B8;
            lolBoard.Update(pawnWhite);
            lolBoard.Update(knightWhite);
            lolBoard.Update(queenWhite);
            lolBoard.Update(rookWhite);
            lolBoard.Update(bishopWhite);
            lolBoard.Update(kingWhite);
            lolBoard.Update(pawnBlack);
            lolBoard.Update(rookBlack);
            lolBoard.Update(bishopBlack);
            lolBoard.Update(queenBlack);
            lolBoard.Update(kingBlack);
            lolBoard.Update(knightBlack);


            ColoredBitBoard bestMove = NegaMax.GetBestMove(lolBoard, 3, ChessPieceColors.White, MoveGen.GenerateLegalMoves, Eval.EvaluateState);
        }
Beispiel #30
0
        private static void blackqueensidecastle()
        {
            //Winboard winboard = new Winboard();
            ChessBoard lolBoard = new ChessBoard();

            lolBoard.InitializeGame();

            //White
            PawnBitBoard pawnWhite = new PawnBitBoard(ChessPieceColors.White);

            pawnWhite.Bits = BoardSquare.A2 | BoardSquare.B2 | BoardSquare.C2 | BoardSquare.D2 | BoardSquare.E4 | BoardSquare.H3;

            BishopBitBoard bishopWhite = new BishopBitBoard(ChessPieceColors.White);

            bishopWhite.Bits = BoardSquare.C1;

            KingBitBoard kingWhite = new KingBitBoard(ChessPieceColors.White);

            kingWhite.Bits = BoardSquare.D3;

            RookBitBoard rookWhite = new RookBitBoard(ChessPieceColors.White);

            rookWhite.Bits = BoardSquare.A1 | BoardSquare.H1;

            KnightBitBoard knightWhite = new KnightBitBoard(ChessPieceColors.White);

            knightWhite.Bits = BoardSquare.D2;

            QueenBitBoard queenWhite = new QueenBitBoard(ChessPieceColors.White);

            queenWhite.Bits = BoardSquare.D1;

            //Black
            PawnBitBoard pawnBlack = new PawnBitBoard(ChessPieceColors.Black);

            pawnBlack.Bits = BoardSquare.A7 | BoardSquare.B7 | BoardSquare.C7 | BoardSquare.C6 | BoardSquare.F7 | BoardSquare.G7 | BoardSquare.H7;

            RookBitBoard rookBlack = new RookBitBoard(ChessPieceColors.Black);

            rookBlack.Bits = BoardSquare.A8 | BoardSquare.H8;

            BishopBitBoard bishopBlack = new BishopBitBoard(ChessPieceColors.Black);

            bishopBlack.Bits = BoardSquare.F5 | BoardSquare.H4;

            QueenBitBoard queenBlack = new QueenBitBoard(ChessPieceColors.Black);

            queenBlack.Bits = BoardSquare.F2;

            KingBitBoard kingBlack = new KingBitBoard(ChessPieceColors.Black);

            kingBlack.Bits = BoardSquare.E8;

            KnightBitBoard knightBlack = new KnightBitBoard(ChessPieceColors.Black);

            knightBlack.Bits = BoardSquare.H6;


            //RookBitBoard badMove = new RookBitBoard( ChessPieceColors.Black );
            //badMove.Bits = BoardSquare.B8;
            lolBoard.Update(pawnWhite);
            lolBoard.Update(knightWhite);
            lolBoard.Update(queenWhite);
            lolBoard.Update(rookWhite);
            lolBoard.Update(bishopWhite);
            lolBoard.Update(kingWhite);
            lolBoard.Update(pawnBlack);
            lolBoard.Update(rookBlack);
            lolBoard.Update(bishopBlack);
            lolBoard.Update(queenBlack);
            lolBoard.Update(kingBlack);
            lolBoard.Update(knightBlack);
            KingBitBoard test = new KingBitBoard(ChessPieceColors.Black);

            test.Bits = BoardSquare.C8;
            lolBoard.Update(test);

            List <ColoredBitBoard> legalMoves = new List <ColoredBitBoard>();

            legalMoves = MoveGen.GenerateLegalMoves(lolBoard, ChessPieceColors.Black);
            ColoredBitBoard bestMove = NegaMax.GetBestMove(lolBoard, 3, ChessPieceColors.White, MoveGen.GenerateLegalMoves, Eval.EvaluateState);

            Console.Write(legalMoves.ToString() + bestMove.ToString());
        }