java - 如何在 Java 中打印井字游戏的继任者?
问题描述
我最近一直在研究井字游戏人工智能作为一个副项目。到目前为止,我已经成功地创建了一个随机生成计算机动作的游戏原型,使用户赢得了大约 90% 的时间。但是,我试图通过极小极大算法使计算机无与伦比。在使用极小极大算法时,我需要为董事会寻找继任者,这就是我遇到的问题
这是目前我的功能:
public static ArrayList<board> successors(board aBoard) {
board orig = aBoard;
ArrayList<board> succ = new ArrayList<board>();
for(int i = 0; i < 9; i++) {
int row = i / 3;
int col = i % 3;
if(!orig.gameBoard[row][col].filled) {
System.out.println(row);
System.out.println(col);
System.out.println("Row: " + row + " Column: " + col);
board newBoard = orig;
//newBoard.gameBoard[row][col].filled = true;
//newBoard.gameBoard[row][col].index = 2;
succ.add(newBoard);
}
}
System.out.println("Number of successors: " + succ.size());
int emptyIndex = 0;
for(int i = 0; i < succ.size(); i++) {
//find the empty index
// System.out.println(emptyIndex / 3);
// System.out.println(emptyIndex % 3);
// System.out.println(succ.get(i).gameBoard[emptyIndex / 3][emptyIndex % 3].index + "\n");
while(succ.get(i).gameBoard[emptyIndex / 3][emptyIndex % 3].index != 0) {
emptyIndex++;
//System.out.println(emptyIndex + " is a good index");
}
System.out.println("Empty Index " + emptyIndex);
System.out.println("i: " + i);
succ.get(i).gameBoard[emptyIndex / 3][emptyIndex % 3].index = 2;
succ.get(i).gameBoard[emptyIndex / 3][emptyIndex % 3].filled = true;
}
return succ;
}
它最初确实使后继者的数量正确,只是输出关闭了。例如,我最初采取的第一步如下:
但结果应该包括计算机可以做出的所有可能的动作。相反,它输出:
我究竟做错了什么?我已经尝试解决这个问题 2 天了。
解决方案
board newBoard = orig;
newBoard 将指向 orig,因此对 newBoard 所做的所有更改也将指向 orig,反之亦然。当 AI 在 newBoard 上移动时,也会移动到原来的棋盘上,因为它们都指向同一个对象。
您需要创建一个与原始板相同的新板对象,然后在将其添加到数组列表之前对其进行更改。复制板状态时,注意不要复制类和数组等引用,而是使用新实例。
推荐阅读
- r - 在可格式化单元格中插入超链接
- swift - 集合视图单元格 scrollToItem 转换失败 [Swift]
- python - 是否可以编写一个允许失败的子任务的 luigi 包装器任务?
- python - 文本处理:如何过滤仅单词名词的类型
- c# - 如何从 .net core web api 项目中删除虚拟添加的角度文件
- twilio - 是否有可以使用 JS SDK 更新的属性的明确列表?
- angular - 我在这里有一个组件,我用于订阅和订阅后的方法并取消订阅订阅的方法,以避免内存泄漏
- xamarin - 错误 CS0115 , CS1061 与 Uno + Prism + Xamarin.forms
- python - 从数据解析器中解包嵌套字典
- python-3.x - Finding elements with selenium