Python用类实现扑克牌发牌的示例代码


Posted in Python onJune 01, 2020

1. 题目

编写程序, 4名牌手打牌,计算机随机将52张牌(不含大小鬼)发给4名牌手,在屏幕上显示每位牌手的牌。

提示:
设计出3个类:Card类、Hand类和Poke类。
Card类代表一张牌,其中FaceNum字段指出是牌面数字1~13,Suit字段指出的是花色,值“梅”为梅花,“方”为方块,“红”为红心,“黑”为黑桃。
Hand类代表一手牌,可以认为是一位牌手手里的牌,其中cards列表变量存储牌手手里的牌。可以增加牌、清空手里的牌、把一张牌给别的牌手。
Poke类代表一副牌,可以把一副牌看作是有52张牌的牌手,所以继承Hand类。

1.1 输出样例

This is a module with classes for playing cards.
牌手 1:红桃6 黑桃6 梅花A 方片6 黑桃2 梅花10 红桃3 方片4 方片10 黑桃J 红桃Q 红桃10 红桃8 
牌手 2:梅花J 梅花9 红桃7 红桃2 方片K 黑桃K 梅花3 方片7 黑桃Q 黑桃10 梅花Q 梅花8 黑桃7 
牌手 3:梅花2 方片A 黑桃3 方片9 黑桃4 红桃K 红桃J 梅花7 红桃4 方片2 梅花4 梅花6 红桃5 
牌手 4:黑桃5 红桃9 方片8 梅花5 方片J 黑桃A 梅花K 方片5 黑桃9 方片3 黑桃8 方片Q 红桃A

2. 题解

2.1 代码

# Card类:一张牌
class Card:
  """A playing card.card"""
  RANKS = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
  SUITS = ['梅花', '方片', '红桃', '黑桃']

  def __init__(self, rank, suit, face_up=True):
    self.rank = rank        # 牌面数字1~13
    self.suit = suit        # 花色
    self.is_face_up = face_up    # 是否显示牌的正面,True为正面,False为反面

  def __str__(self):         # 重写print()方法,打印一张牌的信息
    if self.is_face_up:
      rep = self.suit + self.rank
    else:
      rep = 'XX'
    return rep

  def pic_order(self):       # 牌的顺序号
    if self.rank == 'A':
      FaceNum = 1
    elif self.rank == 'J':
      FaceNum = 11
    elif self.rank == 'Q':
      FaceNum = 12
    elif self.rank == 'K':
      FaceNum = 13
    else:
      FaceNum = int(self.rank)
    if self.suit == '梅花':
      Suit = 1
    elif self.suit == '方片':
      Suit = 2
    elif self.suit == '红桃':
      Suit = 3
    else:
      Suit = 4
    return (Suit - 1) * 13 + FaceNum

  def flip(self):         # 翻牌方法
    self.is_face_up = not self.is_face_up


# Hand类:一手牌
class Hand:
  """A hand of playing cards Hand"""

  def __init__(self):
    self.cards = []       # cards列表变量存储牌手手里的牌

  def __str__(self):        # 重写print()方法,打印出牌手的所有牌
    if self.cards:
      rep = ''
      for card in self.cards:
        rep += str(card) + '\t'
    else:
      rep = '无牌'
    return rep

  def clear(self):         # 清空手里的牌
    self.cards = []

  def add(self, card):       # 增加手里的牌
    self.cards.append(card)

  def give(self, card, other_hand):  # 把一张牌给其他选手
    self.cards.remove(card)
    other_hand.add(card)
    # other_hand.append(card)  # 上面两行可以用这一行代替


# Poke类:一副牌
# 继承Hand类
class Poke(Hand):
  """Poke类代表一副牌,可以看做是有52张牌的牌手,所以继承Hand类。由于其中cards列表变量要存储52张牌
  而且要发牌,洗牌,所以增加方法如下方法:"""

  def populate(self):         # 生成一副牌
    for suit in Card.SUITS:
      for rank in Card.RANKS:
        self.add(Card(rank, suit))

  def shuffle(self):         # 洗牌
    import random
    random.shuffle(self.cards)   # 打乱牌的顺序

  def deal(self, hands, per_hand=13): # 将牌发给玩家,每人默认13张牌
    for rounds in range(per_hand):
      for hand in hands:
        if self.cards:
          top_card = self.cards[0]
          self.cards.remove(top_card)
          hand.add(top_card)
          # self.give(top_card,hand) #上两句可以用此句替换
        else:
          print('不能继续发牌了,牌已经发完了!')


if __name__ == "__main__":
  print('This is a module with classes for playing cards.')
  players = [Hand(), Hand(), Hand(), Hand()]
  poke1 = Poke()
  poke1.populate()       # 生成一副牌
  poke1.shuffle()        # 洗牌
  poke1.deal(players, 13)    # 发给每人13张牌
  n = 1
  for hand in players:
    print('牌手', n, end=':')
    print(hand)
    n = n + 1

到此这篇关于Python用类实现扑克牌发牌的示例代码的文章就介绍到这了,更多相关Python 扑克牌发牌内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Python 相关文章推荐
python脚本设置超时机制系统时间的方法
Feb 21 Python
python变量不能以数字打头详解
Jul 06 Python
Python实现数据库并行读取和写入实例
Jun 09 Python
python内置数据类型之列表操作
Nov 12 Python
Python  Django 母版和继承解析
Aug 09 Python
Python递归实现打印多重列表代码
Feb 27 Python
Python Selenium截图功能实现代码
Apr 26 Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 Python
python中如何打包用户自定义模块
Sep 23 Python
Python进行特征提取的示例代码
Oct 15 Python
Python模拟登录和登录跳转的参考示例
Oct 30 Python
Python 文字识别
May 11 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
Jun 01 #Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 #Python
k-means 聚类算法与Python实现代码
Jun 01 #Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 #Python
python如何写出表白程序
Jun 01 #Python
python中os包的用法
Jun 01 #Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 #Python
You might like
PHP关联链接常用代码
2012/11/05 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
jquery横向纵向鼠标滚轮全屏切换
2017/02/27 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
详解package.json版本号规则
2019/08/01 Javascript
vue给对象动态添加属性和值的实例
2019/09/09 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
简单了解常用的JavaScript 库
2020/07/16 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
python 字典修改键(key)的几种方法
2018/08/10 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
Python实时监控网站浏览记录实现过程详解
2020/07/14 Python
Numpy数组的广播机制的实现
2020/11/03 Python
Solaris操作系统的线程机制
2015/07/28 面试题
马智宇婚礼主持词
2014/03/22 职场文书
大学专科自荐信
2014/06/17 职场文书
陈胜吴广起义口号
2014/06/20 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
预备党员介绍人意见
2015/06/01 职场文书
运动会报道稿大全
2015/07/23 职场文书
JavaScript实现栈结构详细过程
2021/12/06 Javascript
利用Redis实现点赞功能的示例代码
2022/06/28 Redis