用Python写一段发扑克牌的程序,我们需要怎么设计?
简单考虑一下,我们得有以下几个步骤需要做:
1.一副新的扑克牌
2.洗牌
3.发牌
那么我们怎么得到一副新的扑克牌呢,我们知道牌是有序的,从A到K,而且洗牌这个动作告诉我们,它的序列还必须是可变的,这样我们自然而然想到了Python中的列表(List)。列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现.
列表的数据项不需要具有相同的类型.
创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可.
与字符串的索引一样,列表索引从0开始。列表可以进行截取,组合等.
使用下标索引来访问列表中的值,同样你也可以使用方括号的形式截取字符.
故我们可以用列表
1.定义一副未洗的扑克牌(除去大小王):[0,1,……51]
当然扑克牌中还有四个花色:红桃、黑桃、方片、梅花
我们可以进行如下编号:
红桃 A-K 0, 1, 2, 3 …… 12
黑桃 A-K 13, 14,15,16 …… 25
方片 A-K 26, 27, 28 ,29 …… 38
梅花 A-K 39, 40, 41,42 …… 51
它们和13有什么关系呢?
红桃、黑桃、方片、梅花//13(整除13)分别得 0,1, 2,3
红桃 A-K ,黑桃 A-K,方片 A-K,梅花 A-K %13(取余13)得 0,1, 2, 3…… 12(4遍)
这样我们一会取牌就方便了.
# 定义一副未洗的牌[0, 1....51]
porks = [i for i in range(52)]
# 定义花色
suits = ['红桃', '黑桃', '方片', '梅花']
# 定义编号
ranks = ['A', '2', '3', '4', '5', '6', '7', '8',
'9', '10', 'J', 'Q', 'K']
2.洗牌
洗牌怎么洗?这时候我们就需要用到列表中元素的下标了,想一想,一副新的扑克牌,如果要洗牌,我们需要把第一张牌交换位置的话,是可以和除它意外的任何一张牌交换的,当然,第二种第三张也一样,这时候,我们就需要用到列表的索引,还有强大的循环了.这里交换位置的牌是不确定的,我们需要用到Python中的内置函数randit(),稍微翻译可知这个函数给我们生成一个[a,b]区间的随机整数(包含a和b).
randit()函数如下(这是文档中的解释):
def randint(self, a, b):
"""Return random integer in range [a, b], including both end points.
"""
3.发牌
# 发牌 循环遍历头4张牌,整除得到结果到suits取花色,取余到ranks中得到编号
for i in range(4):
suit = suits[porks[i] // 13]
rank = ranks[porks[i] % 13]
print(suit, rank)
整体的代码如下:
import random
# 定义一副未洗的牌[0, 1....51]
porks = [i for i in range(52)]
# 定义花色
suits = ['红桃', '黑桃', '方片', '梅花']
# 定义编号
ranks = ['A', '2', '3', '4', '5', '6', '7', '8',
'9', '10', 'J', 'Q', 'K']
# 洗牌:
# 遍历循环porks
for i in range(52):
# 随机得到0-51整数随机数
randomIndex = random.randint(0, 51)
# 交换
porks[i], porks[randomIndex] = porks[randomIndex], porks[i]
# 发牌 循环遍历头4张牌,整除得到结果,到suits取花色.取余得到结果,到ranks中得到编号
for i in range(4):
suit = suits[porks[i] // 13]
rank = ranks[porks[i] % 13]
print(suit, rank)