2015-07-21 98 views
0

我正在连接4 AI,除非游戏继续,直到所有42个空格填满。
得分由连续4位保持得1分。Minimax连接4 AI故障

public int[] Max_Value(GameBoard playBoard, int depth){ 
    GameBoard temp = new GameBoard(playBoard.playBoard); 
    int h = 0, tempH = 999, tempCol=0; 
    int myDepth = depth - 1; 
    int[] tempH2 = new int[2]; 
    boolean noChildren = true; 
    if(myDepth != -1){ 
     for(int i = 0; i < 7; i++){ 
      if(temp.isValidPlay(i)){ 
       count++; 
       temp.playPiece(i); 
       noChildren = false; 
       tempH2 = Min_Value(temp, myDepth); 
       if(tempH2[1] < tempH){ 
        tempH=tempH2[1]; 
        tempCol = i; 
       } 
       temp.removePiece(i); 
      } 
     } 
    } 
    int[] x = new int[2]; 
    if(noChildren){ 
     h = temp.getHeuristic(); 
    } 
    else{ 
     h = tempH; 
     x[0]=tempCol; 
    } 
    x[1]=h; 
    return x; 
} 

public int[] Min_Value(GameBoard playBoard, int depth){ 
    GameBoard temp = new GameBoard(playBoard.playBoard); 
    int h = 0, tempH = -999, tempCol=0; 
    int myDepth = depth - 1; 
    int[] tempH2 = new int[2]; 
    boolean noChildren = true; 
    if(myDepth != -1){ 
     for(int i = 0; i < 7; i++){ 
      if(temp.isValidPlay(i)){ 
       count++; 
       temp.playPiece(i); 
       noChildren = false; 
       tempH2 = Max_Value(temp, myDepth); 
       if(tempH2[1] > tempH){ 
        tempH=tempH2[1]; 
        tempCol = i; 
       } 
       temp.removePiece(i); 
      } 
     } 
    } 
    int[] x = new int[2]; 
    if(noChildren){ 
     h = temp.getHeuristic(); 
    } 
    else{ 
     h = tempH; 
     x[0]=tempCol; 
    } 
    x[1]=h; 
    return x; 
} 

我觉得我只是偶然发现了一切,感觉就像可怕的代码。不过,我从来没有尝试过这样的事情,并希望得到任何意见。我不知道我哪里错了。对于任何给定的状态,我的评估函数只能为每个连续4个点提供1个点。主函数调用Min_Value函数以深度为10开始。

我试图返回列以及启发式的值。我希望我已经提供了足够的信息。感谢您的任何见解。

回答

1

好的,在实现未显示的方法(如评估,playmove,删除等)后,我能够调试此。假设这些功能在您的版本的一些正确的方法来实现,该错误是,你永远不会真正调用评价函数,如果深度为-1:

你有这样的:

[...]if(myDepth != -1) 
{/*restofthecode*/}[...] 

但是你需要什么是这样的:

[...]if(myDepth == -1) 
{ 
return temp.getHeuristic(); 
} 
/*restofthecode*/ 
[...] 

这样一来,只要你达到深度-1(在极小树树叶),董事会将评估和返回值(这是excactly您在极小的需要)。

在这两个部分(最小和最大)和所有东西都保持完好。如果还有其他问题,请随时询问。

1

即使没有在问题中说明,我认为你的搜索行为并不好,对吧?

没有看过你的while代码,我已经可以说你的程序只能在游戏的最后10次移动(最后10个空字段或10次强制赢了)中工作。否则,您的程序将返回最后一次或第一次移动。那是因为你的评价函数,你只处理一个胜利(分别连续4次),但不是连续2次,陷阱,连续3次等)。如果不能强制取胜,它会认为所有的举动都是平等的。

这是一个问题,因为从一个空白字段开始,一个胜利只能由起始玩家强制执行,而第二个最后一个棋子必须放在棋盘上。 (在你的第4版中强制执行)。

由于您的searchdepth(10)小于最大游戏移动次数(42),您的程序将始终发挥其第一步。

如果算法的其余部分正确实现,您可以通过简单地改进评估函数来修复此问题,以便它可以在“好”和“坏”游戏位置之间有所不同。

+0

谢谢。我刚刚开始使用糟糕的评估功能,以确保至少工作,因为它更容易检查。我只是在最上面一行是空的板子上检查它(只剩下7步)。然而,尽管有一个连接,但它仍然不会做出连接4的动作。而且,当我试图在空板上运行它时,该程序即使在深度为5时也会失速,我认为它不应该。我认为时间将在深度5的空板上达到7^5。再次感谢。 – user2587878

+0

@ user2587878好吧,最酷的是我可以将它粘贴到visual studio中,并用优秀的调试器进行调试。我会尽力在今天晚些时候解决这个问题,并在这里发布另一个答案,如果我能找到这个错误。 – xXliolauXx

+1

编辑:请注意,您的方法名是反转的,您的Min方法会计算最大化的球员值=>可能会导致混淆 – xXliolauXx