Beispiel #1
0
        private TreeNode MiniMax(Board board, Double depth, Double alpha, Double beta, Boolean maximizer)
        {
            if(depth == 0)
            {
                return GetLeafNode(board, maximizer);
            }
            var pieces = board.GetPiecesForPlayer(board.PlayerTurn);
            var bestScore = maximizer ? _minScore : _maxScore;
            var bestMove = default(Move);

            var moves = pieces.SelectMany(x => x.GetPossibleMoves(board));
            if (!moves.Any())
            {
                if (board.PlayerHasCheck(board.PlayerTurn))
                {
                    return new TreeNode(null, maximizer ? _maxScore : _minScore);
                }
            }

            foreach (var mv in moves)
            {
                var newBoard = board.Copy();
                newBoard.MakeMove(mv);
                var newNode = MiniMax(newBoard, depth - 1, alpha, beta, !maximizer);
                if (maximizer)
                {
                    if(newNode.Score > bestScore)
                    {
                        bestScore = newNode.Score;
                        bestMove = mv;
                    }
                    alpha = Math.Max(alpha, bestScore);
                    if(beta <= alpha)
                    {
                        return new TreeNode(bestMove, bestScore);
                    }
                }
                else
                {
                    if(newNode.Score < bestScore)
                    {
                        bestScore = newNode.Score;
                        bestMove = mv;
                    }
                    beta = Math.Min(beta, bestScore);
                    if(beta <= alpha)
                    {
                        return new TreeNode(bestMove, bestScore);
                    }
                }
            }
            return new TreeNode(bestMove, bestScore);
        }
Beispiel #2
0
        public void GetNextMoveMustNotAlterBoard()
        {
            _board = new Board();
            _board.Initialize();

            for(int i = 0; i < 10; i++)
            {
                var origBoard = _board.Copy();
                var mv = _miniMaxService.GetNextMove(_board);
                Assert.IsTrue(_board.Equals(origBoard));
                _board.MakeMove(mv);
            }
        }
Beispiel #3
0
        public Move GetNextMove(Board board)
        {
            var newBoard = board.Copy();

            return MiniMax(board, _maxDepth, _minScore, _maxScore, true).Move;
        }