at TicTacToe.minvalue(TicTacToe.java:184)
at TicTacToe.maxvalue(TicTacToe.java:197)
at TicTacToe.minvalue(TicTacToe.java:184)
at TicTacToe.maxvalue(TicTacToe.java:197)
at TicTacToe.minvalue(TicTacToe.java:184)
at TicTacToe.maxvalue(TicTacToe.java:197)
at TicTacToe.minvalue(TicTacToe.java:184)
at TicTacToe.maxvalue(TicTacToe.java:197)
at TicTacToe.minvalue(TicTacToe.java:184)
at TicTacToe.maxvalue(TicTacToe.java:197)
at TicTacToe.minvalue(TicTacToe.java:184)
我看不到这个错误,因为它已经很久了。 以下是函数maxValue()和minValue()
private int minvalue(char [] brd){
int m = (int) Integer.MAX_VALUE;
int v;
for(int a : actions(brd)){
char [] nextbrd = result(brd, a, human);
if(status(nextbrd)=='C') v = maxvalue(nextbrd); //line 184
else v = utility(nextbrd);
m = Math.min(m, v);
}
return m;
}
private int maxvalue(char [] brd){
int m = (int) Integer.MAX_VALUE;
int v;
for(int a : actions(brd)){
char [] nextbrd = result(brd, a, agent);
if(status(nextbrd)=='C') v = minvalue(nextbrd); //line 189
else v = utility(nextbrd);
if(v==Math.max(m, v)) nextAction = a;
m = Math.max(m, v);
}
return m;
}
如果获胜者是代理人,实用程序函数()只返回1。否则为-1。 状态返回' C'如果游戏尚未结束。 我不知道什么是错的。
更新:我将maxValue()函数中的m更改为MIN_VALUE但我仍然得到相同的错误。
答案 0 :(得分:1)
一旦您的代码到达maxvalue
方法,您将收到StackOverflow
错误,因为nextAction
值永远不会再次更改。
更改nextAction的条件显示为
if(v==Math.max(m, v)) nextAction = a;
但是在开始时你已经初始化了
int m = (int) Integer.MAX_VALUE;
因此,根据您的代码,if
语句永远不会成立。
以下更正显示了避免StackOverflow
错误的明显方法。
private int maxvalue(char [] brd){
int m = (int) Integer.MIN_VALUE;
int v;
for(int a : actions(brd)){
char [] nextbrd = result(brd, a, agent);
if(status(nextbrd)=='C') v = minvalue(nextbrd); //line 189
else v = utility(nextbrd);
if(v==Math.max(m, v)) nextAction = a;
m = Math.max(m, v);
}
return m;
}