1

我在基于 Windows 窗体的简单游戏项目中组织 clesses 时遇到概念性问题。我必须使用 Windows 窗体实现Whack-A-Mole游戏。Molehills 由复选框表示。如果选中复选框,则痣丘中有一颗痣。可以通过单击选中的复选框来杀死鼹鼠。

我设法创建GamePlay了包含 ia 类的类:(GameBoard基于TableLayoutPanel复选框和数组的游戏板表示),Rules(概率,一轮中的最大痣数,一轮持续时间等)。在GamePlay课堂上也有PointsCounter(到目前为止已经杀死了多少痣)。我的解决方案中有更多的类/结构,但在这个问题的上下文中它们并不重要。

游戏板的大小可以在配置窗口中设置,因此我在点击开始游戏按钮后动态地在TableLayoutPanel上创建复选框。复选框数组和它们的事件处理程序放置在类中。鼹鼠被杀后我必须更新(实际上我必须添加从类中调用的适当值)。但我不能在这样的类模型中。事件处理程序复选框鼠标单击(在类中)无法访问(在类中)。GameBoardpointsForMoleKillingRulesPointsCounterGamePlayGameBoard

我应该如何重新组织类之间的依赖关系?
我的临时解决方案是 makeRules和(pointsForMoleKillingscore()来自GamePlay类)static

4

2 回答 2

1

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

如果用户想在中途保存游戏,请考虑您希望将哪些元素保存到磁盘。您可能需要rules为特定游戏保存 、score、当前time和 的状态board。这些东西是你的模型:GameModelrulesscoretimestate

现在...您希望能够以某种视觉表示形式向用户显示此模型。这被称为视图。AGameView显示您GameModel使用的 Windows 窗体。它可能通过用 a 显示分数,用 a 显示ScoreView时间,用 a或其他分隔符TimeView显示棋盘来做到这一点。BoardView

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

由于使其状态全局化而使类静态化通常不是 OO 世界中的最佳主意。

于 2012-04-09T15:58:12.383 回答
0

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

更多细节:

于 2012-04-22T16:05:41.670 回答