【问题标题】:OOP Design Quesiton with a Card Game纸牌游戏的 OOP 设计问题
【发布时间】:2013-11-02 10:43:02
【问题描述】:

我对自己的编程技能越来越有信心,所以我决定重新开始我之前开始的纸牌游戏。这个程序的重点是现在我对程序流程、变量、条件等有了不错的把握,想加深对OOP的理解

所以我需要一些关于面向对象设计的建议

我的纸牌游戏将有 5 个类:

  1. 主要
  2. 卡组(有卡片数组列表)
  3. 玩家(拥有从 Deck 对象接收到的 Card 对象的 Card ArrayList)
  4. 经销商

我想知道将 Dealer 类设置为接口是否适合 OOP。所有玩家都应该可以扮演庄家的角色,但不用说,每轮牌只有一个庄家。是否可以让 Player 类实现经销商可以执行的方法(例如 dealGame()),即使在任何给定回合中 8 个 Player 对象中有 7 个不会使用他们实现的方法,而且,不是被视为当时的经销商?还是让dealGame() 方法属于Deck 类并调用Deck 来处理游戏会更好?抱歉,如果这是一个愚蠢的问题,但我对 OOP 的原则有点粗略,希望得到一些建议,以便在第一时间学会正确地做。

我也想过让 Dealer 扩展 Player,但我认为那是错误的,因为我需要玩家即时承担 Dealer 的角色,而不是以不可更改的方式被声明为 Dealer 对象。在这种情况下——如果 Dealer 扩展 Player——我想我需要将游戏中的所有玩家声明为 Dealers。

所以基本上我在问:

  1. 如果您要使用这 5 个类制作纸牌游戏,您是否会将 Dealer 类设为接口,而将其余类设为常规类?为什么?
  2. 我在 OOP 方面大体上是在正确的轨道上还是我完全迷路了?

【问题讨论】:

  • 你似乎大部分都在正确的轨道上。不过,我不确定Dealer 课程。也许一个更好的主意可能是一个Game 类,它跟踪元数据。它处理牌堆中纸牌的实际处理,跟踪哪些玩家弃牌等,以及哪个玩家是庄家,记分等。
  • 我知道在现实生活中玩家进行交易,但在这种对现实生活的模拟中,这真的很重要吗?我的意思是玩家作为玩家的身份与他们作为经销商的身份有任何联系
  • 对我来说,诸如 dealGame() 之类的方法属于其他一些与游戏相关的类。玩家是否是庄家只是一个布尔标志的问题,这将允许他们在某种 Game 或 Table 对象上调用这些方法。

标签: java class oop interface


【解决方案1】:

这在很大程度上取决于程序的工作方式、您期望每个类能够做什么以及每个对象的生命周期如何工作(例如,玩家能否在后面的回合中成为庄家)。

我对您所写的第一印象是您需要一个基类“person”,“player”和“dealer”从该基类继承,但这只是根据有限信息进行的猜测。

【讨论】:

    【解决方案2】:

    庄家并不是一种特殊类型的玩家。一次只是 Player 的一个实例,具有特殊责任。我认为你在正确的轨道上,但你可能想为你正在玩的特定游戏创建一个类。

    假设您正在编写一个扑克游戏。在这种情况下,庄家偶尔会影响游戏的顺序(取决于风格)。但如果你在玩战争,庄家只是发牌的人,你真的不在乎。在这种情况下,“谁是庄家”和“庄家应该如何处理游戏”的概念是游戏本身的责任,而不是玩家的责任。

    【讨论】:

      【解决方案3】:

      你有很好的方法,但仍有一些工作要做:)。所有的课程都很好,但 Delaer 不是。

      首先 - 如果玩家在一轮是庄家,第二轮是其他人是庄家,我看不到扩展类或接口的点。

      事实上,一开始,我不会让任何玩家成为庄家,这会让事情变得复杂。

      解决这个问题的最简单和最好的方法是创建 5.Game。游戏有甲板和所有玩家,它的工作方式与经销商类似。它等待玩家响应,它应该显示卡片等等。

      如果你真的想让玩家成为经销商,那就更复杂了:)。好吧,您还需要 Game 类,因为 Game 必须决定谁作为经销商开始,它应该剥夺或给予玩家经销商权利(我不明白它的意义,但如果你想要......: ) )。

      那该怎么做呢? GamePlayer dealer 变量。如果应该有类似registerDealer(Player player) 的方法。然后你需要某种接口在GamePlayer 之间进行通信。 如果您希望PlayerGame 负全部责任,您可以使用Visitor pattern。 (它允许dealer“潜入”游戏实例内部并执行任何公共方法可以执行的操作)。

      否则,您可以让Game 询问dealer 做什么,然后等待玩家输入。应该通过调用dealer.askWhatToDo() 之类的方法并使用返回值进行操作来完成。它允许验证输入...但是如果我是对的,扑克中的有效输入总是只有一个,所以我看不出有什么区别,如果Game 自己决定做什么...

      我看到的唯一原因是如果dealer 可以洗牌或提高基础或类似的东西,那么它可以做到......或者如果你想模拟扑克游戏与扑克玩家和经销商不能做- 现实生活中的有效事物:)。

      【讨论】:

      • 确实,第 9 个实体可以独立于 8 个玩家中的任何一个进行交易
      • 这似乎是最好的方法。 Game has - Player 类型的经销商实例变量的想法非常有意义,其他想法也是如此。感谢您的建议!
      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多