简单Windows窗体游戏中类之间的依赖关系

时间:2012-04-09 13:08:57

标签: c# winforms oop dependencies concept

我在基于Windows窗体的简单游戏项目中组织了有问题的概念性问题。我必须使用Windows Forms实现Whack-A-Mole游戏。 Molehills由checkoxes代表。如果选中复选框,则在鼹鼠中有一个痣。单击选中的复选框可以杀死鼹鼠。

我设法创建了包含i.a.的GamePlay类。类:GameBoard(基于TableLayoutPanel的游戏板表示和复选框数组),Rules(可用率,一轮中的最大摩尔数,轮次的持续时间等)。在GamePlay课程中还有PointsCounter(到目前为止已经杀死了多少痣)。我的解决方案中有更多的类/结构,但它们在此问题的背景下并不重要。

游戏板的大小可以在配置窗口中设置,所以我在点击开始游戏按钮后动态地在 TableLayoutPanel 上创建复选框。它们的复选框和事件处理程序数组放在GameBoard类中。在鼹鼠的杀戮之后我必须更新(实际上我必须从pointsForMoleKilling类添加名为Rules的正确值。但我不能在这样的班级模型中。从事件处理程序复选框鼠标单击(位于PointsCounter类中)无法访问GamePlay(位于GameBoard类中)。

如何重新组织类之间的依赖关系?
我的临时解决方案是RulespointsForMoleKillingscore()(也来自GamePlay类)静态

2 个答案:

答案 0 :(得分:1)

我认为你和Peekay的回答是倒退的。你的GameBoard是一个视图(游戏状态的特定表示),不应该直接依赖于GamePlay类,它听起来非常类似于控制器类。您也不应该将游戏模型的概念与该模型的视图混合在一起(您似乎在GameBoard中进行过)。我建议你回顾一下MVC模式。

如果用户希望将游戏保存到中途,请考虑要将哪些元素保留到磁盘。您可能需要保存该特定游戏的rulesscore,当前time以及board的状态。这些是您的模型:GameModel包含rulesscoretimestate

现在......您希望能够以某种形式的可视化表示向用户显示此模型。这被称为视图。 GameView使用Windows窗体显示您的GameModel。它可能通过显示带有ScoreView的分数,带有TimeView的时间,带有BoardView或其他分离的棋盘来实现此目的。

最后,您需要响应UI事件(例如鼹鼠敲击,或暂停/退出游戏)。此类负责订阅UI事件,并通过更新模型来处理这些事件。它被称为控制器。

为了使其状态为全局而使类静态化通常不是OO世界中最好的想法。

答案 1 :(得分:0)

我找到了在C#(使用XNA)简单游戏中设计类依赖关系的好方法 这是一种模板。它被称为游戏状态管理,它与 ungood 的概念非常相似。

更多详情: