是否有更简单的方法来比较一个套件胜过另一个套件的卡?

时间:2014-03-15 04:18:01

标签: python algorithm

我想自己创造一个新的扑克游戏。

我需要比较扑克牌的价值。

在这个游戏中,Spade> Heart>俱乐部>钻石(关系可通过,例如:Spade>俱乐部,Heart> Diaomd),有一个特殊的规则,钻石胜过Spade(但仍然比心脏和俱乐部弱)。

我想使用S,H,C,D作为头而不是a,b,c,d。

到目前为止,有两名玩家需要比较他们的牌,如果他们的牌有相同的牌,那么数值较大的牌(代表A到K)就会胜出。

但对我而言,我只是想出一种笨拙的方式来实现这种比较。那是为了消除这种可能性。

喜欢:

如果A卡是S,如果B卡是S,H,C,D怎么办

如果A卡是H,如果B卡是S,H,C,D该怎么办

如果A卡是C,如果B卡是S,H,C,D该怎么办

如果A卡是D,如果B卡是S,H,C,D怎么办

因此我需要进行近16次的比较。虽然我已经发现我可以对所有相同的颜色进行相同的比较,例如S vs S,D vs D,但我仍然需要进行13次比较。

有没有更好的方法进行比较,或者这已经是最好的方法了?

3 个答案:

答案 0 :(得分:2)

以下是使用lookup table两个维度的方法。在最小条件下,可以使用它来解决两个不同套件之间的这种排序,因为它会考虑范围内的两个套件。

也就是说,考虑一个矩阵,其中列代表一张卡,而行代表另一张

   S H C D
S  0 w w l
H  l 0 w w
C  l l 0 w
D  w l l 0

其中值为w = win,l = lost,0 = tie。

然后可以查看特定行和列的值以确定哪个卡获胜。例如

m(row, col) -> result
m(S, D)     -> l (spade loses to diamond; means diamond wins spade)
m(S, H)     -> w (spade wins heart)
m(H, D)     -> w (heart wins diamond)
m(D, S)     -> w (diamond wins spade)
m(D, D)     -> 0 (huh? well, diamond ties diamond)

通过将S,H,C,D转换为索引0,1,2,3,可以通过列表/数组轻松实现。它只需要一次查找(如果你为每个维度计算一个,则需要两个)以确定两个套件之间的结果。

由于结果是3个不同值之一,因此只需要2个比较(最大值):

if m(p1,p2) = w : p1 wins
if m(p1,p2) = l : p2 wins - also can be written as m(p2,p1) = w
else            : tie     - it must be that m(p1,p2) = m(p2,p1) = 0

此外,通过简单地替换w - > (+1)和l - > (-1),获得适合[sort]排序函数的结果。

实施上述内容应该是一种实用的 - 并且希望是非繁琐的 - 练习。

答案 1 :(得分:1)

我不确定你是否需要进行16次比较。

让我们看看我是否直截了当: 假设上面只有两个玩家,而且a和b的数值相等...... 让我们看看......您可以按以下顺序编写控制语句:

  • 西装是相同的,这是一个TIE。
  • A是铁锹,B是钻石,A LOSES。
  • A是一个铁锹,一个胜利
    • 第一个和第二个if语句为假
  • A是钻石,B是铁锹,A WINS,否则A LOSES。
    • 钻石输给非黑桃
  • A是心脏,B是俱乐部或A是心脏,B是钻石,A WINS。
  • A是俱乐部,B是钻石,A WINS。
    • 俱乐部获胜的唯一方式
  • 其他,A LOSES。
    • 心中失去了黑桃
    • 俱乐部输给了心脏和黑桃
    • 钻石被第4个if / else条件覆盖。
是吗? 我忘记了其他人吗?

答案 2 :(得分:1)

为什么不用分数(重量)来标记那些?

这个想法是为每种类型的卡分配分数并计算它们以进行比较。

例如

假设来自[3,4,5,...,J,Q,K,A,2]的牌从小到大。

然后你可以为它分配分数,比如[1,10,100,1000 ...]。

和Spade> Heart>俱乐部>钻石,也为它指定分数,如Spade为4,Heart为3,Club为2,Diamond为1。

所以当你得到两张牌时:

Spade 3和Diamond 4,Spade 3得分1 + 4 = 5,Diamond4得10 + 1 = 11,因此Diamond 4> Spade 3。

Spade 3和Club 3,Spade 3为5,Club 4为1 + 2 = 3,因此Spade 3>俱乐部3。