我在寻找解决Connect 4游戏的方法。目前我正在尝试使用深度为6的最小最大值算法,但它不起作用,总是选择相同的列(第一列)。
我已经很绝望了,如果你能找到错误,我会非常感激的。
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- 代表空位
回答:
Connect 4游戏已经被解决(剧透,玩家1在完美对局中获胜)。你可以在基于知识的Connect-Four方法中阅读有关解决方案的所有信息。这是一篇非常引人入胜的文章,因为他们在计算资源非常有限的时代完成了这项工作。
总体思路是构建一个已知价值位置的庞大数据库,然后使用最小最大值算法和alpha-beta剪枝,直到达到数据库中的某个位置。由于当时的计算和存储资源有限,构建这个数据库非常困难,但你现在可能可以用更少的努力实现类似的结果。
虽然这并没有直接回答你的问题,但希望这个参考资料能成为你研究的良好起点,因为它包括了Connect 4中许多常见情况的分析,你可以利用这些来改进你的评估函数。