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 相关文章推荐
sqlalchemy对象转dict的示例
Apr 22 Python
解析Python中的变量、引用、拷贝和作用域的问题
Apr 07 Python
python 解压pkl文件的方法
Oct 25 Python
Django学习笔记之为Model添加Action
Apr 30 Python
python循环定时中断执行某一段程序的实例
Jun 29 Python
Python 使用type来定义类的实现
Nov 19 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
Python selenium页面加载慢超时的解决方案
Mar 18 Python
keras中的backend.clip用法
May 22 Python
基于python实现复制文件并重命名
Sep 16 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
Nov 28 Python
python 网络编程要点总结
Jun 18 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/10/09 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
Javascript的匿名函数小结
2009/12/31 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
node中socket.io的事件使用详解
2014/12/15 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
vue项目中做编辑功能传递数据时遇到问题的解决方法
2016/12/19 Javascript
Node.JS更改Windows注册表Regedit的方法小结
2017/08/18 Javascript
ajax请求+vue.js渲染+页面加载的示例
2018/02/11 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
Vue实现自定义下拉菜单功能
2018/07/16 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
详解JavaScript事件循环机制
2018/09/07 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
[03:43]2014DOTA2西雅图国际邀请赛 newbee战队巡礼
2014/07/07 DOTA
利用Python如何将数据写到CSV文件中
2018/06/05 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
Pytorch的mean和std调查实例
2020/01/02 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
Python实现文件压缩和解压的示例代码
2020/08/12 Python
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
2013/01/09 HTML / CSS
世界最大的票务市场:viagogo
2017/02/16 全球购物
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
.NET remoting的两种通道是什么
2016/05/31 面试题
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
房屋买卖协议书
2014/04/10 职场文书
展览会邀请函
2015/02/02 职场文书
《索溪峪的野》教学反思
2016/02/19 职场文书
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
使用CSS设置滚动条样式
2022/01/18 HTML / CSS