我正在制作一个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)之后打印出数组,我看到只有最后一个宝藏,并且该对象之前的索引为空。我做错了什么?
是的,我是新手。太好了。
答案 0 :(得分:6)
这段代码非常可疑:
GoldTreasure t = new Coin();
hero1.setPoints(t.getCoin());
t.collectedTreasures(t);
这意味着你:
t
; collectedTreasures
。你应该将宝藏阵列分配给英雄,而不是宝藏本身。
另请注意,x
不应该是静态变量,因为它将在所有实例之间共享;显然不是你的意图,因为宝藏阵列是每个实例。
答案 1 :(得分:0)
问题在于你自己收集了宝藏,因为你召集了属于宝藏的收集功能来收集自己。
稍后,当你在printTreasures中调用它运行的对象时?您是否创建了一个新的宝藏实例并要求它打印收集的内容?如果是这样,结果是根据代码而没有问题,但逻辑是错误的。
你应该做什么:英雄是收集宝藏的人,因此在英雄级中移动宝藏,计数器和2个功能的集合 - 收集的宝藏和印刷品。更进一步,使X不是静态的,因为它的价值将在英雄之间分享。也许,更优雅,创造一个额外的课程来处理宝藏,并使用不同的类别组成你的英雄。
我可以建议对collectTreasures(Treasure t)函数进行renamig以收集Treasure(Treasure t)。
答案 2 :(得分:0)
我们需要看到您的完整代码,以便为您提供详细的答案,但我怀疑您正在做的是创建大量Treasure
子类并在每个子类上调用collectedTreasure
。这会逐次增加您的全局x
计数器,而每个人treasureArray
只有一个条目。
您可以将collectedTreasure
方法移动到与hero1
对象对应的类,同时摆脱静态(全局)x
变量并替换您的数组具有Treasure
实施的List
个对象(例如ArrayList
),它们都会跟踪自己的大小,因此您不必这样做。此外,当您获得超过20件宝物时,您的代码不会崩溃!