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的爬虫框架Scrapy来抓取豆瓣电影TOP250
Jan 20 Python
Python正则表达式使用范例分享
Dec 04 Python
你真的了解Python的random模块吗?
Dec 12 Python
Pandas之drop_duplicates:去除重复项方法
Apr 18 Python
面向初学者的Python编辑器Mu
Oct 08 Python
python爬取酷狗音乐排行榜
Feb 20 Python
django的ORM模型的实现原理
Mar 04 Python
浅谈Python基础—判断和循环
Mar 22 Python
pytorch 预训练层的使用方法
Aug 20 Python
基于python3的socket聊天编程
Feb 17 Python
Python垃圾回收机制三种实现方法
Apr 27 Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 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
什么是调频(FM)、调幅(AM)、短波(SW)、长波(LW)
2021/03/01 无线电
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
2017/03/13 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
关于vue中 $emit的用法详解
2018/04/12 Javascript
基于React Native 0.52实现轮播图效果
2020/08/25 Javascript
vue计算属性get和set用法示例
2019/02/08 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
2019/04/22 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
js实现日历
2020/11/07 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
微信小程序实现弹幕墙(祝福墙)
2020/11/18 Javascript
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
python实现密度聚类(模板代码+sklearn代码)
2020/04/27 Python
对python中list的五种查找方法说明
2020/07/13 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
文员自我评价怎么写
2013/09/19 职场文书
团代会闭幕词
2015/01/28 职场文书
求职自我推荐信
2015/03/24 职场文书
大学推普周活动总结
2015/05/07 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
体育部部长竞选稿
2015/11/21 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
Javascript webpack动态import
2022/04/19 Javascript
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技