0

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

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

我需要建立一个班级,为他们创造一个可以漫游的环境。我在想二维数组是否适用于同样的情况?

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

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

4

5 回答 5

0

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

二维数组

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

地图

(在我看来)解决此问题的更好方法是使用Map. 您应该创建一个Position具有两个变量(或三个用于三维地图)的类,用于记录 X 和 Y 位置(确保您还实现了equals()andhashCode()方法)。然后,您可以使用Position对象作为Map实现中的键,针对Animal. 这将允许更快地搜索特定位置(请参阅HashMap 与 ArrayList 的性能我是否正确),以及更整洁的代码,即在遍历整个地图时没有嵌套循环。您可以像这样遍历整个地图:

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

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

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

于 2013-09-09T07:27:09.633 回答
0

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

当您还需要一个 3 维时,例如对于正在飞行的鸟类或地面上的蠕虫,您将需要一个 3 维数组

问候

于 2013-09-09T07:19:39.577 回答
0

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

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

所以你有了:

int[][] tiles = ...;
// something in the air moved to 0, 1..
tiles[0][1] ||= 0x2;
于 2013-09-09T07:19:49.323 回答
0

想想棋盘。它由正方形组成。每个方格上都可以有一块。

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

世界可以有一个二维数组,每个正方形可以有一个动物或一个动物List<Animal>

于 2013-09-09T07:20:06.157 回答
0

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

要查看这方面的示例,请查看这个 Java 小程序。蓝点是巡逻艇,黄点和绿点是各种类型的船只,应该在紫线以北。如果他们越线,他们就会被拦截并登机接受检查。动画必须以时间步长的方式完成,但底层模型是离散事件。如果您单击暂停按钮,然后单击播放按钮,您将看到模型在不与动画的时间步长绑定时像蝙蝠一样运行。用小动物代替船并改变特定的行为,这是您动物模拟的合理开始。

于 2013-09-09T14:20:17.313 回答