我正在建造可以从控制台或命令行播放的河内游戏塔。注意这不是一个递归程序。我正在尝试建立一个可由用户玩的游戏。我正在使用ArrayLists的ArrayList来存储用户选择的钉(1,2,3)和光盘(N)。
我的实例变量和构造函数:
private ArrayList lists;
private ArrayList peg1 = new ArrayList<>();
private ArrayList peg2 = new ArrayList<>();
private ArrayList peg3 = new ArrayList<>();
//Constructor
public TowersOfHanoi() {
ArrayList<Integer>[] lists = new ArrayList[3];
lists[0]= this.peg1;
lists[1]= this.peg2;
lists[2]= this.peg3;
}
我如何初始化游戏
public ArrayList initializeGame(int n) {
for (int i = 1; i < n; i++) {
peg1.add(i);
}
}
我试图做一个将两个INTS作为from和to的参数的move方法。即用户将光盘从帖子N移到帖子N,并检查该移动是否合法。
在过去的几个小时中,我一直试图弄清楚这一点,但我什至无法弄清楚如何获得合适的固定销并将磁盘从一个固定销移至另一个固定销,更不用说检查是否正在移动更大的磁盘了。较小磁盘的顶部。这是我想出的方法,并且我得到一个空指针异常,这使我认为
lists
未正确初始化。这是我的方法,这显然是错误的。public void move(int moveFrom, int moveTo){
lists.get(moveTo)
lists.add(0, moveTo);
}
那么,谁能帮助我了解如何使用int作为索引来获取适当的钉(用户输入int)并移动光盘?
最佳答案
列表未初始化,因为您声明了ArrayList
类型的实例对象
private ArrayList lists;
这是空的。然后,在构造函数中,声明并初始化类型为
ArrayList[]
的本地对象-就像在ArrayLists数组中一样ArrayList<Integer>[] lists = new ArrayList[3];
然后,将钉子放入此
ArrayList
数组lists[0]= this.peg1;
lists[1]= this.peg2;
lists[2]= this.peg3;
然后您不对数组进行任何操作就退出构造函数。您需要:
private ArrayList[] lists;
private ArrayList peg1 = new ArrayList<>();
private ArrayList peg2 = new ArrayList<>();
private ArrayList peg3 = new ArrayList<>();
//Constructor
public TowersOfHanoi() {
lists = new ArrayList[3];
lists[0]= this.peg1;
lists[1]= this.peg2;
lists[2]= this.peg3;
}
要么
private ArrayList<ArrayList> lists = new ArrayList<>(3);
private ArrayList peg1 = new ArrayList<>();
private ArrayList peg2 = new ArrayList<>();
private ArrayList peg3 = new ArrayList<>();
//Constructor
public TowersOfHanoi() {
lists.add(this.peg1);
lists.add(this.peg2);
lists.add(this.peg3);
}
或最有可能
private ArrayList[] lists = new ArrayList[3];
private ArrayList peg1 = new ArrayList<>();
private ArrayList peg2 = new ArrayList<>();
private ArrayList peg3 = new ArrayList<>();
//Constructor
public TowersOfHanoi() {
lists[0]= this.peg1;
lists[1]= this.peg2;
lists[2]= this.peg3;
}