【发布时间】:2014-08-04 11:40:46
【问题描述】:
所以...我试图用 Java 创建的程序是一个模拟器,它通过使用列表和二维数组来移动不同类型的生物。目前,在每个生物尝试移动之前,它都会搜索周围的瓷砖以查看那里有什么,并根据它找到的东西做出不同的反应,例如捕食者或食物生物。我的挑战是,如果它什么也没找到,我需要某种方式来了解它周围空元素/空间的数组索引位置,以便我可以随机移动到其中一个空间。在下面发布一些代码以希望更有意义:
ArrayList <Fish> fishes; ArrayList <Penguin> penguins; ArrayList <Shark> sharks;
这些是创建时存储在 arraylist 中的不同类型的生物对象,每种类型都是 Creature 类的子/扩展。新生物在 init 方法中创建(连同初始化的列表和数组),然后在 createNew 方法中定义,每种生物类型都有。完成此操作后,它添加了上述列表之一和其他 2 个位置:
ArrayList<Creature> crlist; Creature [][] gridloc;
crlist 是当前在模拟器中活着的所有生物的列表,gridloc 是每个生物相对于彼此和屏幕的位置,对于它们知道移动到哪里来说是最重要的。
当一个生物移动时,它使用 move 方法,它首先执行以下操作:
List<Creature> moves = search();
搜索会这样做...
public ArrayList<Creature> search() {
int gx = getPos().width/txs; int gy = getPos().height/tys;
search = new ArrayList();
for (int sy=-1;sy<=1;sy++) {
for (int sx=-1;sx<=1;sx++) {
if (gridloc[gx+sx][gy+sy]!=this && gx+sx>=0 && gx+sx<=ntx && gy+sy>=0 && gy+sy<=nty) {
search.add(gridloc[gx+sx][gy+sy]);
}
}
}
return search;
}
这只是搜索生物周围的所有数组索引/图块,同时忽略自身并确保它不能搜索超出窗口边缘。然后根据生物类型在子方法中修改搜索结果(上面用 super.search() 调用),优先级取决于它在开始时描述的找到什么,所以如果它找到捕食者,它将删除除了搜索列表中的空值/空白空间之外的任何内容,因此它可以尝试逃跑。
我的挑战是(在冗长的解释之后)在移动中它获取搜索列表的修改版本以确定生物可以移动到的位置。然而,由于空白空间包含空值,我想不出一种方法来获取这些空间的位置/索引以供生物移动。 我唯一的想法是,当搜索找到要添加到列表中的空值时,它可以创建一个新对象,该对象只保存移动方法可以使用的坐标。只是希望有更好的方法...?
【问题讨论】:
-
其实我觉得带坐标的列表是个好主意
-
如果每个生物都有自己的 x,y 会怎样?
-
@LarsNielsen,是的,我可能不得不接受这个想法,尽管我已经尝试过添加一个 Creature 类的对象,当它找到一个空值时。然而,问题是试图优化列表以仅包含它返回的那些对象,它也发现了其他生物,因为它们也被认为是 Creature 的对象,即使它们是子类。
-
@Leo Creatures 确实有自己的 x 和 y 位置 :) 当它们被创建和移动时由一对称为 getPos 和 setPos 的 get/set 方法设置。然而,这被设置为 Dimension 并且与它们在屏幕上的 x,y 位置相关,而不是它们在 gridloc 上的位置。但是,我声明 gx 和 gy 是对象 gridloc 位置,因为 txs/tys 是存储在以下位置的每个图块的固定大小:
Dimension [][] xyco -
@JocelynWilde 抱歉,这是一个愚蠢的问题 :-)
标签: java arrays list object null