【问题标题】:card game desing , oop of classes卡牌游戏设计,类循环
【发布时间】:2015-08-20 10:22:18
【问题描述】:

我想写一个 4 人纸牌游戏...我的课程是:

1-主要

2张牌

3-dealer(有一个卡片对象数组和array.length = 52)

4人(有一个卡片对象数组,array.length=13//每个玩家有13张卡片)

我的问题是添加一个包含 13 个卡片对象数组的类“deck”还是简单地将这个包含 13 个卡片对象的数组添加到玩家类?

edited-是否需要任何类来检查谁是获胜者以及游戏何时结束,或者我应该在主类中实现这部分代码?

【问题讨论】:

  • 使用这样的设计,您必须确保每张卡片只有一份副本。拥有 Deck 类很有用,因为它是所有卡片的“所有者”,并通过 Deal() 方法将每张卡片传递给玩家。 Deck 类必须用卡片是否仍在卡片组中来标记每个卡片对象。您的 Dealer 对象可能与 Deck 对象相同。

标签: oop


【解决方案1】:

我想我宁愿使用Hand 这个词而不是Deck,尤其是在涉及经销商的情况下,但那是你的决定。重要的是坚持一个术语并遵循真正的领域术语(例如,如果您有游戏专家并且他们说玩家的手,那么这应该反映在代码中)。

将隐含的概念明确表达是很棒的,所以我肯定会有一个Hand 类。它将为与玩家手牌相关的任何行为提供一个自然归宿,并且可以用于强制执行不变量(例如强制一手牌最初始终由 13 张牌组成)。

请注意,也可以在Dealer.deal 方法中执行不变量。您可以使 Hand 构造函数包受到保护,deal 方法将成为 Hand 的工厂。

最后,我认为您缺少Game 概念。 main 方法可以放在 GameBootstrap 类或类似的类中,并形成您的组合根。 Game 类将负责游戏状态和规则。

【讨论】:

    【解决方案2】:

    任何一种方法都行。

    如果采用第二种方法,您需要在 Deck 中创建非私有方法,以便从类外对牌组做任何您想做的事情,例如从牌组中获取顶牌的方法,或一个随机播放。

    【讨论】:

    • 我不了解你,但我真正的纸牌不会神奇地自行洗牌。 :P 这通常是一个外部过程,如经销商或机器。
    • @Casey 我想尝试从 OOP 设计的角度过于接近地模拟现实世界不会有好的结果(也许除非你正在构建一个现实世界的模拟)。当然,在某些情况下,让套牌拥有自己的洗牌方法是没有意义的(例如,如果你希望不同的经销商以不同的方式洗牌),但这只是一个例子。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多