扑克是流行全世界的一种纸牌。一副扑克牌有54张牌,其中52张是正牌,另2张是副牌(大王和小王)。52张正牌又均分为13张1组,共有黑桃、红桃、梅花、方块四组。每组花色的牌包括从2-10以及A、J、Q、K标示的13张牌。在比较流行的斗地主游戏中,三个玩家中除庄家外,另外两个玩家一人要拿17张牌。如果洗牌过程是完美的,那么对于一个玩家而言,拿到哪十七张牌是完全随机的。

本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频


下述程序首先生成了54张扑克牌,然后借助于随机数从中抽取17张牌。

#poker.py
import random                                                   #导入随机数模块
suits = ["♠","♥","♦","♣"]                    #四种花色
ranks = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"]  #13种牌面
#将花色与牌面组合并加上大小王,生成54张牌的列表
cards = [x+y for x in suits for y in ranks] + ["Red Joker", "Black Joker"]
#print(cards)
cardsHold = []                               #持牌列表
for i in range(17):                          #循环17次,共取17张牌
    idx = random.randint(0,len(cards)-1)     #生成一个0 到 剩余牌数-1的随机数
    c = cards.pop(idx)                       #将指定下标的牌取出
    cardsHold.append(c)                      #取出的牌添加至持牌列表

cardsHold.sort()                             #持牌列表排序
print(cardsHold)                             #打印出来看看手气

执行结果:

['Red Joker', '♠10', '♠2', '♠J', '♣2', '♣5', '♣6', '♣A', '♣K', '♥6', '♥8', '♥A', '♥K', '♦10', '♦2', '♦4', '♦Q']
代码说明
random模块用于生成随机数。
suits列表存储了4种不同的花色,分别对应黑桃,红桃,方块和梅花。
ranks列表则存储了每种花色的13色牌面,从2-10,以及A, J, Q, K。
cards列表借助于本章介绍的列表快速生成语法来生成,其内容形如:[‘Spades_A’, ‘Spades_2’, ‘Spades_3’… ];读者可以在cards列表生成后添加执行print(cards),查看其内容。请注意,大小王Red Joker和Black Joker也通过列表加法添加到了列表中。
cardsHold列表用于存储已经拿到的牌。
借助于range(17)数值列表,程序进行了17次循环。每一次都借助于random.randint()函数,生成一个从0到剩余牌数-1的随机数idx, 将后以idx为下标,从cards中弹出(pop)一张牌并存入cardsHold。容易看出,上述循环每执行一次,cards中的牌就会少一张,cardsHold中的牌就会多一张。
为了便于迅速查看”手气“的好坏,这里使用了cardsHold.sort()对牌进行了排序。

请读者注意,因为“随机数”的存在,读者实际运行的结果几乎肯定与上述结果不同。请读者多次运行本程序,观察持牌序列的变化及”随机性“。

出于教学目的,有时我们会化简为繁。比如本例,从cards中随机抽出17张牌事实上不需要循环,使用下述代码可以直接办到:

random.shuffle(cards)   #随机打乱
print(cards[:17])   #切片得前17张

但如果这样写,学生学不到算法的过程知识。

为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!

简洁的C及C++

Python编程基础及应用

如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。

Python编程基础及应用

Python编程基础及应用实验教程

更多推荐

Python趣味案例 - 抓扑克牌的手气