背景
我有以下内容:
class Fire extends Element,
class Wood扩展元素,
复合Element的class Tile。
Tile类表示世界/屏幕/画布中的图块,并且其中包含一些图形和逻辑功能。它合成了一个Element对象,因为“world”中的每个tile都是由某种实体(= element)组成的。
我希望实现火蔓延的功能 - 当火元素“触及”木质元素时,我希望木质元素变成火焰。从逻辑上讲,这应该在fire元素中完成,但是这样做,我无法更改给定的Tile元素(例如从Wood到Fire)。
“世界”被初始化为由Wood元素组成的图块网格,除了一个具有应该传播的Fire元素的图块。
我做了什么
我已经尝试将元素链接在一起,这意味着每个元素都可以访问他的四个最近邻居。这样火就可以进入附近的一块木头。这并不能解决火灾触及木材时更改瓷砖元素类型的问题。
我已经尝试将整个功能移动到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;
}
深度
提前致谢!
我的想法是应该有一个管理火势蔓延的课程。让我们说,有一个World
类,一个知道瓷砖网格及其性质的类。 Fire
对Wood
,它的位置及其邻居一无所知。 Wood
也是如此。它们是生活的独立物品。 World
决定他们居住的地方以及他们如何互相交流。
让我们想象Fire
发布一个事件并告诉
我想传播。这是我想要占据的位置。我的身高/我的强度/我的频率/我[火的任何其他特征]是......“
World
接收消息,考虑火灾的特征,并相应地修改网格。
好。有了火的强度/高度/ [任何其他特征],这个和这个
Wood
元素将被烧毁。我将用新的Fire
实例替换它们(或者我将复制现有的Fire
对象并将其引用到预期要烧制的单元格中)。
有一个Fire
实例并跟踪它燃烧的所有元素会很有趣。我可以看到复制构造函数的修改版本。
Fire(Fire current, Elements... newlyTakenElements)
虽然,你可以自由地找出自己的方式来记录它。
通过这种方式,您可以在火灾结束时(完全或部分)恢复细胞。您还可以分析火灾的发展方式。我不确定这是否会派上用场,但它的设计非常吸引人。
我正在考虑替代方案......我仍然认为向Fire
提供太多信息(整个瓷砖地图)不是一种可行的方式,Wood
和Fire
细胞之间的任何相互作用都应该通过经理类。
看看另一个场景,它表明World
提供了一个局部视图,将其视为与火元素相邻的列表。
- 我想要传播。
-好。这是相邻可燃元素的列表。我不知道你的特点。由您来决定要燃烧多少个细胞(以及哪些细胞)。
- 我把它们全部烧掉了。给我多一点!
世界给出了另一个清单,直到火灾满足为止。