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); }
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); }