# 第32期-洗牌

Python是一门需要不断实践练习的编程语言,本文档将AI大学堂学员交流群的Python每周练习进行汇总,希望各位小伙伴能够多进行实践练习,逐渐爱上这门神奇的编程语言,掌握它并在生活中能够使用它。

# 1 问题描述

扑克(英文:Poker),代指两种含义:一是指纸牌(playing cards);二是泛指以用纸牌这种游戏道具来玩的游戏,称为扑克游戏,如德州扑克。一副扑克牌共有54张牌,其中52张是正牌,另2张是副牌(大王和小王)。
52张正牌又均分为13张一组,并以黑桃、红桃、梅花、方块四种花色表示各组,每组花色的牌包括从1-10(1通常表示为A)以及J、Q、K标示的13张牌,玩法千变万化,多种玩法,如比较典型的玩法斗地主。
要求先从一副牌中挑出六张排,再给ABCD四个人随机分剩下的排,再随机指任一个人为地主,为其加上地主牌,最后再输出各家的牌

一种说法是由唐代天文学家张遂发明,最初称做“叶子戏”,因为纸牌只有树叶那么大。宋代文学家欧阳修在《归田录》中也有对“叶子戏”的记载,它是由文字游戏发展而来。到了元朝,马可波罗来中国游历,很长一段时间在中国的宫廷里担任官职,和上层知识分子过往甚密,学会了这一游戏。后来把它传播到了欧洲。一开始,它只是贵族们的奢侈品,但是因为它造价低廉、玩法多样,又容易学,很快就在民间流行开来。欧洲人根据自己的文化和传统,对纸牌游戏进行了改进,最终出现了“扑克牌”。
还有一种说法,相传早在秦末楚汉相争时期,大将军韩信为了缓解士兵的思乡之愁,发明了一种纸牌游戏,因为牌面只有树叶大小,所以被称为“叶子戏”。(“叶子牌”,有两个手指大小。长8公分,阔2.5公分的“叶子牌”,用丝绸及纸裱成,图案是用木刻版印成的)。
扑克牌的54张模式解释起来也非常奇妙,有兴趣的小伙伴可以去研究研究

# 2 解题思路

  • 四种花色每种各十三张牌,可以使用排列组合的方式变成一副牌
  • 根据随机选择的人作为地主并修改他的值,可以使用eval函数
  • 随机分配需要使用random模块

# 3 解题方法

import random

suits = ['♥', '♠', '♣', '♦']
cardstr = ['J', 'Q', 'K', 'A']
cardnum = [str(i) for i in range(2, 11)]
cardking = ['大王', '小王']

card = []
for suit in suits:
    for num in cardnum:
        card.append(suit + num)
    for str in cardstr:
        card.append(suit + str)
card = card + cardking
random.shuffle(card)
地主牌=random.sample(card,6)
x=random.choice(['A','B','C','D'])
for i in 地主牌:
    card.remove(i)
A = []
B = []
C = []
D = []
for i in range(len(card)):
    if i % 4 == 0:
        A.append(card[i])
    if i % 4 == 1:
        B.append(card[i])
    if i % 4 == 2:
        C.append(card[i])
    if i % 4 == 3:
        D.append(card[i])
eval(x).extend(地主牌)
print(f'地主牌是{地主牌},地主是{x}')
print(f'A:{A}')
print(f'B:{B}')
print(f'C:{C}')
print(f'D:{D}')
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

第1行: 引入random模块
第3-6行: 将所有扑克牌中出现的数字及符号等作为列表列出
第8-14行: 根据刚刚的数字与符号的列表,将一副牌中的元素用列表列出
第15行: 使用random.shuffle方法将列表中的元素随机打乱,相当于洗牌
第16-19行: 随机选出六张牌作为地主牌,并从所有牌中去除这六张牌,并随机选择地主
第20-23行: 为ABCD四位角色创建列表,用于存放各位的牌
第24-32行: 由于之前的扑克牌已经随机打乱,模仿发牌的方式,将这些牌每四张分给同一个人
第33行: 为选择的地主加上地主牌
第34-38行: 打印地主、地主牌以及ABCD各位的牌

代码运行结果为:
image.png

这里用到了random模块和eval函数,简单讲解下这两个:
random模块
1. random.random() 生成一个0-1的随机浮点数
2. random.randint(a,b) 生成一个a-b的随机整数(包括a和b)
3. random.randrange(a,b) 生成一个a-b的随机整数(不包括a和b)
4. random.shuffle(x) 将一个序列进行重新排序
5. random.choice(x) 返回一个序列中的一个随机元素
6. random.uniform(a,b) 用于生成指定范围内的随机浮点数
7. random.sample(sequence, k) 返回一个序列中的k个随机元素


eval()函数
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
语法:
eval(expression[, globals[, locals]])
参数说明:
expression -- 表达式。
globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

例如:x = 7
eval( '3 * x' )
21

# 4 视频解析

高清视频讲解,请查看AI大学堂Python基础实战100例 (opens new window)
关注『讯飞AI大学堂』公众号,发送 python100 即可领取Python基础实战100例源代码
AI大学堂公众号.png

更新于: 12/28/2021, 7:43:14 AM