有没有更简单的方法来比较一套房胜过另一套房的牌?

2024-03-29 11:49:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我想自己发明一种新的扑克游戏。在

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

在这个游戏中,黑桃(Relational passable),黑桃(Heart)和钻石(Diamond,Relationship passable,ex:Spade>;Club,Heart>;Diaomd),有一个特殊规则,钻石胜过黑桃(但仍然比心和棍棒弱)。在

我想用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对S,D对D,但是我还是需要做13次比较。在

有没有更好的方法来做这个比较,或者这已经是最好的方法了?在


Tags: 方法gt游戏exspade价值扑克扑克牌
3条回答

为什么不用分数(权重)来标记这些呢?在

其思想是为每种类型的卡片分配分数并计算它们以进行比较。在

例如

假设卡片从[3,4,5,…,J,Q,K,A,2]从小到大。在

然后你可以给它赋值,比如[101001000…]。在

还有黑桃,红桃,梅花,钻石,也给它赋值,比如黑桃是4,红桃是3,梅花是2,钻石是1。在

所以当你有两张牌时:

黑桃3和钻石4,黑桃3的得分为1+4=5,钻石4的得分为10+1=11,因此钻石4>;黑桃3。在

或者

黑桃3和梅花3,黑桃3得到5,梅花4得到1+2=3,因此黑桃3>;梅花3。在

这是一个使用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=赢,l=输,0=平局。在

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

^{pr2}$

通过将S、H、C、D转换为索引0、1、2、3,可以用列表/数组简单地实现这一点。它只需要一次查找(如果每个维度都有一个,则需要两个查找)来确定两个套件之间的结果。在

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

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]排序函数的结果。在

实现上述目标应该是一个实际的,而且希望不是乏味的练习。在

我不确定你是否需要做16个比较。在

让我们看看我是否明白了: 假设只有两个玩家,如你所说,a和b的数值相等。。。 让我们看看……你可以按以下顺序写控制语句:

  • 西装是一样的,是领带。在
  • A是黑桃,B是钻石,A输了。在
  • A是黑桃,A赢
    • 第一个和第二个if语句是假的
  • A是钻石,B是黑桃,A赢,否则A输。
    • 钻石输给非黑桃
  • A是一颗心,B是一个俱乐部,或者A是一颗心,B是一颗钻石,A赢了。在
  • A是俱乐部,B是钻石,A赢。
    • 俱乐部获胜的唯一途径
  • 否则,A输了。
    • 红桃输给黑桃
    • 球杆输给红桃和黑桃
    • 钻石在第4个if/else条件下被覆盖。在

是这样吗? 我忘了其他人吗?在

相关问题 更多 >