public int MinimaxAB(List <Tile> adj, Tile move, Player player, int depth, int alpha, int beta) { evalCount++; int score = Evaluation.StaticEvaluation(GridBoard.Board, move); // check for wins if (Math.Abs(score) >= 100000 || depth >= Game.Instance.maxComputeDepth || stopwatch.ElapsedMilliseconds > Game.Instance.timeoutMs) { return(score); } // if(adj.Count > maxEvalAdj) // maxEvalAdj = adj.Count; if (player == Game.Black) // maximize // maxCount++; { int max = int.MinValue; for (int i = 0; i < adj.Count; ++i) { if (adj[i].occupied) { continue; } adj[i].player = player; max = Math.Max(max, MinimaxAB(adj, adj[i], player.opp, depth + 1, alpha, beta)); adj[i].player = null; alpha = Math.Max(alpha, max); if (alpha >= beta) { // alphaBreak++; break; } } return(max); } else // minimize // minCount++; { int min = int.MaxValue; for (int i = 0; i < adj.Count; ++i) { if (adj[i].occupied) { continue; } adj[i].player = player; min = Math.Min(min, MinimaxAB(adj, adj[i], player.opp, depth + 1, alpha, beta)); adj[i].player = null; beta = Math.Min(beta, min); if (beta <= alpha) { // betaBreak++; break; } } return(min); } }