我想自己创造一个新的扑克游戏。
我需要比较扑克牌的价值。
在这个游戏中,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次比较。
有没有更好的方法进行比较,或者这已经是最好的方法了?
答案 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的数值相等...... 让我们看看......您可以按以下顺序编写控制语句:
答案 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。