我创造了TicTacToe游戏。我使用minmax算法。
当棋盘为3x3
时,我只计算游戏的每一个可能的移动直到结束,-1为失败,0为领带,1为胜利。
当涉及5x5时,它无法完成(对于许多选项(如24 ^ 24),所以我创建了评估方法:10 ^ 0表示一个CIRCLE内联,10 ^ 1表示2个CIRCLE内联,。 ..,10 ^ 4 for 5 CIRCLES inline,但它没用。
有人对评估有更好的想法吗?
示例:
O|X|X| | |
----------
|O| | | |
----------
X|O| | | |
----------
| | | | |
----------
| | | | |
Evaluation -10, 2 circles across once and inline once (+200), 2 crosses inline(-100), and -1 three times and + 1 three times for single cross and circle.
这是我现在的评估方法:
public void setEvaluationForBigBoards() {
int evaluation = 0;
int howManyInLine = board.length;
for(; howManyInLine > 0; howManyInLine--) {
evaluation += countInlines(player.getStamp(), howManyInLine);
evaluation -= countInlines(player.getOppositeStamp(), howManyInLine);
}
this.evaluation = evaluation;
}
public int countInlines(int sign, int howManyInLine) {
int points = (int) Math.pow(10, howManyInLine - 1);
int postiveCounter = 0;
for(int i = 0; i < board.length; i++) {
for(int j = 0; j < board[i].length; j++) {
//czy od tego miejsca jest cos po przekatnej w prawo w dol, w lewo w dol, w dol, w prawo
if(toRigth(i, j, sign, howManyInLine))
postiveCounter++;
if(howManyInLine > 1) {
if(toDown(i, j, sign, howManyInLine))
postiveCounter++;
if(toRightDiagonal(i, j, sign, howManyInLine))
postiveCounter++;
if(toLeftDiagonal(i, j, sign, howManyInLine))
postiveCounter++;
}
}
}
return points * postiveCounter;
}
答案 0 :(得分:2)
第一次移动后的选项数量(可能的移动顺序)为24!而不是24 ^ 24。它还是太高了
编号因此实现启发式是正确的。
请注意,关于良好启发式的答案必须基于作者的意见,所以我发表意见但要找到
什么是“最好的启发式”你应该通过以下方式使各种想法相互竞争:
现在我的想法是关于nxn游戏场的获胜序列长度为n的良好可能的启发式起点:
一方面考虑: