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的内存泄漏及gc模块的使用分析
Jul 16 Python
详解Python的Django框架中inclusion_tag的使用
Jul 21 Python
python交互式图形编程实例(二)
Nov 17 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
Apr 19 Python
python高级特性和高阶函数及使用详解
Oct 17 Python
对python 多个分隔符split 的实例详解
Dec 20 Python
对Python发送带header的http请求方法详解
Jan 02 Python
Python设计模式之工厂方法模式实例详解
Jan 18 Python
使用Django搭建网站实现商品分页功能
May 22 Python
python3.9.1环境安装的方法(图文)
Feb 02 Python
pandas 操作 Excel操作总结
Mar 31 Python
tensorboard 可视化之localhost:6006不显示的解决方案
May 22 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
PHP4之COOKIE支持详解
2006/10/09 PHP
PHP持久连接mysql_pconnect()函数使用介绍
2012/02/05 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
Apache站点配置SSL强制跳转443
2021/03/09 Servers
ppk谈JavaScript style属性
2008/10/10 Javascript
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
2009/08/09 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
2016/09/09 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
JavaScript缓动动画函数的封装方法
2020/11/25 Javascript
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
python uuid模块使用实例
2015/04/08 Python
用Python抢过年的火车票附源码
2015/12/07 Python
利用Python爬取可用的代理IP
2016/08/18 Python
python difflib模块示例讲解
2017/09/13 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
python常用排序算法的实现代码
2019/11/08 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
毕业生文员求职信
2013/11/03 职场文书
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
校长创先争优承诺书
2014/08/30 职场文书
2014光棍节大学生联谊活动方案
2014/10/10 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
军训通讯稿范文
2015/07/18 职场文书
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android