1

我在 C#/XNA 中创建一个蛇游戏是为了好玩,但这是练习一些好的对象设计的好机会。

蛇对象

有一个蛇对象,它本质上是一个链表,每个节点都是一个带有与地图相关的 X 和 Y 坐标的向量。

还有一些属性,例如蛇是否刚刚吃完(在这种情况下,不会为这次更新删除最后一个身体节点)、蛇移动的方向等。

地图对象

地图(游戏区域)将其内容保存在 2D 整数数组中 - 使用基元数组来存储地图应该可以减少内存消耗并且比向量数组更快(并且更容易)迭代。

内容在枚举 {Empty, Wall, Snake, Food} 中定义,然后将其存储在数组中的相关坐标处。

地图中还保留了对蛇对象的引用,以便每次调用渲染都会循环通过构成蛇的节点并将其渲染到地图上的正确位置。

问题!!

我的问题是......这种耦合是否太紧,在这种情况下是否有任何建议(即观察者模式)或者这种情况是否可以......

我试图想办法让蛇从需要知道地图使用的坐标系中解耦,但想不出一种方法让它工作并保持每个节点相对于每个节点的位置-其他。

任何答案表示赞赏,干杯!

4

3 回答 3

0

我想你自己已经暗示了答案。当前制作地图中引用的蛇的设计是两者之间的紧密耦合。

您可能需要考虑创建另一个接口,例如MapListenerSnake实现的接口。将Snake侦听地图将发布的事件并对其做出反应,从而有效地使Snake订阅者成为正在发布的事件的订阅者Map(例如按照您所说的在正确的位置进行渲染)。您甚至可以拥有侦听器的 ArrayList,这样您就可以灵活地在地图中添加新对象,当您的游戏变得越来越复杂时,该对象会对地图中的事件做出反应。

有关创建侦听器的参考,请参阅这个 SO 问题How can I code a custom listener。虽然此示例正在侦听完成下载,但您应该能够在接受的答案中看到为您的游戏创建自定义侦听器的模式。如果您需要任何说明,请告诉我,我会根据您的情况调整代码。

于 2011-10-23T20:52:14.307 回答
0

“这个耦合是不是太紧了?” 不,不是。

在这种情况下,解耦它所需的代码比简单地通过耦合实现它所需的代码更大、更复杂、更难维护。

此外,总是需要某种程度的耦合。耦合到“坐标系”通常是游戏开发中的其中之一。事实上,你可以严格地解耦你的地图和蛇对象(同样,不值得努力),但它们仍然需要共享一个公共坐标系才能进行通信。

于 2011-10-24T03:08:31.723 回答
0

这是简单的第一个想法结构:

 create an interface called MapContainable
 //marker interface
 interface MapContainable {
 }

 interface MapMovable extends MapContainable {
   ///map movement specific contract methods here
 }

class Snake implements MapMovable {
.....
}

这样,您的地图不需要知道是否存在称为蛇、食物等的具体对象。您的蛇对象不需要知道地图的存在。一条蛇只是移动!

于 2011-10-25T08:52:57.113 回答