我正在寻找一种解决连接4的方法,现在尝试使用深度为6的min max进行操作,它无法正常工作,并保持结果相同的列(第一个)。
我非常绝望,如果您能找到错误,我将非常高兴。
public int findBestMove() {
ArrayList<ArrayList<Integer>> myMoves = new ArrayList<ArrayList<Integer>>();
for (int i = 0; i < mWidth; i++) {
if (isColumnAvailable(i)) {
ArrayList<Integer> t = new ArrayList<>();
t.add(i);
t.add(MinMax(6, mBoard, false));
myMoves.add(t);
}
}
int maxMoveScore = -10000;
int bestMove = 0;
for (int i = 0; i < myMoves.size(); i++) {
int score = myMoves.get(i).get(1);
if (score > maxMoveScore) {
maxMoveScore = tryit;
bestMove = myMoves.get(i).get(0);
}
}
return bestMove;
}
private int MinMax(int depth,int[][] board, boolean maximizingPlayer) {
if (depth <= 0)
return 0;
int winner =checkForWin() ;
if (winner == 2)
return depth;
if (winner == 1)
return -depth;
if (isBoardFull()) {
return 0;
}
int bestValue;
if (maximizingPlayer)
bestValue = -1;
else
bestValue = 1;
for (int i = 0; i < mWidth; i++) {
if (!isColumnAvailable(i))
continue;
int v = MinMax(depth - 1, board, !maximizingPlayer);
bestValue = maximizingPlayer ? Math.max(bestValue, v) : Math.min(bestValue, v);
}
return bestValue;
}
2-是AI的编号
1-是人类玩家
0-为空
答案 0 :(得分:0)
连接4是一个已解决的游戏(剧透,玩法完美的玩家1获胜)。您可以在A Knowledge-based Approach of Connect-Four中阅读有关该解决方案如何完成的所有信息。这是一本非常有趣的文章,因为他们是在计算资源非常难以获得的时候才这样做的。
通常的想法是建立一个巨大的已知值头寸数据库,然后用alpha-beta修剪最小-最大值,直到达到数据库中的一个头寸。由于发生这种情况时需要大量的计算和存储资源,因此构建该数据库很困难,但是今天您可以轻松完成类似的事情。
尽管这不能直接回答您的问题,但希望该参考书将是您开始研究的好地方,因为它包括对Connect 4中许多常见情况的分析,可用于帮助您改善评估功能。