有一次在学习random 模块时,发现random.shuffle这个打乱挺有意思,于是就想生活中打牌不正好是这个打乱吗?于是想起了,能否用这个来模拟斗地主起牌的情形呢?
遇到的难点:
1,怎么样才能产生一副牌呢?
2,如何做到真是场景中的一人起一张牌的情形
3,如何产生3张底牌
4,地主如何产生
5,底牌加到地主手上
6,最关键是起到牌后,排序的问题,不是简单的按数字从小到大排序,而是按34678910JQKA小王大王这样的顺序排,另外还得有点数的问题。
这个排序,我是用字典把每一张牌花色按方块,梅花,红桃,黑桃;点数按34678910JQKA小王大王这2个排序规则做的排序
import random
for i in range(3):
list1 = ['大王', '小王']
for dot in '♠♥♣◆':
crd = list(dot + str(i) for i in ['A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K'])
list1.extend(crd)
random.shuffle(list1)
player1 = []
player2 = []
player3 = []
for i in range(51):
if i % 3 == 0:
player1.append(list1[i])
elif i % 3 == 1:
player2.append(list1[i])
else:
player3.append(list1[i])
# 随机产生地主
landlord = random.choice(['player1', 'player2', 'player3'])
print('本轮地主:' + landlord)
# 剩余的3张底牌
lost = player1 + player2 + player3
dipai = list(i for i in list1 if i not in lost)
print('底牌:', dipai)
if landlord == 'player1':
player1.extend(dipai)
elif landlord == 'player2':
player2.extend(dipai)
else:
player3.extend(dipai)
order = {'♠6': 15, '◆5': 8, '♥J': 34, '♠Q': 39, '♠A': 47, '♣4': 5, '♠3': 3, '◆Q': 36, '♠2': 51,
'◆A': 44, '♥7': 18, '♥8': 22, '♥6': 14, '♥K': 42, '小王': 52, '◆4': 4, '♠9': 27, '♣2': 49,
'♣8': 21, '♠10': 31, '◆K': 40, '♠8': 23, '♠5': 11, '◆2': 48, '♣9': 25, '◆J': 32, '♣K': 41,
'♣10': 29, '♣6': 13, '♠K': 43, '♥9': 26, '◆10': 28, '◆3': 0, '♣Q': 37, '♣3': 1, '大王': 53,
'♣J': 33, '◆8': 20, '♥10': 30, '♥3': 2, '♥4': 6, '◆9': 24, '♣5': 9, '◆6': 12, '♥Q': 38,
'♥5': 10, '♠J': 35, '♣A': 45, '◆7': 16, '♥2': 50, '♠4': 7, '♣7': 17, '♥A': 46, '♠7': 19}
print('玩家的牌分别是:')
print('p1:', sorted(player1, key=lambda x: order[x], reverse=False))
print('p2:', sorted(player2, key=lambda x: order[x], reverse=False))
print('p3:', sorted(player3, key=lambda x: order[x], reverse=False))
print('=' * 50)
下面是模拟3牌起牌的结果:
本轮地主:player1
底牌: [‘♥6’, ‘♣4’, ‘小王’]
玩家的牌分别是:
p1: [‘♣4’, ‘♠4’, ‘♥5’, ‘♠5’, ‘♣6’, ‘♥6’, ‘♥8’, ‘♠9’, ‘◆10’, ‘♠10’, ‘◆J’, ‘♣Q’, ‘♠Q’, ‘♥K’, ‘◆A’, ‘♥A’, ‘♠A’, ‘◆2’, ‘♣2’, ‘小王’]
p2: [‘♣3’, ‘◆4’, ‘◆5’, ‘◆6’, ‘♠6’, ‘◆7’, ‘♣7’, ‘♥7’, ‘♣8’, ‘♠8’, ‘◆9’, ‘♥9’, ‘♥Q’, ‘◆K’, ‘♣K’, ‘♠2’, ‘大王’]
p3: [‘◆3’, ‘♥3’, ‘♠3’, ‘♥4’, ‘♣5’, ‘♠7’, ‘◆8’, ‘♣9’, ‘♣10’, ‘♥10’, ‘♣J’, ‘♥J’, ‘♠J’, ‘◆Q’, ‘♠K’, ‘♣A’, ‘♥2’]
本轮地主:player1
底牌: [‘♠K’, ‘♣Q’, ‘♥5’]
玩家的牌分别是:
p1: [‘♣4’, ‘♠4’, ‘♣5’, ‘♥5’, ‘◆7’, ‘♠8’, ‘◆9’, ‘♠9’, ‘◆10’, ‘♣10’, ‘♥10’, ‘♠10’, ‘◆J’, ‘♣Q’, ‘♥K’, ‘♠K’, ‘◆A’, ‘♠A’, ‘♣2’, ‘♥2’]
p2: [‘◆3’, ‘♠3’, ‘◆5’, ‘◆6’, ‘♣7’, ‘♥7’, ‘♠7’, ‘◆8’, ‘♣8’, ‘♣9’, ‘♣J’, ‘♥J’, ‘♠J’, ‘◆Q’, ‘◆K’, ‘♥A’, ‘◆2’]
p3: [‘♣3’, ‘♥3’, ‘◆4’, ‘♥4’, ‘♠5’, ‘♣6’, ‘♥6’, ‘♠6’, ‘♥8’, ‘♥9’, ‘♥Q’, ‘♠Q’, ‘♣K’, ‘♣A’, ‘♠2’, ‘小王’, ‘大王’]
本轮地主:player2
底牌: [‘♥9’, ‘♠5’, ‘♣A’]
玩家的牌分别是:
p1: [‘♣4’, ‘♥5’, ‘♣6’, ‘♥6’, ‘♠7’, ‘◆8’, ‘◆9’, ‘♣9’, ‘♣10’, ‘♠10’, ‘♠J’, ‘◆Q’, ‘♥Q’, ‘♣K’, ‘♥K’, ‘♥A’, ‘◆2’]
p2: [‘◆3’, ‘♠3’, ‘♠4’, ‘♠5’, ‘◆6’, ‘♠6’, ‘◆7’, ‘♥7’, ‘♥8’, ‘♥9’, ‘♠9’, ‘◆10’, ‘♣J’, ‘♥J’, ‘♣Q’, ‘♠Q’, ‘◆K’, ‘♣A’, ‘♠A’, ‘♥2’]
p3: [‘♣3’, ‘♥3’, ‘◆4’, ‘♥4’, ‘◆5’, ‘♣5’, ‘♣7’, ‘♣8’, ‘♠8’, ‘♥10’, ‘◆J’, ‘♠K’, ‘◆A’, ‘♣2’, ‘♠2’, ‘小王’, ‘大王’]
还有许多细节没做到位,有兴趣的朋友可以完善一下
要是想做出牌,那就复杂多了,炸弹判断,顺子判断,3带1啥的,忒复杂了,有时间慢慢完善吧