gpt4 book ai didi

java - Tic Tac Toe negamax 实现。

转载 作者:行者123 更新时间:2023-11-30 08:12:15 24 4
gpt4 key购买 nike

我正在尝试为 tic-tac-toe 应用程序实现 negamax 搜索函数,但它不会返回最佳值,而是似乎半随机猜测。这是我的代码的相关部分:

public int negamax(Result result, Token token) {
if (result == Result.WIN) {
return 1;
} else if (result == Result.DRAW) {
return 0;
}

int best = -1;

for (Coordinate move : Board.getAvailableMoves()) {
Token other = token.getOther();
Result r = Board.makeMove(move, other);
int eval = -negamax(r, other);
Board.unmakeMove(move);

if (eval > best) {
best = eval;
}
}

return best;
}

public Coordinate getNegamaxMove(Token token) {
int score = -1;
Coordinate bestMove = null;

for (Coordinate move : Board.getAvailableMoves()) {
Result result = Board.makeMove(move, token);
int newScore = negamax(result, token);
Board.unmakeMove(move);

if (newScore >= score) {
score = newScore;
bestMove = move;
}
}

return bestMove;
}

需要注意的是,我不会将棋盘作为参数传递,而是传递移动的结果,可以是 WIN、DRAW、VALID 或 OCCUPIED(最后 2 个与当前讨论无关)这些都是不言自明的。 Coordinate 类仅保存移动的行值和列值。

非常感谢:)

最佳答案

我已经成功让它工作了,negamax 方法有两个问题。首先, token 应该在循环所有可用的移动之前更改,而不是在循环内部更改。其次,由于我在 getNegamaxMove 方法中检查最佳 Action ,因此在 negamax 方法中,我必须跟踪最差的 Action 而不是最好的 Action 。以下是工作实现,其中旧部分被注释掉以进行比较:

public int negamax(Result result, Token token) {
if (result == Result.WIN) {
return 1;
} else if (result == Result.DRAW) {
return 0;
}

int worst = 1;
// int best = -1

Token other = token.getOther();
for (Coordinate move : Board.getAvailableMoves()) {
// Token other = token.getOther();
Result r = Board.makeMove(move, other);
int eval = -negamax(r, other);
Board.unmakeMove(move);

// if (eval > best) {
// best = eval;
// }

if (eval < worst) {
worst = eval;
}
}

// return best
return worst;
}

关于java - Tic Tac Toe negamax 实现。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30202563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com