面向对象设计问题:一个纸牌游戏

3

我对我的编程技能有了更多信心,所以我决定重新开始一个之前开发的纸牌游戏。现在这个程序的目标是,由于我对程序流程、变量、条件等方面有了不错的掌握,我想深入了解面向对象编程。

因此,我需要一些关于面向对象设计的建议。

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

  1. Main
  2. Card
  3. Deck(拥有一个 Card ArrayList)
  4. Player(从 Deck 对象接收 Card 对象的 Card ArrayList)
  5. Dealer

我想知道将 Dealer 类作为接口是否符合面向对象编程的原则。所有玩家都应该能够扮演荷官的角色,但不用说,在每一轮发牌中只有一个荷官。即使在任何给定回合中有 8 个 Player 对象中的 7 个不使用其实现的方法,也不能将其视为荷官。那么,即使如此,将 Player 类实现荷官可执行的方法(例如 dealGame())是否可以,或者将 dealGame() 方法归属于 Deck 类并调用 deck 来发牌是否更好?抱歉如果这是一个愚蠢的问题,但我对面向对象编程的原则有点模糊,想要一些建议,以便第一次就做对。

我还想让 Dealer 扩展 Player,但我认为这是错误的,因为我需要玩家能够在游戏中随时扮演荷官的角色,而不是以不可改变的方式声明为 Dealer 对象。在这种情况下,如果 Dealer 扩展 Player,则我认为需要将游戏中的所有玩家都声明为 Dealers。

所以基本上我在问:

  1. 如果您正在开发这 5 个类的纸牌游戏,您会将 Dealer 类作为接口,其余正常类吗?为什么或为什么不?
  2. 我的面向对象编程是否正确?还是我完全迷失了方向?

1
你似乎大部分都走在正确的轨道上。但是我对于Dealer类不太确定。也许一个更好的想法是创建一个Game类,它可以跟踪元数据。它处理来自牌堆的实际发牌,跟踪哪些玩家已经弃牌,哪个玩家是庄家,计分等等。 - nhgrif
我知道在现实生活中玩家可以担任庄家,但在这个真实生活的模拟中这是否必要?我的意思是,玩家作为玩家的身份与他们作为庄家的身份是否有任何联系。 - Richard Tingle
1
对我来说,像dealGame()这样的方法应该属于其他与游戏相关的类。玩家是否是庄家只是一个布尔标志的问题,这将使他们有权限在某种类型的游戏或桌子对象上调用这些方法。 - Maciej Stachowski
3个回答

4
你的方法很好,但仍需改进:)所有类都很好,但Delaer不行。
首先 - 如果玩家在一轮中是庄家,第二轮有其他人成为庄家,我不认为需要扩展类或接口。
实际上,最好不要让任何一个玩家成为庄家,这会让事情变得复杂。处理这个问题最简单、最好的方法是创建"5.Game"。 "Game"拥有牌堆和所有玩家,它的工作方式类似于庄家。等待玩家响应,显示牌等。
如果你真的想让玩家成为庄家,那就更复杂了 :). 你也需要"Game"类,因为"Game"必须决定谁开始成为庄家,并应该收回或给予玩家成为庄家的权利(我看不出这有什么意义,但如果你想... :))。
怎么做呢?"Game"有一个"Player dealer"变量。应该有像"registerDealer(Player player)"这样的方法。然后你需要某种接口来在"Game"和"Player"之间通信。
如果你希望"Player"对"Game"负起全部责任,可以使用"visitor模式"。 (它允许"dealer" "潜入"游戏实例并做任何公共方法所能做的事情)。
否则,你可以让"Game"询问"dealer"该做什么,并等待玩家输入。这应该通过调用像"dealer.askWhatToDo()"这样的方法并使用返回值进行操作来完成。它允许验证输入... 但是如果我没记错,在扑克中只有一种有效输入,所以如果"Game"本身决定该做什么,我就看不出有任何区别了...
我唯一能想到的原因是,如果"dealer"可以洗牌或提高底注之类的话,那就可以这样做... 或者如果你想模拟具有扑克玩家的扑克游戏,并且庄家可以做一些非有效的事情,就像现实生活中一样:)。

1
确实,第九个实体可以与任何8位玩家分开进行交易。 - Richard Tingle
这似乎是继续的最佳方式。Game具有类型为Player的dealer实例变量的想法非常合理,其他想法也是如此。感谢您的建议! - Justin

1
这主要取决于程序的工作方式、每个类的预期功能以及每个对象的生命周期如何运作(例如,玩家是否可以在后续回合成为荷官)。
从您写的内容中,我的第一印象是您需要一个基类“人”,从中继承“玩家”和“荷官”,但这只是根据有限信息的猜测。

1

Dealer并不是一个特殊类型的玩家。它只是一种具有特殊责任的Player实例。我认为你走在了正确的道路上,但你可能需要为你正在玩的特定游戏创建一个类。

假设你在编写一个扑克游戏。在这种情况下,荷官有时可以影响游戏顺序(取决于风格)。但如果你在玩战争游戏,荷官只是发牌人,你并不在乎谁是荷官。在这种情况下,“谁是荷官”和“荷官如何处理游戏”这个概念是游戏本身的责任,而不是玩家的责任。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接