我想知道连接 4 游戏的 minimax 算法有啥问题?

Posted

技术标签:

【中文标题】我想知道连接 4 游戏的 minimax 算法有啥问题?【英文标题】:I want to know what is wrong with my minmax algorithm for connect4 game?我想知道连接 4 游戏的 minimax 算法有什么问题? 【发布时间】:2017-05-05 00:17:21 【问题描述】:

iam 尝试为 connect4 游戏编写 min max 算法,但是当我运行此代码时,它进入无限循环并且不返回移动或结果,所以我需要帮助以了解它有什么问题,我在 6 板工作*7 格

private int score()

    int x = check_Winner();//i checked it and it work right ot return 1 if player 1 win or 2 if pc win or 0 in tie
    if (x == 1) return 10;
    else if (x == 2) return -10;
    else return 0;


public int MinMax(int player_num)

    List<pair> possiple_moves = get_possible_moves();// it works will
    int score_so_far = score();
    if (possiple_moves.Count == 0 || score_so_far != 0)
        return score_so_far;

    List<int> scores = new List<int>();
    List<pair> moves = new List<pair>();

    foreach (pair move in possiple_moves)
    
        if (player_num == 1)
        
            cells[move.x, move.y].player_num = 1;
            scores.Add(MinMax(2));
        
        else
        
            cells[move.x, move.y].player_num = 2;
            scores.Add(MinMax(1));
        
        moves.Add(move);

        cells[move.x, move.y].player_num = 0;
    

    if (player_num == 1)
    
        int max_score_indx = 0, tmp = int.MinValue;
        for (int i = 0; i < scores.Count; i++)
        
            if (scores[i] > tmp)
            
                tmp = scores[i];
                max_score_indx = i;
            
        
        pc_choise = moves[max_score_indx];
        return scores[max_score_indx];
    
    //==================
    else
    
        int min_score_indx = 0, tmp = int.MaxValue;
        for (int i = 0; i < scores.Count; i++)
        
            if (scores[i] < tmp)
            
                tmp = scores[i];
                min_score_indx = i;
            
        
        pc_choise = moves[min_score_indx];
        return scores[min_score_indx];
    

【问题讨论】:

你从内部递归调用MinMax,所以它会永远持续下去。 为什么永远,有停止条件 使用您的调试器逐步执行MinMax 方法,找出为什么您的停止条件从未被命中,然后您可以修复它。 我已经成功了,当 score_sofar !=0 或没有可能移动时,它已经达到了我的停止条件 你的代码丢失了一半,所以很难猜出哪里出了问题。我只能告诉你,这是我能看到的唯一递归,这就是导致你的错误的原因。 【参考方案1】:

@Equalsk 是对的,我相信:在您到达评估停止条件的代码之前,您正在从 foreach 循环中调用 MinMax。因此,如果 get_possible_moves 方法返回与 Null 不同的内容,您将陷入 foreach --> MinMax --> foreach --> MinMax --> foreach...

【讨论】:

不不,我多次调试代码,当没有可能的移动时,大小为零,否则它将包含所有可能的移动,我在循环体和第一行调用 min max在我进行最后一次移动后,我计算可能的移动的函数

以上是关于我想知道连接 4 游戏的 minimax 算法有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

text Tic-Tac-Toe游戏w / Minimax算法

MinMax极小极大算法 (The Minimax Algorithm)

如何在使用 minimax 算法实现 2048 AI 代理中应用 alpha-beta 剪枝?

Minimax 算法 Ruby Tic Tac Toe

[程序设计]-基于人工智能博弈树,极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。

我想做一个简单的纸牌游戏,但有啥问题?