设计一个mvc纸牌游戏

时间:2014-05-22 08:57:45

标签: java model-view-controller

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

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

  • 卡(使用套装)
  • 甲板(40张卡,提取卡方式,剩余卡数)
  • 西装(enum)
  • 玩家(手牌,人名,手中的牌数,我认为收集卡)
  • GameModel(引用Deck,Table并在构造函数中引用两个玩家)

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

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

我需要在计算机正在播放时或某人赢得牌并在桌面上挑选牌时实施某种“暂停”,所以我想我需要创建一个带游戏循环的Runnable类。正确的吗?

这些课程应如何互动? (这是正确的英语吗?xD)

玩家行动示例:

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

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

1 个答案:

答案 0 :(得分:3)

这不是一个只能用一种方式回答的问题。你想只制作单人游戏还是多人游戏?对于单人游戏,您可能不需要任何线程。我会建议你开始关注事情:

  • 当然,你的游戏循环应该放在你的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通知所有Observers(视图),然后更新

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