题目描述:
模拟实现火车牌,双方各有自己的牌库,双方轮流顺序出牌,把出的牌交替、顺序摆放,当出牌时出到一样的,就收回两张相同牌之间的所有牌放到自己的牌库,有一方牌库清空则对方胜利。返回胜利方、回合数、胜利方的剩余牌情况
思路:
3个队列(只要会模拟,桌子上的牌堆,玩家手里的牌堆就行了)。
玩家手里的牌堆用双端队列deque模拟,因为是队列,先进先出,从左边出队。
牌桌上的牌堆,用普通的list即可。
代码演示:
下面代码中,我们模拟了火车牌游戏的过程。玩家1和玩家2分别有自己的牌库,每回合轮流出牌,直到有一方牌库清空。最后输出胜利方、回合数以及胜利方剩余的牌情况。可以根据需要修改初始牌库来进行不同的测试。
from collections import deque
card_q1=deque([1,2,3,4,5])#玩家1手里的牌堆
card_q2=deque([8,7,6,4,9])#玩家2手里的牌堆
table=[] #模拟牌桌
turn=0 #模拟轮次,判断是玩家1还是玩家2的出牌回合。
while card_q1 and card_q2:#迟早会打空手牌
# print('桌上牌堆',table)
if turn%2==0:
#偶数回合是玩家1的回合
curcard=card_q1.popleft()
if not table:
table.append(curcard)
else:
table.append(curcard)
#要从倒数第二个开始,因为已经把cur_card加到table中了
for j in range(len(table)-2,-1,-1):
if table[j]==curcard:
card_q1.extend(table[j:])
table=table[:j]
break
else:
#奇数回合是玩家2的回合
curcard=card_q2.popleft()
if not table:
table.append(curcard)
else:
table.append(curcard)
for j in range(len(table)-2,-1,-1):
if table[j]==curcard:
card_q2.extend(table[j:])
table=table[:j]
break
turn+=1
if not card_q1:
winner='玩家2'
else:
winner='玩家1'
print('玩家1牌库:',list(card_q1))
print('玩家2牌库:',list(card_q2))
print('获胜者:',winner)
print('桌上牌堆',table)
测试用例:
#用例如下: