【问题标题】:ArrayList of ArrayLists for pegs and discs in towers of hanoi gameArrayList of ArrayLists for pegs and discs in towers of hanoi 游戏
【发布时间】:2023-04-05 08:17:01
【问题描述】:

我正在构建一个可以从控制台或命令行玩的河内塔游戏。请注意,这不是递归程序;我正在尝试构建一个用户可以玩的游戏。我正在使用 ArrayLists 的 ArrayList 来存储用户选择的 pegs(1,2,3) 和 discs(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);
        }
}

我正在尝试制作一个 move 方法,它将两个 INTS 作为 from 和 to 帖子的参数。 IE。用户将圆盘从 N 柱移到 N 柱,并检查该移动是否合法。

在过去的几个小时里,我一直试图解决这个问题,但我什至无法弄清楚如何获得合适的挂钩并将磁盘从一个挂钩移到另一个挂钩,更不用说检查是否没有更大的磁盘被移动到一个较小的磁盘上。这是我想出的方法,我得到一个空指针异常,这让我认为lists 没有正确初始化。这是我的方法,显然是错误的。

public void move(int moveFrom, int moveTo){

    lists.get(moveTo)
    lists.add(0, moveTo);
}

那么任何人都可以帮助我了解如何使用 int 作为索引来获取适当的 peg(int 由用户输入)并移动磁盘吗?

【问题讨论】:

  • 您的lists 数组正在遮蔽lists 字段(顺便说一下,这是一个ArrayList,而不是数组)。因此,该字段永远不会被分配并以null 作为默认值。
  • 好的,我明白你在说什么,我已更改为this.lists = new ArrayList[3]。但是,我的 move 方法仍然是错误的,只是不知道如何处理这里的逻辑。

标签: java arraylist towers-of-hanoi


【解决方案1】:

列表未初始化,因为您声明了一个 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;

}

【讨论】:

  • 好的,我意识到我在构造函数中犯的错误。但是,当我修复它时,我无法使用lists.getlists.add 您的第一个和第三个构造函数将起作用,但是,我得到第二个构造函数的错误。我最大的问题是理解 move 方法中的逻辑。我不知道如何从用户那里获取 INT 并使用它来访问适当的挂钩。我想我可以做类似lists[moveFrom].get(0); 的事情,但我真的不知道怎么说..
  • 抱歉,我的前两个示例都有语法错误,但我已修复它们。如果我们假设您选择#3,这是我的建议,那么您将使用lists[moveFrom].get(peg_number) 访问一个挂钩,您可以使用list[moveFrom].size 检查堆栈的大小
  • 谢谢我最终使用了与数字 2 非常相似的语法。感谢修复。
猜你喜欢
  • 2018-08-20
  • 1970-01-01
  • 2013-03-24
  • 2022-12-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 2022-12-01
相关资源
最近更新 更多