假设扑克牌的每个值都由一个单独的类描述:
class Jack {
...
}
class Queen {
...
}
还有一个单独的甲板类:
class Deck {
...
}
对如何正确描述卡资历关系感兴趣。例如,在任何纸牌游戏中(实际上,但这无关紧要)皇后比杰克年长,而平手比国王年轻。另外,不要忘记在某些游戏中有王牌,因此任何王牌都会比任何非王牌更老。
据我了解,这应该在每个类(对于每种类型的地图)中进行描述。但是怎么办?是否有必要列出所有比这张牌更老(和更小)的牌?如果我的推理正确,如何用 Ruby 语言做到这一点?还是应该在整个牌组的层面上描述关系?
尽管表面上显而易见,但我认为继承在这里毫无用处。最起码会有很多类,每个类不仅要定义,还要初始化。具体来说,要确定优先级,定义一个属性
seniority(precedence)和一个方法就可以了can_hit?。这足以确定资历,并重新定义(同一个例子,当 2 可以击败 ace 时)。例如,这就是我们确定 2 可以击败 A 的方式:
好吧,仍然需要定义工厂:
使用示例:
我故意没有考虑示例中的花色。问题中没有关于他们的任何内容。要使用花色(尤其是像小丑这样的牌),您很可能需要使用组合(请参阅Ruby 中的实用面向对象设计,第 1章
Combining Objects with Composition)。但我希望,思想的总体方向是明确的。更新:
做了个小例子。花色也有长短之分,但为了使例子更完整,以“传统”方式进行比较。
使用示例:
我建议从基类继承所有类型的卡片
Card,例如,在其中使用内部数组,TYPES我将设置卡片“类型”的顺序。这种数组的索引将决定类型之间的优先级。构造函数可以通过花色suit和这张牌是否是王牌trump。为了让类对象可以相互比较,我们使用
includemoduleComparable,然后我们重新定义了 <=> 运算符。之后,您可以从基类显式继承地图类
Card或者使用元编程工具创建它们(无论如何它们都是相同的类型)。在一个循环中,我们遍历映射数组
Card::TYPES并动态创建从类继承的同名类Card因此,这些类的对象可以相互比较。给定王牌花色,要将牌标记为王牌,将 true 作为第二个参数传递给构造函数。
因此,无论您组成什么样的套牌,
Deck都可以将其正确排序并将每张牌与另一张牌进行比较,同时考虑到当前的王牌花色。我怀疑资历关系可以用一些属性,值/权重来描述,其中会包含一个数字。
那么卡片之间的所有关系都可以用数学或逻辑表达式的形式来描述。
如果花色是王牌,那么您可以为相同花色的所有牌增加一些值。