【问题标题】:Designing a mvc card game设计一个mvc纸牌游戏
【发布时间】:2014-05-22 08:57:44
【问题描述】:

我正在尝试使用 MVC 模式创建一个回合制纸牌游戏。我对正确的设计有些怀疑。

我创建了一个由这些类组成的模型:

  • 卡片(使用套装)
  • 牌组(40 张牌,抽牌法,剩余牌数)
  • 西装(枚举)
  • 玩家(手牌,姓名,如果是人,手牌数量,收集的牌我认为)
  • GameModel(引用了 Deck、Table 并在构造函数中包含两个玩家)

当用户按下“新游戏”按钮时,我将创建两个 Player 对象和 GameModel(计算机和玩家)。 这是正确的方法吗?(我猜我不需要策略模式)

我创建了一个 GameController 类,它引用了 GameModel 类和 GameFrame(视图)类。

我需要在计算机正在玩或有人赢牌并拿起桌上的牌时实现某种“暂停”,所以我想我需要创建一个带有游戏循环的 Runnable 类。对吗?

这些类应该如何交互? (这是正确的英文吗?xD)

玩家动作示例:

点击卡片按钮 --> actionListener --> 调用 GameController 方法来检查动作是否可能(轮到我玩,我可以玩,电脑玩) --> 如果可能的话,GameController 更新 GameModel --> GameLoop注意 GameModel 的变化并调用一些升级视图的 UI 方法(使用一些 Thread.sleep(...))。 这行得通吗?

但在这一切中,我应该把 AI 放在哪里?感谢您的帮助 :)

【问题讨论】:

标签: java model-view-controller


【解决方案1】:

这不是一个只能用一种方式回答的问题。你想让它只有单人游戏还是多人游戏?对于单人游戏,您可能不需要任何线程。我建议一开始就做以下事情:

  • 当然,您的游戏循环应该放置在您的 GameController 中。类似while(gameNotFinished()) { player = determineNextPlayer(); player.makeTurn(); }
  • 添加另一个 mvc 层次结构:PlayerView PlayerController PlayerModel。它将使您的代码更具可读性。在这种情况下,PlayerController(使用 makeTurn())可能是一个接口,因此您可以使用 HumanPlayerController 和 ComputerPlayerController(它有并且不需要视图)来实现它。
  • GameController 实现了 ActionListener:因此您只需将控制器添加到每个按钮或您拥有的任何东西上,然后它就会处理用户输入。
  • 确保不要将控制代码写入视图。视图只向控制器发送用户请求
  • 对视图和模型使用观察者模式。请参阅 java.util.Observer 和 java.util.Observable。当模型发生变化(例如卡片被放下)时,它会通知观察者(所有视图),然后视图将新卡片放在最上面。

这是正确的方法吗?
我不明白为什么“新游戏”按钮和您描述的操作应该是一个问题。也许考虑在这个动作中“重置”所有东西,这样玩家就可以随时按下按钮。

电脑播放时的“暂停”
你想等待额外的时间直到电脑玩家完成他的回合吗?我会说让他尽快上场。只要游戏只有在人类玩家完成他的回合后才能继续。

这行得通吗?
我会将其更改为以下内容:
点击卡片按钮 --> GameController (是ActionListener) --> 检查动作是否可能的方法(轮到我玩,电脑玩 卡片可以放下。控制器联系人轮到你了!当轮到你时,禁用卡片按钮,makeTurn() 将再次启用它)--> 如果可能,GameController 更新 GameModel --> GameModel 通知所有观察者(视图),然后他们得到更新了

我应该把 AI 放在哪里?
正如上面在实现 PlayerController 接口的 HumanPlayerController 旁边所解释的那样。

【讨论】:

  • 现在游戏将非常简单,人机大战没有多人游戏。我需要在电脑已经玩过或者用户已经玩过的时候“暂停”,需要判断谁赢了这手牌,否则用户什么都不懂。无论如何,感谢您的提示,这可能是一个好的开始,但并非游戏的所有动作都可以瞬间完成。
  • 您仍然可以在需要的地方添加 Thread.sleep(timeInMilliSeconds) 来减慢游戏速度。还是您想要某种“继续”按钮?
  • 当然 GameController 实现了 ActionListener(固定)。是的,你是对的, Thread.sleep() 可能会导致问题。我发现这个问题解释了这个问题:stackoverflow.com/questions/14074329/…
  • 要么 makeTurn() 启用人类玩家视图中的按钮,要么它只是在 GameController 中设置一个布尔值,以防止视图中的 ActionEvents 实际执行某些操作。
  • 是的,视图只与其“自己的”控制器通信,这主要通过 ActionEvents 进行(也可以是其他事件类型)。我发现这篇关于分层 MVC 的文章非常有用:javaworld.com/article/2076128/design-patterns/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
相关资源
最近更新 更多