Minimax连接4 AI故障
我正在连接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开始。
我试图返回列以及启发式的值。我希望我已经提供了足够的信息。感谢您的任何见解。
好的,在实现未显示的方法(如评估,playmove,删除等)后,我能够调试此。假设这些功能在您的版本的一些正确的方法来实现,该错误是,你永远不会真正调用评价函数,如果深度为-1:
你有这样的:
[...]if(myDepth != -1)
{/*restofthecode*/}[...]
但是你需要什么是这样的:
[...]if(myDepth == -1)
{
return temp.getHeuristic();
}
/*restofthecode*/
[...]
这样一来,只要你达到深度-1(在极小树树叶),董事会将评估和返回值(这是excactly您在极小的需要)。
在这两个部分(最小和最大)和所有东西都保持完好。如果还有其他问题,请随时询问。
即使没有在问题中说明,我认为你的搜索行为并不好,对吧?
没有看过你的while代码,我已经可以说你的程序只能在游戏的最后10次移动(最后10个空字段或10次强制赢了)中工作。否则,您的程序将返回最后一次或第一次移动。那是因为你的评价函数,你只处理一个胜利(分别连续4次),但不是连续2次,陷阱,连续3次等)。如果不能强制取胜,它会认为所有的举动都是平等的。
这是一个问题,因为从一个空白字段开始,一个胜利只能由起始玩家强制执行,而第二个最后一个棋子必须放在棋盘上。 (在你的第4版中强制执行)。
由于您的searchdepth(10)小于最大游戏移动次数(42),您的程序将始终发挥其第一步。
如果算法的其余部分正确实现,您可以通过简单地改进评估函数来修复此问题,以便它可以在“好”和“坏”游戏位置之间有所不同。
谢谢。我刚刚开始使用糟糕的评估功能,以确保至少工作,因为它更容易检查。我只是在最上面一行是空的板子上检查它(只剩下7步)。然而,尽管有一个连接,但它仍然不会做出连接4的动作。而且,当我试图在空板上运行它时,该程序即使在深度为5时也会失速,我认为它不应该。我认为时间将在深度5的空板上达到7^5。再次感谢。 – user2587878
@ user2587878好吧,最酷的是我可以将它粘贴到visual studio中,并用优秀的调试器进行调试。我会尽力在今天晚些时候解决这个问题,并在这里发布另一个答案,如果我能找到这个错误。 – xXliolauXx
编辑:请注意,您的方法名是反转的,您的Min方法会计算最大化的球员值=>可能会导致混淆 – xXliolauXx