关注公众号:【小张Python】,为你准备了 50+ 本Python 精品电子书籍 与 50G + 优质视频学习资料,后台回复关键字:1024 即可获取;如果对博文内容有什么疑问,后台添加作者【个人微信】,可与作者直接进行交流

之前在 《流畅的 Python 》中看到一个例子比较有趣,所以整理一下通过本文分享给大家, 该案例是通过 Python 类属性创建一幅除去 大王、小王之后的 52 张扑克牌,并实现随机抽牌、排序、洗牌等功能;

创建一个纸牌类

一副扑克除去大王小王之外,剩下的 52 张纸牌以花色为基准(梅花、方块、黑桃、红心)可分为 4 组,每组有 13 张牌组成;因此可创建两个列表一个来存储花色,一个存储 13 个字符;通过两个列表之间的随机组合来生成 52 张纸牌,

代码如下:

import collectionsCard = collections.namedtuple("Card",['rank','suit'])class FrenchDeck:ranks = [str(n) for n in range(2,11) ] + list("JQKA")suits = 'spades diamonds clubs hearts'.split()def __init__(self):self._cards = [Card(rank,suit) for suit in self.suits for rank in self.ranks]def __len__(self):return len(self._cards)def __getitem__(self, position):return self._cards[position]

代码中通过 collections.namedtuple 模块创建一个类来表示一幅纸牌,[’rank','suit'] 分别表示纸牌中的字符(2-10,J-A)和花色;

FranchDeck 类来建 52 张纸牌,其中有两个特殊方法,len() 返回纸牌数量,__getitem__() 获取 position(索引) 下的指定纸牌

# 用 Card 创建一张纸牌
beer_card = Card('7','diamonds')
print(beer_card) # 打印输出deck = FrenchDeck()
print('len is -----')
print(len(deck))# 返回首张 纸牌
print(deck[0])# 返回最后一张纸牌
print(deck[-1])# OutputCard(rank='7', suit='diamonds')
len is -----
52
Card(rank='2', suit='spades')
Card(rank='A', suit='hearts')

随机抽取一张牌

这里借助 random 模块实现 随机 抽牌的功能

from random import choice
# 利用 random.choice 随机抽取一张纸牌
print("random choice -----------")
print(choice(deck))print(choice(deck))
print(choice(deck))# Outputrandom choice -----------
Card(rank='8', suit='clubs')
Card(rank='5', suit='hearts')
Card(rank='5', suit='spades')

列表迭代、切片

因为 __getitem__ 方法 把 [] 操作交给 self._cards 列表 ,除了上面提到的 index 定位之外,FranckDeck() 类还可实现切片、迭代操作;

# 切片操作print('\nslice is --')
print(deck[:3])
print(deck[8:10])print('\n迭代操作')
for card in deck[:3]:print(card)print('\n 反迭代操作')
for card in reversed(deck[:3]):print(card)# Outputslice is --
[Card(rank='2', suit='spades'), Card(rank='3', suit='spades'), Card(rank='4', suit='spades')]
[Card(rank='10', suit='spades'), Card(rank='J', suit='spades')]迭代操作
Card(rank='2', suit='spades')
Card(rank='3', suit='spades')
Card(rank='4', suit='spades')反迭代操作
Card(rank='4', suit='spades')
Card(rank='3', suit='spades')
Card(rank='2', suit='spades')

排序操作

常规来说,依据点数来判断扑克牌的大小的话,2最小,A最大。实现点数排序是比较简单的,在创建点数列表时是以上面提到顺序进行创建,排序时只需按照 点数所在 index 作为基准 进行排序即可,

除了 点数之外还有一个 花色也需要考虑,对于花色的话,需要建立一个映射基准(也可以称之为权重),不同花色赋予不同值;Python 的字典类型可以很方面地满足我们的需要

# 创建一个字典映射
suit_values = dict(spades = 3,hearts = 2,diamonds = 1,clubs = 0
)
def spades_high(card):rank_value = FrenchDeck.ranks.index(card.rank) # 索引查询return rank_value*len(suit_values) + suit_values[card.suit] # index* 4 + suit.valueprint('\nSorted ------------------')
# 利用 key = lambda 机制对列表进行排序
for card in sorted(deck,key = spades_high,reverse= True):print(card)# OutputSorted ------------------
Card(rank='A', suit='spades')
Card(rank='A', suit='hearts')
Card(rank='A', suit='diamonds')
Card(rank='A', suit='clubs')
Card(rank='K', suit='spades')
Card(rank='K', suit='hearts')
Card(rank='K', suit='diamonds')
Card(rank='K', suit='clubs')
Card(rank='Q', suit='spades')
Card(rank='Q', suit='hearts')
Card(rank='Q', suit='diamonds')

代码解读:

  • 1,代码中利用字典加入了一个映射机制,黑桃为3,红心为2,方块次之,随后梅花;
  • 2,创建 spades_high 函数来计算 每张牌的权重总值;
  • 3,利用 sorted() 函数 key= spades_high 来作为排序基准,来实现扑克牌排序

洗牌操作

洗牌简单来说就是对一副扑克牌重新进行无规则地排序;正常情况random.shuffle 可以很方面地实现这个功能,但前提需要保证对象 满足可变协议,这里 FranchDeck() 是不满足的,直接使用的话会报错:

from random import shuffle
print('-------------------\n'*3)
deck  =FrenchDeck()
shuffle(deck)# Outputx[i], x[j] = x[j], x[i]
TypeError: 'FrenchDeck' object does not support item assignment

对于上面问题,只需要要把 此类由 不变 变成 可变的 即可,创建一个函数赋值为 __setitem__ 属性

from random import shuffle
print('-------------------\n'*3)def set_deck(deck,position,card):deck._cards[position] = carddeck1 = FrenchDeck()
print('打乱前\n')
print(deck1[:5])
FrenchDeck.__setitem__ = set_deck
shuffle(deck1)# Output打乱前
Card(rank='2', suit='spades')
Card(rank='3', suit='spades')
Card(rank='4', suit='spades')
Card(rank='5', suit='spades')
Card(rank='6', suit='spades')打乱后:
Card(rank='6', suit='diamonds')
Card(rank='4', suit='hearts')
Card(rank='Q', suit='diamonds')
Card(rank='K', suit='clubs')
Card(rank='8', suit='spades')

这里抽取到打乱前后纸牌的前 5 个元素,已经实现 洗牌 的功能了!

根据以上的代码部分,可以进一步开发, 提前设计好 54 张扑克牌的可视化图片,

创建一个 key:value 映射关系,对扑克牌字符与可视化图片之间创建一个映射关系,如下图所示,把此关系集存储到指定数据库或文件中,后面使用后可直接调用

按照上面的进阶玩法就可以创建一个基于Python开发扑克牌小程序!

好了,以上就是本篇文章的全部内容了,最后感谢大家的阅读!

Python 制作一副扑克牌,有趣的案例!相关推荐

  1. 如何使用Python 制作一副扑克牌!来看是怎么实现的!

    之前在 <流畅的 Python >中看到一个例子比较有趣,所以整理一下通过本文分享给大家, 该案例是通过 Python 类属性创建一幅除去 大王.小王 之后的 52 张扑克牌,并实现 随机 ...

  2. python做一副54扑克牌发牌_基于Python制作一副扑克牌过程详解

    整理一下通过本文分享给大家, 该案例是通过 Python 类属性创建一幅除去大王.小王之后的 52 张扑克牌,并实现随机抽牌.排序.洗牌等功能: 创建一个纸牌类 一副扑克除去大王小王之外,剩下的 52 ...

  3. python随机输出52张牌_基于Python制作一副扑克牌过程详解

    整理一下通过本文分享给大家, 该案例是通过 Python 类属性创建一幅除去大王.小王之后的 52 张扑克牌,并实现随机抽牌.排序.洗牌等功能: 创建一个纸牌类 一副扑克除去大王小王之外,剩下的 52 ...

  4. 如何用Python制作一副扑克牌?有趣的案例!

    之前在 <流畅的 Python >中看到一个例子比较有趣,所以整理一下通过本文分享给大家, 该案例是通过 Python 类属性创建一幅除去 大王.小王之后的 52 张扑克牌,并实现随机抽牌 ...

  5. python定义一个列表存放52张扑克牌_Python 制作一副扑克牌,有趣的案例!

    之前在 <流畅的 Python >中看到一个例子比较有趣,所以整理一下通过本文分享给大家, 该案例是通过 Python 类属性创建一幅除去 大王.小王之后的 52 张扑克牌,并实现随机抽牌 ...

  6. 扑克牌图片一张一张_Python 制作一副扑克牌,有趣的案例

    之前在 <流畅的 Python >中看到一个例子比较有趣,所以整理一下通过本文分享给大家, 该案例是通过 Python 类属性创建一幅除去 大王.小王之后的 52 张扑克牌,并实现随机抽牌 ...

  7. python生成一副扑克牌_【扑克游戏基本】用python打造出一副扑克牌并实操大转变...

    今天要用python写一副简单的扑克牌, 我们想用物件导向的概念, 分别定义类别「单张扑克牌」与「一副扑克牌」, 而「一副扑克牌」就由52张「单张扑克牌」所组成 类别- 单张扑克牌 一张扑克牌由「点数 ...

  8. python制作ai小说网_【案例分享】使用Python创建AI比你想象的轻松

    您可能对AI领域,主要开发阶段,成就,结果和产品使用感兴趣.有数百个免费源和教程描述使用Python的AI.但是,没有必要浪费你的时间看他们.这里是一个详细的指南,你需要知道在使用Python构建人工 ...

  9. python做一副54扑克牌发牌_Python 制作一副扑克牌,有趣的案例!

    如果觉得文章写得不错想要博客文章中的数据,请关注公众号:[Z先生点记],已经为你准备了 50本+ Python 电子书籍 与 200G + 优质视频资料,后台回复关键字:1024 即可获取 之前在 & ...

最新文章

  1. Gradle之依赖管理
  2. python爬虫urllib文档_11.【文本】Urllib(下) - 零基础学习Python爬虫系列
  3. 计算机视觉--GIST特征及其MATLAB代码实现
  4. python中typeerror怎么解决_Python 3中套接字编程中遇到TypeError: 'str' does not support the buffer interface的解决办法...
  5. 温州大学《深度学习》课程课件(六、机器学习实践)
  6. M2第五天DailyScrum——PM(李忠)
  7. 导入xlsx,文件到sqlite3数据库
  8. 前端学习(2474):页面布局
  9. 帆软与中国环境科学院合作,共同推进数字化管理建设
  10. Subversion快速入门教程(SVN)
  11. 常见的浏览器兼容性问题大汇总
  12. 如果无法使用软件打开.mmap文件,解决办法
  13. 导入JasperReports坐标时无法下载com.lowagie:itext:jar:2.1.7.js6
  14. Wonderware配置-Intouch读取数据 6
  15. 中科大自主招生2018笔试数学之三
  16. Java单元测试之JUnit 5快速上手
  17. Spring Data Jpa 复合主键
  18. 在Vue中使用高德地图
  19. 针对德尔塔等变异株!国产皮卡新冠疫苗开启临床实验;重庆成都互为人才外流第一目标城市 | 美通社头条...
  20. 解决Mac系统下需要每次配置环境的问题

热门文章

  1. 2008年中国各省市人口排名(包含港澳台)
  2. 2020春节寒假总结
  3. 记录一次反selenium爬虫经历
  4. oracle 数据库表结构对比
  5. 基于机智云物联网平台的空气质量多功能检测系统设计
  6. Windows 2008 设置用户密码永不过期
  7. Axure9学习笔记2:界面布局
  8. AI 边缘计算平台 - 爱芯元智 AX620A 爱芯派开箱
  9. 蓝桥杯比赛准备第一天
  10. 杭电1042c语言循环,HDU杭电1052 Tian Ji - The Horse Racing答题报告