动物模拟建议

时间:2013-09-09 07:12:56

标签: java arrays simulation

我目前正在构建一个简单的模拟软件,模拟环境中的动物以及它们通常如何相互作用。

“动物被创建为对象。所以我有一个主Animal类,以及许多其他扩展此类的类(即Wolf, Lion, Deer等)。

我需要构建一个为其创建环境的类来进行漫游。我在想二维数组是否可以同样工作?

动物对象将能够在此矩阵上“漫游”,扫描周围的细胞以供其他动物进行交互。

这是为对象“移动”构建特定环境的最佳方式吗?只是在寻找意见。

5 个答案:

答案 0 :(得分:0)

二维数组会很好。在创造一种竞技场时非常好。

当您还需要第三维时,例如对于飞行的鸟类,或者你想要的地面蠕虫 需要一个三维数组

此致

答案 1 :(得分:0)

是的,这是一个非常好的开始方式。去吧!

你去的一个提示......你可以使用位掩码来实现广场上的实际内容(而不是第三个维度)。因此,地面上的东西可能会占用0x1位,空中的某些东西可能需要0x2(二进制= 10)。

所以你有:

int[][] tiles = ...;
// something in the air moved to 0, 1..
tiles[0][1] ||= 0x2;

答案 2 :(得分:0)

想象一下国际象棋棋盘。它由正方形组成。每个广场上都有一块。

对于你的想法,董事会就像世界一样。广场是世界上的一个区域。一件是动物。

世界可以有一个2d的正方形阵列,每个正方形可以有一个动物或List<Animal>

答案 3 :(得分:0)

你可能有很多方法可以解决这个问题。其中大部分都不为我所知。但是我最近以两种不同的方式解决了类似的问题:

二维数组

将“Map”实现为二维数组是一个显而易见的解决方案。最有可能在这种情况下,您需要List实现,以便您可以轻松调整大小。然而,它将需要嵌套循环等来搜索特定位置,索引可能会变得有些混乱。

地图

A(在我看来)解决这个问题的更好方法是使用Map。您应该创建一个Position类,其中包含两个变量(或三个三维地图),用于记录X和Y位置(确保您还实现了equals()hashCode()方法)。然后,您可以使用Position对象作为Map实现中的密钥,存储在Animal的实例中。这将允许更快地搜索特定位置(参见HashMap vs ArrayList performance am I correct)和更整洁的代码,即在迭代整个地图时没有嵌套循环。您可以像这样遍历整个地图:

for(Map.Entry<Position, Animal> entry : animalMap.getEntries()){
    //Do stuff
}

几年前,我看到了一个实施Fox / Rabbit模拟的教程项目。您可能想要了解一些想法:http://www.bluej.org/objects-first/

您需要下载“Book Projects”.zip文件。相关项目见第10章。

答案 4 :(得分:0)

对于完全不同的方法,请查看this paper,其中介绍了如何在离散事件框架中进行移动和感知,而不是时间步长/网格框架。优点包括它可以很容易地推广到3-d,并且模型会在实际发生的时间和地点发生,而不是四舍五入到最近的delta-t和空间网格位置。在大多数情况下,它的计算效率也更高。如果您拥有n个生物,则每个delta-t都会评估O(n**2)个潜在的互动。相比之下,当一个事件发生时,它会改变单个生物的状态,所以你只需要做O(n)工作,看看这个改变可能会影响与所有其他生物的交互。由于事件通常比时间步骤更少,因此这在计算上会转化为巨大的胜利。

要查看此示例,请查看this Java applet。蓝点是巡逻艇,黄点和绿点是各种类型的船,应该留在紫线以北。如果他们越过线路,他们就会被拦截并登船检查。动画必须以时间步进的方式完成,但底层模型是离散事件。如果单击暂停按钮然后单击播放按钮,您将看到模型在没有与动画的时间步进相关联的情况下像蝙蝠一样运行。用小船替代小动物并改变特定的行为,这是你的动物模拟的合理开始。