Beispiel #1
0
        public void TestZobristCastle()
        {
            var b   = Notation.ReadFEN("rnbqk2r/pppp1ppp/5n2/2b1p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - 0 1");
            var zob = Zobrist.Calculate(b);

            b.Move(4, 6);
            var zob2 = Zobrist.Calculate(b);

            ulong expected = zob;

            expected = expected ^ Zobrist.Key.Piece(Color.White, Piece.King, 4);
            expected = expected ^ Zobrist.Key.Piece(Color.White, Piece.King, 6);
            expected = expected ^ Zobrist.Key.Piece(Color.White, Piece.Rook, 7);
            expected = expected ^ Zobrist.Key.Piece(Color.White, Piece.Rook, 5);

            expected = expected ^ Zobrist.Key.PlayerTurn(Color.White);
            expected = expected ^ Zobrist.Key.PlayerTurn(Color.Black);

            expected = expected ^ Zobrist.Key.Castling(new HashSet <Castling>()
            {
                Castling.KingsideWhite, Castling.QueensideWhite, Castling.KingsideBlack, Castling.QueensideBlack
            });
            expected = expected ^ Zobrist.Key.Castling(new HashSet <Castling>()
            {
                Castling.KingsideBlack, Castling.QueensideBlack
            });

            Assert.AreEqual(expected, zob2);
        }
Beispiel #2
0
        private unsafe static void GenericGameTest(List <PGNMove> moves, string endState)
        {
            BoardStruct *b = (BoardStruct *)Board.Create();

            Board.Init(b, 1);

            var finalBoard = Chess.Base.Notation.ReadFEN(endState);
            var fBoard     = Helpers.ManagedBoardToNative(finalBoard);

            Assert.AreEqual(Zobrist.Calculate(fBoard), fBoard->Hash);

            var stateStack = new IntPtr[150];
            int head       = 0;

            for (int i = 0; i < moves.Count; i++)
            {
                stateStack[head] = Board.Copy(b);
                head++;
                var ok = Board.Make(b, moves[i].From, moves[i].To);
                if (moves[i].Promotion != 0)
                {
                    bool promoteOk = Board.Promote(b, moves[i].To, (int)moves[i].Promotion);
                    Assert.AreEqual(true, promoteOk);
                }

                Assert.AreEqual(true, ok);
                Assert.AreEqual(Zobrist.Calculate(b), b->Hash);
            }

            Assert.AreEqual(Zobrist.Calculate(fBoard), b->Hash);
            Assert.AreEqual(fBoard->Hash, b->Hash);
            //Assert.AreEqual(fBoard->AttacksWhite, b->AttacksWhite);
            //Assert.AreEqual(fBoard->AttacksBlack, b->AttacksBlack);
            Assert.AreEqual(fBoard->Castle, b->Castle);
            Assert.AreEqual(fBoard->PlayerTurn, b->PlayerTurn);
            Assert.AreEqual(fBoard->FiftyMoveRulePlies, b->FiftyMoveRulePlies);
            Assert.AreEqual(fBoard->CurrentMove, b->CurrentMove);

            while (head > 0)
            {
                head--;
                Board.Unmake(b);
                var bStack = (BoardStruct *)stateStack[head];

                Assert.AreEqual(Zobrist.Calculate(b), b->Hash);
                Assert.AreEqual(bStack->Hash, b->Hash);
                //Assert.AreEqual(bStack->AttacksWhite, b->AttacksWhite);
                //Assert.AreEqual(bStack->AttacksBlack, b->AttacksBlack);
                Assert.AreEqual(bStack->Castle, b->Castle);
                Assert.AreEqual(bStack->PlayerTurn, b->PlayerTurn);
                Assert.AreEqual(bStack->FiftyMoveRulePlies, b->FiftyMoveRulePlies);
                Assert.AreEqual(bStack->CurrentMove, b->CurrentMove);
            }
        }
Beispiel #3
0
        public unsafe void TestHashBoardSet()
        {
            Zobrist.Init();
            var b = Board.Create();

            Board.SetPiece(b, 10, Board.PIECE_PAWN, Board.COLOR_WHITE);
            Board.SetPiece(b, 34, Board.PIECE_KING, Board.COLOR_BLACK);
            Board.SetPiece(b, 4, Board.PIECE_KING, Board.COLOR_WHITE);
            Board.SetPiece(b, 12, Board.PIECE_QUEEN, Board.COLOR_WHITE);
            Board.SetPiece(b, 61, Board.PIECE_ROOK, Board.COLOR_BLACK);
            var hash = Zobrist.Calculate(b);

            Assert.AreEqual(hash, b->Hash);
        }
Beispiel #4
0
        public unsafe void TestHashWrong1()
        {
            Zobrist.Init();
            var b = Board.Create();

            Board.SetPiece(b, 10, Board.PIECE_PAWN, Board.COLOR_WHITE);
            Board.SetPiece(b, 34, Board.PIECE_KING, Board.COLOR_BLACK);
            var hash = Zobrist.Calculate(b);

            var hash2 = Zobrist.Read(Zobrist.IndexRead(Board.PIECE_PAWN | Board.COLOR_WHITE), 10);

            hash2 = hash2 ^ Zobrist.Read(Zobrist.IndexRead(Board.PIECE_KING | Board.COLOR_BLACK), 34);

            Assert.AreNotEqual(hash2, hash);
        }
Beispiel #5
0
        public unsafe void TestHashBoardUnset()
        {
            Zobrist.Init();
            var b = Board.Create();

            Board.Init(b, 1);

            Board.ClearPiece(b, 10);
            Board.ClearPiece(b, 2);
            Board.ClearPiece(b, 62);
            Board.ClearPiece(b, 57);
            Board.ClearPiece(b, 53);
            Board.ClearPiece(b, 30);             // empty area

            var hash = Zobrist.Calculate(b);

            Assert.AreEqual(hash, b->Hash);
        }
Beispiel #6
0
        public void TestZobrist1()
        {
            var b   = new Board(true);
            var zob = Zobrist.Calculate(b);

            b.Move(9, 25);
            var zob2 = Zobrist.Calculate(b);

            ulong expected = zob;

            expected = expected ^ Zobrist.Key.Piece(Color.White, Piece.Pawn, 9);
            expected = expected ^ Zobrist.Key.Piece(Color.White, Piece.Pawn, 25);
            expected = expected ^ Zobrist.Key.PlayerTurn(Color.White);
            expected = expected ^ Zobrist.Key.PlayerTurn(Color.Black);
            expected = expected ^ Zobrist.Key.EnPassant(b.EnPassantTile);

            Assert.AreEqual(expected, zob2);
        }
Beispiel #7
0
        public unsafe void TestHashOK1()
        {
            Zobrist.Init();
            var b = Board.Create();

            Board.SetPiece(b, 10, Board.PIECE_PAWN, Board.COLOR_WHITE);
            Board.SetPiece(b, 34, Board.PIECE_KING, Board.COLOR_BLACK);
            var hash = Zobrist.Calculate(b);

            var hash2 = Zobrist.Read(Zobrist.IndexRead(Board.PIECE_PAWN | Board.COLOR_WHITE), 10);

            hash2 = hash2 ^ Zobrist.Read(Zobrist.IndexRead(Board.PIECE_KING | Board.COLOR_BLACK), 34);

            hash2 = hash2 ^ Zobrist.Read(Zobrist.ZOBRIST_SIDE, Board.COLOR_WHITE);
            hash2 = hash2 ^ Zobrist.Read(Zobrist.ZOBRIST_CASTLING, Board.CASTLE_BK | Board.CASTLE_BQ | Board.CASTLE_WK | Board.CASTLE_WQ);
            hash2 = hash2 ^ Zobrist.Read(Zobrist.ZOBRIST_ENPASSANT, 0);

            Assert.AreEqual(hash2, hash);
        }
Beispiel #8
0
        public unsafe void TestMakeRooksUnmake()
        {
            BoardStruct *b = (BoardStruct *)Board.Create();

            Board.Init(b, 1);

            //b->AttacksWhite = Board.AttackMap(b, Board.COLOR_WHITE);
            //b->AttacksBlack = Board.AttackMap(b, Board.COLOR_BLACK);

            Board.Make(b, 6, 21);
            Board.Make(b, 62, 45);

            Assert.AreEqual(2, b->CurrentMove);

            Board.Unmake(b);
            Board.Unmake(b);

            Assert.AreEqual(Zobrist.Calculate(b), b->Hash);
            //Assert.AreEqual(Board.AttackMap(b, Board.COLOR_WHITE), b->AttacksWhite);
            //Assert.AreEqual(Board.AttackMap(b, Board.COLOR_BLACK), b->AttacksBlack);
            Assert.AreEqual(Board.CASTLE_BK | Board.CASTLE_BQ | Board.CASTLE_WK | Board.CASTLE_WQ, b->Castle);
            Assert.AreEqual(Board.COLOR_WHITE, b->PlayerTurn);
            Assert.AreEqual(0, b->CurrentMove);
        }