Merikanto

一簫一劍平生意,負盡狂名十五年

用Python预测小猫钓鱼的纸牌游戏

规则: 将一副扑克牌平均分成两份,每人拿一份。小K先拿出手上的第一张扑克牌放在桌子上,然后小Q也拿出手上的第一张扑克牌,放在小K刚打出的牌上面,就这样两人交替出牌。出牌时,如果某人打出的牌与桌上的牌的牌面相同,即可将两张相同的牌及其中间所加的牌全部取走,并依次放到自己手中牌的末尾,当任意一人手中的牌全部出完时,游戏结束,对手获胜。


定义

我们用stack记录桌上的牌,用两个queue记录小K和小Q手中的牌(小K为t1,小Q为t2)。实现如下,详细见注释。


实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
def game(t1, t2):

# stack, 桌上的牌
s = []
# 记录桌上的牌,一共13种花色
book = [0] * (13+1)

# 两种情况:赢牌,没赢牌
# 小K:t1, 小Q:t2. t1先出牌
while t1 and t2:
# 加判断:防止游戏无法结束
if len(t1) <= 52 and len(t2) <= 52:
a = t1[0]
if book[a] == 0:
s.append(a)
book[a] = 1
del t1[0]
else:
t1.append(a)
while s[-1] != a:
book[s[-1]] = 0
t1.append(s[-1])
del s[-1]
del t1[0]

b = t2[0]
if book[b] == 0:
s.append(b)
book[b] = 1
del t2[0]
else:
t2.append(b)
while s[-1] != b:
book[s[-1]] = 0
t2.append(s[-1])
del s[-1]
del t2[0]

# 一副牌最多52张,超过52,跳出循环
else: break

if t2 == []:
print 't1, 小K赢'
print '当前牌为: {}'.format(str(t1).strip('[]'))

elif t1 == []:
print 't2, 小Q赢'
print '当前牌为: {}'.format(str(t2).strip('[]'))

else:
print '平局'

print '桌上牌为: {}'.format(str(s).strip('[]'))


if __name__ == "__main__":
game([2,4,1,2,5,6], [3,1,3,5,6,4])