目前我正在使用C++开发一个黑白棋(Othello/Reversi)游戏,在算法方面我采用了Minimax算法来作为电脑玩家的智能决策。目前代码已经完成,但是当深度设置到可以产生半挑战性AI时,算法运行速度缓慢。
我的游戏基本设置是:通过一个二维数组表示棋盘,每个格子都被分配了一个值(xMarker, oMarker或underscore)。
以下是目前的Minimax算法代码:
我的游戏基本设置是:通过一个二维数组表示棋盘,每个格子都被分配了一个值(xMarker, oMarker或underscore)。
以下是目前的Minimax算法代码:
signed int Computer::simulate(Board b, int depth, int tempMarker) {
if (depth > MAX_DEPTH || b.gameOver()) {
int oppMarker = (marker == xMarker) ? oMarker : xMarker;
return b.countForMarker(marker) - b.countForMarker(oppMarker);
}
//if we're simulating our turn, we want to find the highest value (so we set our start at -64)
//if we're simulating the opponent's turn, we want to find the lowest value (so we set our start at 64)
signed int start = (tempMarker == marker) ? -64 : 64;
for (int x = 0; x < b.size; x++) {
for (int y = 0; y < b.size; y++) {
if (b.markerArray[x][y] == underscore) {
Board *c = b.duplicate();
if(c->checkForFlips(Point(x,y), tempMarker, true) > 0) {
int newMarker = (tempMarker == xMarker) ? oMarker : xMarker;
int r = simulate(*c, depth+1, newMarker);
//'marker' is the marker assigned to our player (the computer), if it's our turn, we want the highest value
if (tempMarker == marker) {
if(r > start) start = r;
} else {
//if it's the opponent's turn, we want the lowest value
if(r < start) start = r;
}
}
delete c;
}
}
}
return start;
}
函数 checkForFlips()
返回在给定单元格下棋所导致的翻转数量。目前 MAX_DEPTH 设为 6,运行速度较慢(每次下棋大约需要 10-15 秒)。
我目前想到的唯一主意就是每次都存储树形结构,然后从上次离开的地方继续进行,但我不确定如何实现这一点,或者它是否太有效了。如果您有任何想法或建议,将不胜感激!
delete
,则应非常小心。例如,如果simulate()
抛出异常,则c
将不会被删除。 - Gilad Naor