Java 设计一款mvc纸牌游戏

Java 设计一款mvc纸牌游戏,java,model-view-controller,Java,Model View Controller,我正在尝试用MVC模式创建一个基于回合的纸牌游戏。我对正确的设计有些怀疑 我创建了一个由以下类组成的模型: 卡片(使用套装) 牌组(40张牌,抽牌法,剩余牌数) 桌子 西服(枚举) 玩家(手牌,人名,手牌数量,我想收集的牌) GameModel(有对甲板、桌子的引用,并在构造函数中包含两名玩家) 当用户按下“新建游戏”按钮时,我将创建两个玩家对象和游戏模型(计算机和玩家)这是正确的方法吗?(我想我不需要战略模式) 我创建了一个GameController类,它引用了GameModel类和Ga

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

我创建了一个由以下类组成的模型:

  • 卡片(使用套装)
  • 牌组(40张牌,抽牌法,剩余牌数)
  • 桌子
  • 西服(枚举)
  • 玩家(手牌,人名,手牌数量,我想收集的牌)
  • GameModel(有对甲板、桌子的引用,并在构造函数中包含两名玩家)
当用户按下“新建游戏”按钮时,我将创建两个玩家对象和游戏模型(计算机和玩家)这是正确的方法吗?(我想我不需要战略模式)

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

我需要在计算机玩游戏时,或者当有人赢了牌并在桌上拾取牌时,实现某种“暂停”,所以我想我需要创建一个带有游戏循环的可运行类。对吗

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

玩家动作示例:

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


但是在这一切中,我应该把人工智能放在哪里?谢谢你的帮助:)

这不是一个只能用一种方式回答的问题。你想只玩单人游戏还是多人游戏?对于singleplayer,您可能不需要任何线程。我建议从以下几点开始:

  • 当然,你的游戏循环应该放在你的游戏控制器里面。类似于
    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旁边解释的那样。

您可能想将此问题移至@fxm为什么不?谢谢,我不知道这个网站。@val它也可以工作,但在我看来,软件架构问题更多地属于第一个问题(主观意见,我会告诉您:))实际上,这是一个复制的游戏,现在将是非常容易的,人对电脑没有多人游戏。我需要在电脑已经玩过或者用户已经玩过的时候“暂停”,并且需要确定谁赢了牌,否则用户将什么也听不懂。无论如何,谢谢你的提示,这可能是一个很好的开始,但并不是游戏的所有动作都是瞬间的。你仍然可以在想要的地方添加Thread.sleep(timeinmillists)来减慢游戏的速度。或者你想要某种“继续”按钮吗?当然游戏控制器实现了ActionListener(已修复)。是的,你是对的,Thread.sleep()可能会导致问题。我发现这个问题解释了这个问题:要么makeTurn()启用人类玩家视图中的按钮,要么它只是在GameController中设置一个布尔值,阻止视图中的ActionEvents实际执行某些操作。是的,视图只与“自己的”控制器通信,这主要通过ActionEvents进行(也可以是其他事件类型)。我发现这篇关于分层MVC的文章非常有用: