我正在做一个人工智能游戏,其中CPU使用统一成本搜索算法将N个编号的立方体堆叠在3行的表中。我尝试做的是generateMoves()
方法,它将返回一个ArrayList,其中包含从给定状态开始的所有可能的移动。
Cube是一个表示具有自己的ID(立方体的编号)、X轴位置和Y轴位置的立方体的类。
K是用户输入getCubes()
是一个返回ArrayList<Cube>
的方法,它是表的当前状态。setCubes()
是一个接受ArrayList<Cube>
并将该列表设置为当前状态的方法。isValid()
是一个Cube方法,它检查copyOfTable列表中给定的多维数据集是否处于有效位置。isFree()
是一个Cube方法,它检查copyOfTable列表是否可以自由移动给定的多维数据集。
public class Table{
private fields
constructor{}
public Arraylist<Table> generateMoves(){
Arraylist<Table> moves = new ArrayList<Table>();
ArrayList<Cube> currentTable = this.getCubes();
ArrayList<Cube> copyOfTable = new ArrayList<Cube>(currentTable);
int X = 1;
int Y = 1;
int K = this.getK();
for(Cube cube : currentTable){
int backupX = cube.getPosX();
int backupY = cube.getPosY();
for(Y = 1; Y <= 3; Y++){
for(X = 1; X <= 4*K; X++){
cube.setPosX(X);
cube.setPosY(Y);
if(cube.isValid(copyOfTable) && cube.isFree(copyOfTable)){
this.setCubes(currentTable);
moves.add(this);
moves.get(0).printTable();
}else{
cube.setPosX(backupX);
cube.setPosY(backupY);
continue;
}
}
}
}
moves.get(anyIndex).printTable();
return moves;
}
}
// main is in a different file
main(){
ArrayList<Table> moves = new ArrayList<Table>();
Table table = new Table();
moves = table.generateMoves();
}
我想要的是moves.add(this)
在moves
数组列表中添加电路板的当前状态,这样我就可以返回给定表可能生成的所有表(状态)。
问题是第一个printTable()
(在第三个for循环中)打印了可以生成的每个状态。不仅是我第一次问的。
第二个printTable()
(在return语句上面),不管索引是什么,都只打印表的第一个状态。
我错过了什么?
我尝试了上面的代码
1条答案
按热度按时间r1zhe5dt1#
您的代码是正确的,您只是误解了 generateMoves 方法的上下文。
返回的 ArrayList 将不会持久化,对于每个调用,将有一个新的 ArrayList。
这种类型的方法需要放在不同的类中。
其中,您可以使用 ArrayList 类字段来填充列表。
请考虑以下情况。
通过将 Table 对象传递给 generateMoves,可以填充类字段 moves。
创建 Table 对象,然后为每个示例调用 generateMoves 方法。
比如说