我正在C#/ XNA中创建一个蛇游戏,但这是练习一些好的对象设计的好机会。
蛇对象
有一个蛇对象,它本质上是一个链表,每个节点都是一个X&与地图有关的Y坐标。
还有一些属性,例如蛇是否刚吃过(在这种情况下,最后一个体节点没有被移除),蛇正在移动的方向等。
地图对象
地图(游戏区域)将其内容保存在2D整数数组中 - 使用基元数组来存储地图应该记住内存消耗并且比矢量数组更快(更容易)迭代。
内容在枚举{Empty,Wall,Snake,Food}中定义,然后存储在相关坐标的数组中。
还会在地图中的蛇对象中保留一个引用,以便每次渲染渲染,遍历构成蛇的节点并将其渲染到地图上的正确位置。
问题!!
我的问题是......这种耦合太紧,在这种情况下是否有任何建议(即观察者模式)或者这种情况是否可以......
我试图想出一种方法来将蛇与需要知道地图使用的坐标系统分离,但却想不到让它工作的方法并保持每个节点相对的位置彼此。
任何答案都赞赏,欢呼!
答案 0 :(得分:0)
我想你自己已经暗示了答案。目前在地图中引用Snake的设计是两者之间的紧密耦合。
您可能需要考虑创建MapListener
将实现的另一个界面,例如Snake
。 Snake
将收听地图将发布并对其做出反应的事件,有效地使Snake
订阅者发送Map
正在发布的事件(例如呈现在正确的位置正如你所说)。您甚至可以拥有监听器的ArrayList,这样您就可以灵活地在地图中添加新的Object,当您的游戏变得更加复杂时,它会对地图中的事件做出反应。
有关创建监听器的参考,请参阅此问题How can I code a custom listener。虽然此示例正在监听完成下载,但您应该能够在接受的答案中看到为您的游戏创建自定义侦听器的模式。如果您需要任何澄清,请告诉我,我会根据您的情况调整代码。
答案 1 :(得分:0)
“这种耦合太紧了吗?” 不,不是。
在这种情况下,解耦它所需的代码比使用耦合简单实现它所需的代码更大,更复杂,更难维护。
此外,总是需要一定程度的耦合。耦合到“坐标系”通常是游戏开发中的一种。事实上,您可以严格地将地图和蛇形物体分离(再次,不值得付出努力),但它们仍然需要共享一个共同的坐标系以便进行交流。
答案 2 :(得分:0)
这是一个简单的第一个思想结构:
create an interface called MapContainable
//marker interface
interface MapContainable {
}
interface MapMovable extends MapContainable {
///map movement specific contract methods here
}
class Snake implements MapMovable {
.....
}
这样,你的地图不需要知道是否有称为蛇,食物等的具体物体。你的蛇对象不需要知道地图的存在。蛇只是移动!