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


    扑克是流行全世界的一种纸牌。一副扑克牌有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)                             #打印出来看看手气
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    执行结果:

    ['Red Joker', '♠10', '♠2', '♠J', '♣2', '♣5', '♣6', '♣A', '♣K', '♥6', '♥8', '♥A', '♥K', '♦10', '♦2', '♦4', '♦Q']
    
    • 1
    代码说明
    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张
    
    • 1
    • 2

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

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

    简洁的C及C++
    由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造
    Python编程基础及应用
    由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造

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

    Python编程基础及应用

    Python编程基础及应用实验教程
    在这里插入图片描述

  • 相关阅读:
    [附源码]计算机毕业设计JAVA儿童资源教育网站
    非常详细的git-flow分支管理流程配置及使用
    Day39——Dp专题
    K8S云计算系列-(4)
    从 Solana 课程顺利毕业获得高潜岗位,他的 Web3 开发探险之旅
    阿里云ESS弹性伸缩核心概念与基本使用
    目标检测YOLO实战应用案例100讲-海杂波背景下的弱目标检测(下)
    基于Three.js实现三维空间中的箭头移动动画
    自动化测试工具的定义及作用
    c#简易学生管理系统
  • 原文地址:https://blog.csdn.net/SeaBiscuitUncle/article/details/126552834