我正在建造一个可以从控制台或命令行播放的河内游戏塔。注意,这不是一个递归程序;我正在尝试构建一个可以由用户播放的游戏。我正在使用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帖子的参数。 I.E.用户将光盘从后N移动到后N,并检查该移动是否合法。
我在过去几个小时试图解决这个问题,但我甚至无法弄清楚如何获得合适的挂钩并将磁盘从一个挂钩转移到另一个挂钩,更不用说检查一个更大的磁盘是不是#39;被移动到较小的磁盘上。这是我提出的方法,我得到一个空指针异常,这使我认为lists
没有正确初始化。这是我的方法,显然是错误的。
public void move(int moveFrom, int moveTo){
lists.get(moveTo)
lists.add(0, moveTo);
}
那么任何人都可以帮助我理解如何使用int作为索引来获取适当的peg(int由用户输入)并移动光盘?
答案 0 :(得分:1)
列表未初始化,因为您声明了类型为ArrayList
private ArrayList lists;
哪个是null。然后,在构造函数中,声明并初始化类型为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;
}
OR
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;
}