예제 #1
0
        public LichessAgent(string gameId)
        {
            cancellationTokenSource = new CancellationTokenSource();
            GameId = gameId;

            Mutex gameStateReceived = new Mutex();

#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
            ChessBot.StreamGameState(GameId, evt =>
            {
                switch ((string)evt["type"])
                {
                case "gameFull":
                    //TODO: FixIt
                    break;

                case "gameState":
                    var mvs = ((string)evt["moves"]).Split(" ");
                    if (mvs.Length > (Game.MovesHistory).Count)
                    {
                        var mv   = mvs.Last();
                        var from = new Position('8' - mv[1], mv[0] - 'a');
                        var to   = new Position('8' - mv[3], mv[2] - 'a');
                        var transformToFigure = Figure.FiguresType.None;
                        if (mv.Length > 4)
                        {
                            switch (mv[4])
                            {
                            case 'r':
                                transformToFigure = Figure.FiguresType.Rook;
                                break;

                            case 'n':
                                transformToFigure = Figure.FiguresType.Knight;
                                break;

                            case 'b':
                                transformToFigure = Figure.FiguresType.Bishop;
                                break;

                            case 'q':
                                transformToFigure = Figure.FiguresType.Queen;
                                break;
                            }
                        }
                        MoveWanted.WaitOne();
                        MoveWanted.Reset();
                        passed = new Move(from, to)
                        {
                            transformTo = transformToFigure
                        };
                        MoveMade.Set();
                    }
                    break;
                }
            }, cancellationTokenSource.Token, Tokens.FairBotToken);
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
        }
예제 #2
0
        public UciController()
        {
            chessBoard = new ChessBoard();
            chessBot   = new ChessBot(new OnlyPieceCountMatterEvaluator(), 3, Color.Nobody);

            commandActions = new Dictionary <string, Action>();
            commandActions[UciCommands.Uci]     = HandleUCICommand;
            commandActions[UciCommands.IsReady] = HandleIsReadyCommand;
            commandActions[UciCommands.NewGame] = HandleNewGameCommand;
        }
예제 #3
0
        public void PawnAtEndBecomesQueen_BotHandlesIt()
        {
            var c = ChessBoard.CreateFromFenString("rn1qk2r/1pP3p1/8/pb1n3p/N7/7P/PPPbNPP1/R1BQKBR1");

            var bot = new ChessBot(new OnlyPieceCountMatterEvaluator(), 3, Color.White, true);

            var move = bot.FindMove(c);

            Assert.IsTrue(true);
        }
예제 #4
0
        public void Depth_4_Performance()
        {
            var bot = new ChessBot(new OnlyPieceCountMatterEvaluator(), 4, Color.White, true);

            var board = new ChessBoard();

            var botMove = bot.FindMove(board);

            Assert.IsTrue(true);
        }
예제 #5
0
        public void MoveIsChosen()
        {
            var bot = new ChessBot(new OnlyPieceCountMatterEvaluator(), 1, Color.White, true);

            var board = new ChessBoard();

            var move = new Move
            {
                Piece          = board.GetPieceAtPosition(0, 1),
                TargetPosition = new Position(5, 0)
            };

            board.MakeMove(move);

            var botMove = bot.FindMove(board);

            Assert.AreEqual(new Position(5, 0), botMove.TargetPosition);
        }
예제 #6
0
        public void InCheckWhiteIllegalMoveBot()
        {
            var bot = new ChessBot(new OnlyPieceCountMatterEvaluator(), 3, Color.White, true);

            var c     = new ChessBoard();
            var board = new Piece[8, 8];

            board[0, 2] = new King(Color.Black)
            {
                AmountOfMoves = 2
            };
            board[0, 4] = new Rook(Color.Black)
            {
                AmountOfMoves = 1
            };
            board[1, 6] = new Knight(Color.Black);
            board[2, 6] = new Pawn(Color.Black);
            board[2, 7] = new Pawn(Color.Black);
            board[3, 0] = new Pawn(Color.Black);
            board[5, 1] = new Bishop(Color.Black);

            board[2, 2] = new Bishop(Color.White);
            board[3, 1] = new Knight(Color.White);
            board[4, 0] = new Pawn(Color.White);
            board[4, 1] = new Pawn(Color.White);
            board[4, 3] = new Pawn(Color.White);
            board[5, 4] = new King(Color.White);
            board[5, 6] = new Pawn(Color.White);
            board[6, 3] = new Bishop(Color.White);

            c.Board = board;

            var allMoves = c.GetAllAvailableMoves(Color.White);

            bot.FindMove(c);

            Assert.AreEqual(6, allMoves.Count());
        }
예제 #7
0
        public ViewModel()
        {
            Moves     = new ObservableCollection <Move>();
            Board     = new ChessBoard();
            NextColor = Color.White;
            Fens      = new ObservableCollection <string>();
            Fens.Add(Board.GetFenString());
            SelectedFen = Fens.Last();

            blackDepth = 3;
            whiteDepth = 3;

            availableBots = new ObservableCollection <AvailableBot>();

            availableBots.Add(new AvailableBot()
            {
                Name           = "Player",
                BoardEvaluator = null
            });

            foreach (var boardEvaluator in ConfigManager.LoadAllBots())
            {
                var bot = new AvailableBot()
                {
                    Name           = boardEvaluator.Name,
                    BoardEvaluator = boardEvaluator
                };

                availableBots.Add(bot);
            }

            SelectedWhiteBot = availableBots[0];
            SelectedBlackBot = availableBots[0];

            WhiteBot = new ChessBot(selectedWhiteBot.BoardEvaluator, whiteDepth, Color.White);
            BlackBot = new ChessBot(selectedBlackBot.BoardEvaluator, blackDepth, Color.Black);
        }
예제 #8
0
 public void CommitBlackBot()
 {
     BlackBot = new ChessBot(selectedBlackBot.BoardEvaluator, blackDepth, Color.Black);
 }
예제 #9
0
 public void CommitWhiteBot()
 {
     WhiteBot = new ChessBot(SelectedWhiteBot.BoardEvaluator, whiteDepth, Color.White);
 }