Esempio n. 1
0
        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);
            }
        }