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实现2014火车票查询代码分享
Jan 10 Python
Python实现字符串逆序输出功能示例
Jun 24 Python
Django实现支付宝付款和微信支付的示例代码
Jul 25 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
Jan 05 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
pytorch 加载(.pth)格式的模型实例
Aug 20 Python
Python循环实现n的全排列功能
Sep 16 Python
Python之Django自动实现html代码(下拉框,数据选择)
Mar 13 Python
Django-migrate报错问题解决方案
Apr 21 Python
不到20行实现Python代码即可制作精美证件照
Apr 24 Python
Python实现aes加密解密多种方法解析
May 15 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脚本加密专家php解密算法
2020/09/13 PHP
PHP操作数组的一些函数整理介绍
2011/07/17 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
php判断两个浮点数是否相等的方法
2015/03/14 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
2019/05/31 PHP
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
2016/11/13 Javascript
js实现倒计时关键代码
2017/05/05 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
基于iScroll实现内容滚动效果
2018/03/21 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
为python设置socket代理的方法
2015/01/14 Python
python executemany的使用及注意事项
2017/03/13 Python
python 正确保留多位小数的实例
2018/07/16 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
Python通过正则库爬取淘宝商品信息代码实例
2020/03/02 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
详解Html5页面实现下载文件(apk、txt等)的三种方式
2018/10/22 HTML / CSS
Beach Bunny Swimwear官网:设计师泳装和性感比基尼
2019/03/13 全球购物
Europcar意大利:汽车租赁
2019/07/07 全球购物
PHP面试题大全
2015/10/16 面试题
外企财务年会演讲稿
2014/01/03 职场文书
二年级数学教学反思
2014/01/21 职场文书
求职毕业生自荐书
2014/02/08 职场文书
文明礼仪演讲稿
2014/05/12 职场文书
关于运动会的口号
2014/06/07 职场文书
企业领导对照检查材料
2014/08/20 职场文书
工作年限证明范本
2015/06/15 职场文书