Esempio n. 1
0
        private int AlphaBeta(int depth, Board board, int alpha, int beta, bool maximizingPlayer)
        {
            if (depth <= 0 || _valueHeuristic.IsBoardTerminal(board))
            {
                return(_valueHeuristic.GetHeuristicValue(board, depth, _player));
            }

            var bestValue = maximizingPlayer ? -1 : 1;

            for (var i = 0; i < board.Columns; i++)
            {
                if (!board.DropCoin(maximizingPlayer ? 2 : 1, i))
                {
                    continue;
                }

                var value = AlphaBeta(depth - 1, board, alpha, beta, !maximizingPlayer);

                if (maximizingPlayer)
                {
                    alpha = Math.Max(alpha, value);
                }
                else
                {
                    beta = Math.Min(beta, value);
                }

                bestValue = maximizingPlayer ? Math.Max(bestValue, value) : Math.Min(bestValue, value);
                board.RemoveTopCoin(i);

                if (alpha >= beta)
                {
                    break;
                }
            }

            return(bestValue);
        }
Esempio n. 2
0
        private int MinMax(int depth, Board board, bool maximizingPlayer)
        {
            if (depth <= 0 || _valueHeuristic.IsBoardTerminal(board))
            {
                return(_valueHeuristic.GetHeuristicValue(board, depth, _player));
            }

            var bestValue = maximizingPlayer ? -1 : 1;

            for (var i = 0; i < board.Columns; i++)
            {
                if (!board.DropCoin(maximizingPlayer ? 2 : 1, i))
                {
                    continue;
                }

                var value = MinMax(depth - 1, board, !maximizingPlayer);
                bestValue = maximizingPlayer ? Math.Max(bestValue, value) : Math.Min(bestValue, value);
                board.RemoveTopCoin(i);
            }

            return(bestValue);
        }