【问题标题】:Java: Getting the array location of null valuesJava:获取空值的数组位置
【发布时间】: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


【解决方案1】:

返回一个包装对象怎么样。

enum Type{
    Food, Null, Predator
}

class Wrapper{
    Creature c;
    int x,y;
    Type positionType;
}

public ArrayList<Wrapper> search(){}

您还可以让search 返回Multimap&lt;Type, Wrapper&gt;,这样您就可以快速检查附近的捕食者或食物,而无需重复列表。

Multimap

【讨论】:

  • Multimap....不是我以前用过的东西(仍在学习 Java)...会研究一下,看看我是否能理解它是如何工作的 :) 虽然 Wrapper 的想法似乎很有趣...只是不确定如何实现它。似乎也是确定在搜索中找到哪些生物类型的更好方法。
  • Multimap 基本上是一个Map&lt;Key, List&lt;Value&gt;&gt;。如果您对地图不是那么熟悉,您可能希望坚持使用列表,然后搜索您需要的内容。
【解决方案2】:

您可以创建NullCreature 并将其用于所有空网格位置。如果您将这些“预加载”到网格中,则您的 search() 方法不需要创建它们(只需将它们添加到返回列表中)。

或 preferable 返回一个包装器对象,其中包含一个 Creature 列表(您当前的返回值)和一个空位置列表。这比 imo 更好,因为您真正想要做的是返回更多信息,而不仅仅是附近生物的列表。

【讨论】:

  • 我宁愿不要用对象填充整个 gridloc 数组,因为它不应该被需要,因为一半的时间这些元素/对象不会被使用。它只是我需要能够告诉坐标的每个生物周围的空/空值。我想一个包装类会比为空白空间对象创建一个全新的 Creature 子类更好、更有效......
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 2021-05-30
  • 1970-01-01
相关资源
最近更新 更多