java Minimax Connect 4 AI故障
我正在制作连接4人工智能,除非游戏继续,直到所有42个空间都被填满
分数保持不变,每4分一行得1分
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分。main函数调用minu Value函数以10为深度开始
我试图返回列以及启发式的值。我希望我已经提供了足够的信息。谢谢你的洞察力
# 1 楼答案
尽管问题中没有说明,但我认为你的搜索并没有带来好的进展,对吧
不用看while代码,我已经可以说你的程序只会在游戏的最后10步(最后10个空位或10次强制获胜)中运行。否则,程序将返回其计算的最后一步或第一步。这是因为你的评估功能,你只处理一场胜利(分别是4场胜利),而不是2场胜利、陷阱、3场胜利等等。如果它不能强制获胜,它会认为所有的动作都是平等的
这是一个问题,因为从一个空场开始,只有先发球员才能获胜,而且只有最后一个棋子放在棋盘上。(在你的版本4中,连续强制)
由于你的搜索深度(10)小于游戏的最大移动量(42),你的程序将始终执行第一步
如果你的算法的其余部分得到了正确的实现,你可以通过简单地改进你的评估函数来解决这个问题,这样它就可以区分“好”和“坏”的游戏位置
# 2 楼答案
好吧,在实现了未显示的方法(如评估、playmove、移除等)之后,我能够调试这个。假设这些函数在您的版本中以某种正确的方式实现,错误在于,如果深度为-1,您实际上从未调用求值函数:
你有这个:
但你需要的是这样的东西:
这样一来,每当你达到深度-1(你的极大极小树中的一片叶子),电路板就会被评估并返回值(这正是你在极大极小中所需要的)
在这两个部分(最小值和最大值)进行修改,一切都会正常。如果还有其他问题,请随时询问