3

我正在制作一个 RPG 风格的程序,但我无法让我的宝藏对象阵列工作。我想保存我在阵列中找到的所有宝物,以便稍后打印出来。这是宝藏类的代码:

private static int x = 0;
Treasure treasureArray[] = new Treasure[20];

public void collectedTreasures(Treasure t){
treasureArray[x] = t;
x++;
}

在主程序中:

GoldTreasure t = new Coin();
hero1.setPoints(t.getCoin());
t.collectedTreasures(t);

宝物对象的创建是在无限循环中的一个开关内。当我打印出数组时,使用方法

public void printTreasures(){
        for (int y=0 ; y<x ; y++){
            System.out.print(treasureArray[y] + ", ");

对于数组中应该有的宝藏,我只会得到“null”。如果我在 t.collectedTreasures(t) 之后打印出数组,我会看到只有最后一个宝藏在那里,并且该对象之前的索引为空。我做错了什么?

是的,我是新手。对人好点。

4

3 回答 3

6

这段代码很可疑:

GoldTreasure t = new Coin();
hero1.setPoints(t.getCoin());
t.collectedTreasures(t);

这意味着你是:

  1. 创造新宝藏t
  2. 调用collectedTreasures那个实例。

您应该将宝藏阵列分配给英雄,而不是分配给宝藏本身。

另请注意,它x不应该是静态变量,因为它将在所有实例之间共享;显然不是你的意图,因为宝藏是逐实例的。

于 2013-01-18T13:10:48.520 回答
0

问题是您收集宝藏本身,因为您调用收集函数(属于宝藏)来收集自己。

稍后,当您在哪个对象中调用 printTreasures 时,它会运行什么?你是否创建了一个新的宝藏实例并要求它打印收集到的东西?如果是这样,结果是根据代码,没有问题,但逻辑有问题。

你应该做什么:英雄是收集宝藏的人,因此在英雄类中移动宝藏数组的定义、计数器和 2 个函数 -collectedTreasures 和 printTreasures。此外,使 X 不是静态的,因为它的值将在英雄之间共享。也许,更优雅的是,创建一个额外的类来处理宝藏并使用不同的类来组成你的英雄。

我可以建议将collectTreasures(Treasure t) 函数重命名为collectTreasure(Treasure t)。

于 2013-01-18T13:17:31.610 回答
0

我们需要查看您的完整代码才能为您提供详细的答案,但我怀疑您正在做的是创建大量Treasure子类并调用collectedTreasure每个子类。这将x每次增加您的全局计数器,而每个人treasureArray只有一个条目。

您可以将collectedTreasure方法移动到与您的对象对应的类hero1,同时摆脱静态(全局)x变量并用实现(例如)替换您的Treasure对象数组,它们都跟踪自己的大小,所以你不必。另外,当您获得超过 20 个宝藏时,您的代码不会崩溃!ListArrayList

于 2013-01-18T13:17:57.240 回答