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); }
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); } }
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); }
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); }
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); }
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); }
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); }
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); }