コード例 #1
0
        private static void TestMove()
        {
            var board = MakeBoard("rnbqkbnr/pppppppp/8/8/8/3P4/PPP1PPPP/RNBQKBNR b KQkq -");

            //board.DoMove2(new Move(ChessPosition.D2, ChessPosition.D3, ChessPiece.WhitePawn));
            //board.UndoMove();
            Console.WriteLine(board.Print());
            var slidingMoveGenerator = new MagicBitboardsService();
            //var evaluationService = new EvaluationService();
            //Console.WriteLine(evaluationService.Evaluate(board));

            var attacksService = new AttacksService(slidingMoveGenerator);
            var pinDetector    = new PinDetector(slidingMoveGenerator);
            var validator      = new MoveValidator(attacksService, slidingMoveGenerator, pinDetector);
            var movesService   = new MoveGenerator(attacksService, slidingMoveGenerator, pinDetector, validator);
            var forWhite       = true;
            var moves          = new Move[218];
            var moveCount      = 0;

            movesService.GetAllLegalMoves(board, moves, ref moveCount);
            //var dests = moves.Select(x => x.To);
            //var toMoveBoard = fact.PositionsToBitBoard(dests);
            //var attacked = attacksService.GetAllAttacked(board);

            //var newMove = new Move(4,2,ChessPiece.WhiteKing);
            //board.DoMove2(newMove);

            //Debugging.ShowBitBoard(board.BitBoard[ChessPiece.WhiteKing], board.BitBoard[ChessPiece.WhiteRook]);
        }
コード例 #2
0
        private static void DoSearch()
        {
            var fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; // Starting pos

            //fen = "2rr3k/pp3pp1/1nnqbN1p/3pN3/2pP4/2P3Q1/PPB4P/R4RK1 w - -"; // Mate in 3
            fen = "r1b1k2r/ppppnppp/2n2q2/2b5/3NP3/2P1B3/PP3PPP/RN1QKB1R w KQkq - 0 1"; // Developed
            fen = "r1b1kb1r/2pp1ppp/1np1q3/p3P3/2P5/1P6/PB1NQPPP/R3KB1R b KQkq - 0 1 "; // Midgame
            var fact  = new BoardFactory();
            var board = fact.ParseFEN(fen);

            var hyperbola         = new HyperbolaQuintessence();
            var evaluationService = new EvaluationService();
            var attacksService    = new AttacksService(hyperbola);
            var movesService      = new PossibleMovesService(attacksService, hyperbola);
            var interruptor       = new ConsoleInterruptor();
            var searchService     = new SearchService(movesService, evaluationService, interruptor);

            searchService.OnSearchInfo += info => Console.WriteLine(info.ToString());
            var sParams = new SearchParams();

            //sParams.MaxDepth = 5;
            sParams.Infinite = true;

            var move = searchService.Search(board, sParams);
        }
コード例 #3
0
 public EvaluationService2(EvaluationData evaluationData)
 {
     _pawnControl      = new ulong[2];
     _evaluationScores = new EvaluationScores();
     _evaluationData   = evaluationData;
     _evalTable        = new EvalHashTable();
     _evalTable.SetSize(16 * 1024 * 1024);
     _pawnTable = new EvalHashTable();
     _pawnTable.SetSize(16 * 1024 * 1024);
     _slideGenerator = new MagicBitboardsService();
     _pinDetector    = new PinDetector(_slideGenerator);
     _attacks        = new AttacksService(_slideGenerator);
 }
コード例 #4
0
ファイル: Game.cs プロジェクト: ZacharyDudley/chess-dot-net
        public Game(IInterruptor interruptor)
        {
            var hyperbola         = new HyperbolaQuintessence();
            var evaluationService = new EvaluationService();
            var attacksService    = new AttacksService(hyperbola);
            var movesService      = new PossibleMovesService(attacksService, hyperbola);
            var searchService     = new SearchService(movesService, evaluationService, interruptor);

            BoardFact  = new BoardFactory();
            Hyperbola  = hyperbola;
            Evaluation = evaluationService;
            Attacks    = attacksService;
            Moves      = movesService;
            Search     = searchService;
        }
コード例 #5
0
        public Game()
        {
            var slidingMoveGenerator = new MagicBitboardsService();
            var evaluationService    = new EvaluationService2(new EvaluationData());
            //var evaluationService = new NnueEvaluationService(new NnueExternalClient());
            var attacksService = new AttacksService(slidingMoveGenerator);
            var pinDetector    = new PinDetector(slidingMoveGenerator);
            var validator      = new MoveValidator(attacksService, slidingMoveGenerator, pinDetector);
            var movesService   = new MoveGenerator(attacksService, slidingMoveGenerator, pinDetector, validator);
            var searchService  = new SearchService2(movesService, evaluationService);

            BoardFact  = new BoardFactory();
            Hyperbola  = slidingMoveGenerator;
            Evaluation = evaluationService;
            Attacks    = attacksService;
            Moves      = movesService;
            Search     = searchService;
        }
コード例 #6
0
        private static void TestRepetitions()
        {
            var fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; // Starting pos

            //fen = "2rr3k/pp3pp1/1nnqbN1p/3pN3/2pP4/2P3Q1/PPB4P/R4RK1 w - -"; // Mate in 3
            fen = "r1b1k2r/ppppnppp/2n2q2/2b5/3NP3/2P1B3/PP3PPP/RN1QKB1R w KQkq - 0 1"; // Developed

            var fact  = new BoardFactory();
            var board = fact.ParseFEN(fen);

            var hyperbola         = new HyperbolaQuintessence();
            var evaluationService = new EvaluationService();
            var attacksService    = new AttacksService(hyperbola);
            var movesService      = new PossibleMovesService(attacksService, hyperbola);
            var interruptor       = new ConsoleInterruptor();
            var searchService     = new SearchService(movesService, evaluationService, interruptor);

            Console.WriteLine(searchService.IsRepetition(board));

            var move = new Move(1, 18, ChessPiece.WhiteKnight);

            board = board.DoMove(move);
            Console.WriteLine(move.ToPositionString() + " " + searchService.IsRepetition(board));

            move  = new Move(57, 42, ChessPiece.BlackKnight);
            board = board.DoMove(move);
            Console.WriteLine(move.ToPositionString() + " " + searchService.IsRepetition(board));

            move  = new Move(18, 1, ChessPiece.WhiteKnight);
            board = board.DoMove(move);
            Console.WriteLine(move.ToPositionString() + " " + searchService.IsRepetition(board));

            move  = new Move(42, 57, ChessPiece.BlackKnight);
            board = board.DoMove(move);
            Console.WriteLine(move.ToPositionString() + " " + searchService.IsRepetition(board));

            move  = new Move(1, 18, ChessPiece.WhiteKnight);
            board = board.DoMove(move);
            Console.WriteLine(move.ToPositionString() + " " + searchService.IsRepetition(board));

            move  = new Move(57, 40, ChessPiece.BlackKnight);
            board = board.DoMove(move);
            Console.WriteLine(move.ToPositionString() + " " + searchService.IsRepetition(board));
        }
コード例 #7
0
        public static void TestSee()
        {
            var board = MakeBoard("1k1r3q/1ppn3p/p4b2/4p3/8/P2N2P1/1PP1R1BP/2K1Q3 w - - 0 1");

            var slidingMoveGenerator = new MagicBitboardsService();
            var attacksService       = new AttacksService(slidingMoveGenerator);
            var seeService           = new SeeService(attacksService);

            var from = ChessPosition.D3;
            var to   = ChessPosition.E5;
            var move = new Move(from, to, board.ArrayBoard[from], board.ArrayBoard[to]);

            //board.DoMove2(move);
            Console.WriteLine(1UL << move.From);
            Console.WriteLine(1UL << move.To);
            Console.WriteLine(board.Print());
            var score = seeService.See(board, move);

            Console.WriteLine(score);
        }
コード例 #8
0
        private static void DoPerft()
        {
            var fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
            //fen = "3k4/3p4/8/K1P4r/8/8/8/8 b - - 0 50";
            //fen = "8/1kP5/8/K2p3r/8/8/8/8 w - - 1 53 ";
            //fen = "r1b1k2r/ppppnppp/2n2q2/2b5/3NP3/2P1B3/PP3PPP/RN1QKB1R w KQkq - 0 1";
            //fen = "2k5/8/8/8/8/8/6p1/2K5 w - - 1 1 ";
            //fen = "rnbqkbnr/1ppppppp/8/p7/1P6/P7/2PPPPPP/RNBQKBNR b KQkq b3 0 2 ";
            var fact           = new BoardFactory();
            var hyperbola      = new HyperbolaQuintessence();
            var attacksService = new AttacksService(hyperbola);
            var movesService   = new PossibleMovesService(attacksService, hyperbola);
            var perft          = new PerftService(movesService);
            var results        = perft.GetPossibleMoves(fact.ParseFEN(fen), 1);

            using (var sharperClient = new SharperPerftClient(@"C:\sharper\Sharper.exe", fen))
            {
                var perftRunner = new PerftRunner(perft, sharperClient, fact);
                perftRunner.OnOut += Console.Write;
                perftRunner.Test(fen, 6);
            }
        }
コード例 #9
0
        public SeeService(AttacksService attacks)
        {
            _attacks = attacks;

            SeeWeights = new short[ChessPiece.Count];
            SeeWeights[ChessPiece.WhitePawn] = 100;
            SeeWeights[ChessPiece.BlackPawn] = 100;

            SeeWeights[ChessPiece.WhiteKnight] = 325;
            SeeWeights[ChessPiece.BlackKnight] = 325;

            SeeWeights[ChessPiece.WhiteBishop] = 325; // 325 instead of 335, exchanging bishop for knight
            SeeWeights[ChessPiece.BlackBishop] = 325; // is not strictly "losing"

            SeeWeights[ChessPiece.WhiteRook] = 500;
            SeeWeights[ChessPiece.BlackRook] = 500;

            SeeWeights[ChessPiece.WhiteQueen] = 975;
            SeeWeights[ChessPiece.BlackQueen] = 975;

            SeeWeights[ChessPiece.WhiteKing] = 0;
            SeeWeights[ChessPiece.BlackKing] = 0;
        }
コード例 #10
0
        private static void TestMove()
        {
            var fact  = new BoardFactory();
            var board = fact.ParseFEN("r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq -");

            board.EnPassantFile = Board.Files[3];
            var hyperbola         = new HyperbolaQuintessence();
            var evaluationService = new EvaluationService();

            Console.WriteLine(evaluationService.Evaluate(board));
            var attacksService = new AttacksService(hyperbola);
            var movesService   = new PossibleMovesService(attacksService, hyperbola);
            var forWhite       = true;
            var moves          = movesService.GetPossibleKingMoves(board).ToList();
            var dests          = moves.Select(x => x.To);
            var toMoveBoard    = fact.PiecesToBitBoard(dests);
            var attacked       = attacksService.GetAllAttacked(board);

            var newMove    = new Move(4, 2, ChessPiece.WhiteKing);
            var movedBoard = board.DoMove(newMove);

            Debugging.ShowBitBoard(movedBoard.BitBoard[ChessPiece.WhiteKing], movedBoard.BitBoard[ChessPiece.WhiteRook]);
        }