Пример #1
0
        public void TestCreateUIntMask()
        {
            var uciStream = new UciStream();
            var mask      = Bitwise.CreateUIntMask(7, 11);

            uciStream.WriteMessageLine(Bitwise.ToString(mask));
            Assert.That(Bitwise.ToString(mask), Is.EqualTo("00000000_00000000_00001111_10000000"));
        }
Пример #2
0
        public void TestStartPosition()
        {
            var uciStream = new UciStream();
            var board     = uciStream.Board;

            board.SetPosition(Board.StartPositionFen);
            uciStream.WriteMessageLine(board.ToString());
            // Validate integrity of board and occupancy of every square.
            board.AssertIntegrity();
            Assert.That(board.CurrentPosition.GetPiece(Square.a8), Is.EqualTo(Piece.BlackRook));
            Assert.That(board.CurrentPosition.GetPiece(Square.b8), Is.EqualTo(Piece.BlackKnight));
            Assert.That(board.CurrentPosition.GetPiece(Square.c8), Is.EqualTo(Piece.BlackBishop));
            Assert.That(board.CurrentPosition.GetPiece(Square.d8), Is.EqualTo(Piece.BlackQueen));
            Assert.That(board.CurrentPosition.GetPiece(Square.e8), Is.EqualTo(Piece.BlackKing));
            Assert.That(board.CurrentPosition.GetPiece(Square.f8), Is.EqualTo(Piece.BlackBishop));
            Assert.That(board.CurrentPosition.GetPiece(Square.g8), Is.EqualTo(Piece.BlackKnight));
            Assert.That(board.CurrentPosition.GetPiece(Square.h8), Is.EqualTo(Piece.BlackRook));
            var square = Square.a7;

            do
            {
                Assert.That(board.CurrentPosition.GetPiece(square), Is.EqualTo(Piece.BlackPawn));
                square++;
            } while (square <= Square.h7);
            do
            {
                Assert.That(board.CurrentPosition.GetPiece(square), Is.EqualTo(Piece.None));
                square++;
            } while (square <= Square.h3);
            do
            {
                Assert.That(board.CurrentPosition.GetPiece(square), Is.EqualTo(Piece.WhitePawn));
                square++;
            } while (square <= Square.h2);
            Assert.That(board.CurrentPosition.GetPiece(Square.a1), Is.EqualTo(Piece.WhiteRook));
            Assert.That(board.CurrentPosition.GetPiece(Square.b1), Is.EqualTo(Piece.WhiteKnight));
            Assert.That(board.CurrentPosition.GetPiece(Square.c1), Is.EqualTo(Piece.WhiteBishop));
            Assert.That(board.CurrentPosition.GetPiece(Square.d1), Is.EqualTo(Piece.WhiteQueen));
            Assert.That(board.CurrentPosition.GetPiece(Square.e1), Is.EqualTo(Piece.WhiteKing));
            Assert.That(board.CurrentPosition.GetPiece(Square.f1), Is.EqualTo(Piece.WhiteBishop));
            Assert.That(board.CurrentPosition.GetPiece(Square.g1), Is.EqualTo(Piece.WhiteKnight));
            Assert.That(board.CurrentPosition.GetPiece(Square.h1), Is.EqualTo(Piece.WhiteRook));
            // Validate piece counts.
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhitePawns), Is.EqualTo(8));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteKnights), Is.EqualTo(2));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteBishops), Is.EqualTo(2));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteRooks), Is.EqualTo(2));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteQueens), Is.EqualTo(1));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteKing), Is.EqualTo(1));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackPawns), Is.EqualTo(8));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackKnights), Is.EqualTo(2));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackBishops), Is.EqualTo(2));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackRooks), Is.EqualTo(2));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackQueens), Is.EqualTo(1));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackKing), Is.EqualTo(1));
        }
Пример #3
0
 public static void Main()
 {
     // Improve garbage collector performance at the cost of memory usage.
     // Engine should not allocate much memory when searching a position anyhow, since it references pre-allocated objects.
     GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
     using (var uciStream = new UciStream())
     {
         try
         {
             uciStream.Run();
         }
         catch (Exception exception)
         {
             uciStream.HandleException(exception);
         }
     }
 }
Пример #4
0
        public void TestKingRingMasks()
        {
            // TODO: Assert in king ring mask tests.
            // King on e8.
            var uciStream = new UciStream();
            var square    = "e8";
            var mask      = Board.InnerRingMasks[Board.GetSquare(square)];

            uciStream.WriteMessageLine($"King on {square} inner ring mask = ");
            uciStream.WriteMessageLine(Position.ToString(mask));
            mask = Board.OuterRingMasks[Board.GetSquare(square)];
            uciStream.WriteMessageLine($"King on {square} outer ring mask = ");
            uciStream.WriteMessageLine(Position.ToString(mask));
            // King on c3.
            square = "c3";
            mask   = Board.InnerRingMasks[Board.GetSquare(square)];
            uciStream.WriteMessageLine($"King on {square} inner ring mask = ");
            uciStream.WriteMessageLine(Position.ToString(mask));
            mask = Board.OuterRingMasks[Board.GetSquare(square)];
            uciStream.WriteMessageLine($"King on {square} outer ring mask = ");
            uciStream.WriteMessageLine(Position.ToString(mask));
        }
Пример #5
0
        public void TestBishopOnE7Moves()
        {
            var uciStream = new UciStream();
            var board     = uciStream.Board;

            board.SetPosition("rnbq1bnr/ppppkppp/4p3/8/8/BP6/P1PPPPPP/RN1QKBNR b KQ - 0 3");

            var unoccupiedMovesMask         = Board.BishopMoveMasks[Square.e7];
            var expectedUnoccupiedMovesMask = 0ul;

            Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.d8);
            Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.f8);
            Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.d6);
            Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.f6);
            Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.c5);
            Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.g5);
            Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.b4);
            Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.h4);
            Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.a3);
            var relevantMoveDestinations = unoccupiedMovesMask & PrecalculatedMoves.GetRelevantOccupancy(Square.e7, false);

            uciStream.WriteMessageLine("Relevant move destinations = ");
            uciStream.WriteMessageLine(Position.ToString(relevantMoveDestinations));
            uciStream.WriteMessageLine();
            ulong expectedRelevantMoveDestinations = 0;

            Bitwise.SetBit(ref expectedRelevantMoveDestinations, Square.d6);
            Bitwise.SetBit(ref expectedRelevantMoveDestinations, Square.f6);
            Bitwise.SetBit(ref expectedRelevantMoveDestinations, Square.c5);
            Bitwise.SetBit(ref expectedRelevantMoveDestinations, Square.g5);
            Bitwise.SetBit(ref expectedRelevantMoveDestinations, Square.b4);
            uciStream.WriteMessageLine("Expected relevant move destinations = ");
            uciStream.WriteMessageLine(Position.ToString(relevantMoveDestinations));
            uciStream.WriteMessageLine();
            Assert.That(relevantMoveDestinations, Is.EqualTo(expectedRelevantMoveDestinations));

            Direction[] bishopDirections   = { Direction.NorthEast, Direction.SouthEast, Direction.SouthWest, Direction.NorthWest };
            var         bishopDestinations = Board.CreateMoveDestinationsMask(Square.e7, board.CurrentPosition.Occupancy, bishopDirections);

            uciStream.WriteMessageLine("Bishop destinations = ");
            uciStream.WriteMessageLine(Position.ToString(bishopDestinations));
            uciStream.WriteMessageLine();
            var expectedBishopDestinations = 0ul;

            Bitwise.SetBit(ref expectedBishopDestinations, Square.d8);
            Bitwise.SetBit(ref expectedBishopDestinations, Square.f8);
            Bitwise.SetBit(ref expectedBishopDestinations, Square.d6);
            Bitwise.SetBit(ref expectedBishopDestinations, Square.f6);
            Bitwise.SetBit(ref expectedBishopDestinations, Square.c5);
            Bitwise.SetBit(ref expectedBishopDestinations, Square.g5);
            Bitwise.SetBit(ref expectedBishopDestinations, Square.b4);
            Bitwise.SetBit(ref expectedBishopDestinations, Square.h4);
            Bitwise.SetBit(ref expectedBishopDestinations, Square.a3);
            uciStream.WriteMessageLine("Expected bishop destinations = ");
            uciStream.WriteMessageLine(Position.ToString(expectedBishopDestinations));
            uciStream.WriteMessageLine();
            Assert.That(bishopDestinations, Is.EqualTo(expectedBishopDestinations));

            var precalculatedBishopDestinations = Board.PrecalculatedMoves.GetBishopMovesMask(Square.e7, board.CurrentPosition.Occupancy);

            uciStream.WriteMessageLine("Precalculated bishop destinations = ");
            uciStream.WriteMessageLine(Position.ToString(precalculatedBishopDestinations));
            uciStream.WriteMessageLine();
            Assert.That(precalculatedBishopDestinations, Is.EqualTo(expectedBishopDestinations));
        }
Пример #6
0
        public void TestWac11Position()
        {
            var uciStream = new UciStream();
            var board     = uciStream.Board;

            board.SetPosition("r1b1kb1r/3q1ppp/pBp1pn2/8/Np3P2/5B2/PPP3PP/R2Q1RK1 w kq -");
            uciStream.WriteMessageLine(board.ToString());
            // Validate integrity of board and occupancy of every square.
            board.AssertIntegrity();
            Assert.That(board.CurrentPosition.GetPiece(Square.a8), Is.EqualTo(Piece.BlackRook));
            Assert.That(board.CurrentPosition.GetPiece(Square.b8), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.c8), Is.EqualTo(Piece.BlackBishop));
            Assert.That(board.CurrentPosition.GetPiece(Square.d8), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.e8), Is.EqualTo(Piece.BlackKing));
            Assert.That(board.CurrentPosition.GetPiece(Square.f8), Is.EqualTo(Piece.BlackBishop));
            Assert.That(board.CurrentPosition.GetPiece(Square.g8), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.h8), Is.EqualTo(Piece.BlackRook));
            Assert.That(board.CurrentPosition.GetPiece(Square.a7), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.b7), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.c7), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.d7), Is.EqualTo(Piece.BlackQueen));
            Assert.That(board.CurrentPosition.GetPiece(Square.e7), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.f7), Is.EqualTo(Piece.BlackPawn));
            Assert.That(board.CurrentPosition.GetPiece(Square.g7), Is.EqualTo(Piece.BlackPawn));
            Assert.That(board.CurrentPosition.GetPiece(Square.h7), Is.EqualTo(Piece.BlackPawn));
            Assert.That(board.CurrentPosition.GetPiece(Square.a6), Is.EqualTo(Piece.BlackPawn));
            Assert.That(board.CurrentPosition.GetPiece(Square.b6), Is.EqualTo(Piece.WhiteBishop));
            Assert.That(board.CurrentPosition.GetPiece(Square.c6), Is.EqualTo(Piece.BlackPawn));
            Assert.That(board.CurrentPosition.GetPiece(Square.d6), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.e6), Is.EqualTo(Piece.BlackPawn));
            Assert.That(board.CurrentPosition.GetPiece(Square.f6), Is.EqualTo(Piece.BlackKnight));
            Assert.That(board.CurrentPosition.GetPiece(Square.g6), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.h6), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.a5), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.b5), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.c5), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.d5), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.e5), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.f5), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.g5), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.h5), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.a4), Is.EqualTo(Piece.WhiteKnight));
            Assert.That(board.CurrentPosition.GetPiece(Square.b4), Is.EqualTo(Piece.BlackPawn));
            Assert.That(board.CurrentPosition.GetPiece(Square.c4), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.d4), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.e4), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.f4), Is.EqualTo(Piece.WhitePawn));
            Assert.That(board.CurrentPosition.GetPiece(Square.g4), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.h4), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.a3), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.b3), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.c3), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.d3), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.e3), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.f3), Is.EqualTo(Piece.WhiteBishop));
            Assert.That(board.CurrentPosition.GetPiece(Square.g3), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.h3), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.a2), Is.EqualTo(Piece.WhitePawn));
            Assert.That(board.CurrentPosition.GetPiece(Square.b2), Is.EqualTo(Piece.WhitePawn));
            Assert.That(board.CurrentPosition.GetPiece(Square.c2), Is.EqualTo(Piece.WhitePawn));
            Assert.That(board.CurrentPosition.GetPiece(Square.d2), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.e2), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.f2), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.g2), Is.EqualTo(Piece.WhitePawn));
            Assert.That(board.CurrentPosition.GetPiece(Square.h2), Is.EqualTo(Piece.WhitePawn));
            Assert.That(board.CurrentPosition.GetPiece(Square.a1), Is.EqualTo(Piece.WhiteRook));
            Assert.That(board.CurrentPosition.GetPiece(Square.b1), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.c1), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.d1), Is.EqualTo(Piece.WhiteQueen));
            Assert.That(board.CurrentPosition.GetPiece(Square.e1), Is.EqualTo(Piece.None));
            Assert.That(board.CurrentPosition.GetPiece(Square.f1), Is.EqualTo(Piece.WhiteRook));
            Assert.That(board.CurrentPosition.GetPiece(Square.g1), Is.EqualTo(Piece.WhiteKing));
            Assert.That(board.CurrentPosition.GetPiece(Square.h1), Is.EqualTo(Piece.None));
            // Validate piece counts.
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhitePawns), Is.EqualTo(6));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteKnights), Is.EqualTo(1));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteBishops), Is.EqualTo(2));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteRooks), Is.EqualTo(2));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteQueens), Is.EqualTo(1));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteKing), Is.EqualTo(1));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackPawns), Is.EqualTo(7));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackKnights), Is.EqualTo(1));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackBishops), Is.EqualTo(2));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackRooks), Is.EqualTo(2));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackQueens), Is.EqualTo(1));
            Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackKing), Is.EqualTo(1));
        }