我在基于Windows窗体的简单游戏项目中组织了有问题的概念性问题。我必须使用Windows Forms实现Whack-A-Mole游戏。 Molehills由checkoxes代表。如果选中复选框,则在鼹鼠中有一个痣。单击选中的复选框可以杀死鼹鼠。
我设法创建了包含i.a.的GamePlay
类。类:GameBoard
(基于TableLayoutPanel
的游戏板表示和复选框数组),Rules
(可用率,一轮中的最大摩尔数,轮次的持续时间等)。在GamePlay
课程中还有PointsCounter
(到目前为止已经杀死了多少痣)。我的解决方案中有更多的类/结构,但它们在此问题的背景下并不重要。
游戏板的大小可以在配置窗口中设置,所以我在点击开始游戏按钮后动态地在 TableLayoutPanel 上创建复选框。它们的复选框和事件处理程序数组放在GameBoard
类中。在鼹鼠的杀戮之后我必须更新(实际上我必须从pointsForMoleKilling
类添加名为Rules
的正确值。但我不能在这样的班级模型中。从事件处理程序复选框鼠标单击(位于PointsCounter
类中)无法访问GamePlay
(位于GameBoard
类中)。
如何重新组织类之间的依赖关系?
我的临时解决方案是Rules
,pointsForMoleKilling
和score()
(也来自GamePlay
类)静态。
答案 0 :(得分:1)
我认为你和Peekay的回答是倒退的。你的GameBoard
是一个视图(游戏状态的特定表示),不应该直接依赖于GamePlay
类,它听起来非常类似于控制器类。您也不应该将游戏模型的概念与该模型的视图混合在一起(您似乎在GameBoard
中进行过)。我建议你回顾一下MVC模式。
如果用户希望将游戏保存到中途,请考虑要将哪些元素保留到磁盘。您可能需要保存该特定游戏的rules
,score
,当前time
以及board
的状态。这些是您的模型:GameModel
包含rules
,score
,time
和state
。
现在......您希望能够以某种形式的可视化表示向用户显示此模型。这被称为视图。 GameView
使用Windows窗体显示您的GameModel
。它可能通过显示带有ScoreView
的分数,带有TimeView
的时间,带有BoardView
或其他分离的棋盘来实现此目的。
最后,您需要响应UI事件(例如鼹鼠敲击,或暂停/退出游戏)。此类负责订阅UI事件,并通过更新模型来处理这些事件。它被称为控制器。
为了使其状态为全局而使类静态化通常不是OO世界中最好的想法。
答案 1 :(得分:0)
我找到了在C#(使用XNA)简单游戏中设计类依赖关系的好方法 这是一种模板。它被称为游戏状态管理,它与 ungood 的概念非常相似。
更多详情: