当前位置: 首页 > 知识库问答 >
问题:

mvc纸牌游戏的设计

越星晖
2023-03-14

我正在尝试创建一个html" target="_blank">MVC模式的回合制卡牌游戏。我对正确的设计有些怀疑。

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

  • 卡(使用套装)
  • 套牌(40张牌,抽取牌法,剩余牌数)
  • 套装(enum)
  • 玩家(手牌,人名,手牌数,收藏牌我想)
  • 游戏模型(引用了Deck、Table,并在构造函数中包含两个玩家)

我将在用户按下“新游戏”按钮时创建两个Player对象和GameModel(计算机和Player)。这样做对吗?(我猜我不需要策略模式)

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

我需要实现某种形式的“暂停”,当计算机正在玩或者当有人赢了手牌并在桌上摘牌时,所以我想我需要创建一个带有游戏循环的Runnable类。正确?

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

玩家动作示例:

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

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

共有1个答案

权浩阔
2023-03-14

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

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

这是正确的继续方式吗?
我不明白为什么一个“新游戏”按钮和你描述的动作应该是一个问题。也许可以考虑“重置”这个动作中的一切,这样玩家就可以在任何他想要的时候按下按钮。

计算机正在播放时的“暂停”
是否要等待额外的时间,直到计算机播放器完成他的轮到?我会说让他越快越好。只要游戏只在人类玩家完成他的回合时继续进行。

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

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

 类似资料:
  • 我对我的编程技能越来越有信心,所以我决定重新开始之前开始的纸牌游戏。这个程序的重点是现在我对程序流程、变量、条件等有了很好的掌握,我想加深我对OOP的理解 所以我需要一些关于面向对象设计的建议 我的纸牌游戏将有5个类: Main 卡 牌组(has-a-Card-ArrayList) 玩家(拥有-从牌组对象接收的卡对象的卡数组列表) 经销商 我想知道让Dealer类成为一个接口是否合适的OOP。所有

  • 我试图用Java实现纸牌游戏“Skat” 规则: 有32张卡片。每张牌在游戏中只存在一次。 颜色有:梅花、黑桃、红心、钻石 价值观是:王牌,国王,王后,杰克,十,九,八,七 那些牌被洗牌了。有三名球员 第一轮:每位玩家有3张牌。然后将两张卡片放入Skat。 第二轮:每位玩家再获赠4张牌。 第三轮:每位玩家再获得3张牌。 期望输出:每个玩家的牌都被展示(每张牌都应该存在一次) 我的产量:钻石七(32

  • 我尝试在Java实施纸牌游戏“滑冰” 规则: 有32张牌。每张牌在游戏中只存在一次。 颜色是:梅花、黑桃、红心、钻石 这些值是:王牌、国王、王后、杰克、十、九、八、七 那些牌被洗牌了。有三个队员 第一回合:每位玩家获赠3张牌。然后将2张牌放入滑板中。 第二回合:每名玩家再获4张牌。 第三回合:每名玩家再获3张牌。 想要的输出:露出的每个玩家的牌(每张牌都要存在一次) 我的输出:钻石七(32次) 我

  • 我在做一个匹配的纸牌游戏,但我不明白如何实际做到这一点。我希望有人能帮我解释一下我能做些什么来解决这个问题。 以下是规格: 在一个对的纸牌游戏中,目标是翻出对匹配的纸牌。 https://en.wikipedia.org/wiki/contension_(游戏)以下是我们考虑的配对变化的规则。 在游戏开始时,有n张牌面朝下,其中n是4的倍数。每种卡片有4张,卡片上标有字母a、b、....例如,如果

  • 本文向大家介绍Java编写的24点纸牌游戏,包括了Java编写的24点纸牌游戏的使用技巧和注意事项,需要的朋友参考一下 任意4个1-13数字,加减乘除计算24点。 实现原理: 1)排列组合4个数字 2)计算每次排列组合的可能性 Cal24.java Combination.java 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 本文向大家介绍java实现24点纸牌游戏,包括了java实现24点纸牌游戏的使用技巧和注意事项,需要的朋友参考一下 本文题目为大家分享了java实现24点纸牌游戏的具体代码,供大家参考,具体内容如下 题目 24点游戏是经典的纸牌益智游戏。 常见游戏规则: 从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏