所以...我试图在Java中创建的程序是一个模拟器,通过使用列表和2D数组来移动不同类型的生物。目前,在每个生物试图移动之前,它会搜索周围的瓦片以查看其中的内容,并根据其发现的内容做出不同的反应,例如:捕食者或食物生物。我的挑战是,如果它什么都找不到,我需要某种方式知道它周围的空元素/空格的数组索引位置,这样我就可以随机移动到其中一个空格。发布下面的一些代码,希望更有意义:
ArrayList <Fish> fishes; ArrayList <Penguin> penguins; ArrayList <Shark> sharks;
这些是创建时存储在arraylist中的不同类型的生物对象,每种类型都是Creature类的子/扩展。新生物在init方法中生成(连同初始化的列表和数组),然后在createNew方法中定义,每个生物类型都有。完成后,它会添加上述列表之一和其他2个位置:
ArrayList<Creature> crlist; Creature [][] gridloc;
crlist是模拟器中当前活着的所有生物的列表,gridloc是每个生物相对于彼此和屏幕的位置,并且是知道移动到哪里的最重要的生物。
当一个生物移动时,它使用移动方法,首先执行此操作:
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()调用),优先级取决于它在开始时描述的内容,因此如果找到捕食者,它将删除除搜索列表中的空值/空格外的所有内容,以便它可以尝试逃跑。
我的挑战是(经过长时间的啰嗦解释)在移动中它获得搜索列表的修改版本以确定生物可以移动到的位置。然而,由于空格包含空值,我无法想到一种方法来获取生物移动到的这些空间的位置/索引。 我唯一的想法就是当搜索找到一个空值来添加到列表中时,它可以创建一个新对象,它只保存move方法可以使用的坐标。只是希望有更好的方法......?
答案 0 :(得分:0)
您可以创建NullCreature
并将其用于所有空网格位置。如果你&#34; preload&#34;这些进入网格后,您的search()
方法不需要创建它们(只需将它们添加到返回列表中)。
或首选返回一个包装器对象,其中包含Creature
列表(您当前的返回值)和空位置列表。这是更好的imo,因为你真正想做的是返回更多的信息,而不仅仅是附近的生物列表。
答案 1 :(得分:0)
返回包装器对象怎么样。
enum Type{
Food, Null, Predator
}
class Wrapper{
Creature c;
int x,y;
Type positionType;
}
public ArrayList<Wrapper> search(){}
您可能还search
返回Multimap<Type, Wrapper>
,这样您就可以快速检查相邻捕食者或食物,而无需重复列表。