背景
我有以下内容:
类火灾扩展元素,
类伍德延伸元素,
组成元素的Tile类。
Tile类表示世界/屏幕/画布中的图块,并具有一些图形和逻辑功能。 它合成了Element对象,因为“世界”中的每个图块都是由某种物质(=元素)组成的。
我想实现火势蔓延的功能-当火元素“接触”木元素时,我希望木元素成为火。 从逻辑上讲,这应该在fire元素内完成,但是这样做,我无法更改给定Tile的元素(例如,从Wood更改为Fire)。
“世界”被初始化为由Wood元素组成的瓷砖网格,但其中一个具有Fire元素的瓷砖应被散布。
我尝试过的内容
我尝试将元素链接在一起,这意味着每个元素都可以访问他的四个最近的邻居。这样,火可以进入附近的一块木头。 这不能解决在火接触到木头时更改Tile的元素类型的问题。
我尝试将整个功能移到Tile类。尽管它确实可以解决问题,但由于两个原因,我不喜欢它:
从逻辑上讲,我希望火势能够自主行动,这意味着火是蔓延的,而不是 tile 。
因此,Tile类具有许多仅与火相关的方法(例如spread()),这需要我检查-“此tile是否由火元素组成?”,这很糟糕练习。
代码示例
class Fire extends Element{
public void spread(){
// Move to all four neighbors and turn them into Fire elements
}
}
class Wood extends Element{
}
class Tile{
private Element _element;
}
深度
图块的“网格”由二维图块数组(逻辑部分)和由所有图块组成的JavaFx窗格(可视部分)组成。
当火接触到相邻的瓦片并将其从“木材”转换为“火”时,会“蔓延”。当消耗(=转换为火)给定的木材阈值时,火停止蔓延。它消耗了30块木头之后。从某种意义上说,火可以追踪消耗的木材。
谢谢!
答案 0 :(得分:2)
我立即想到应该有一个班级来管理火势蔓延。假设有一个World
类,该类了解磁贴的网格及其性质。 Fire
对Wood
,其位置和邻居一无所知。 Wood
也是如此。它们是生活的独立对象。 World
可以决定它们的位置以及它们如何相互作用。
让我们想象Fire
发布一个事件并告诉
我想传播。这是我想占用的位置。我的身高/强度/频率/我的[火的其他特征]是...“
World
收到消息,考虑到火的特性,并相应地修改了网格。
好。在这种强度/高度/ [任何其他特征]的情况下,这个
Wood
元素将被燃烧。我将用新的Fire
实例替换它们(或者我将复制现有的Fire
对象并将其引用放入预期要刻录的单元格中。)
拥有一个Fire
实例并跟踪其燃烧的所有元素会很有趣。我可以看到复制构造函数的修改版本。
Fire(Fire current, Elements... newlyTakenElements)
不过,您可以自由地以自己的方式记录它。
这样,当火势结束时,您将能够(全部或部分)恢复细胞。您还可以分析火势如何发展。我不确定这是否会派上用场,但是设计很有趣。
我正在考虑替代方案...我仍然认为向Fire
提供过多信息(整个图块)不是一种可行的方法,Wood
和{{ 1}}单元格应该经过manager类。
看看另一种场景,该场景建议Fire
提供其自身的部分视图,作为与fire元素相邻的列表。
-我想传播。
-确定。这是相邻可燃元素的列表。我不知道你的特征。由您决定要烧多少个电池(和哪个)。
-我已经全部烧光了。给我更多!
在火势蔓延之前,世界会给出另一个清单。