Python实现比较扑克牌大小程序代码示例


Posted in Python onDecember 06, 2017

是Udacity课程的第一个项目。

先从宏观把握一下思路,目的是做一个比较德州扑克大小的问题
首先,先抽象出一个处理的函数,它根据返回值的大小给出结果。

之后我们在定义如何比较两个或者多个手牌的大小,为方便比较大小,我们先对5张牌进行预处理,将其按照降序排序,如下:

def card_ranks(hand):
  ranks = ['--23456789TJQKA'.INDEX(r) for r, s in hand]
  ranks.sort(reverse=True)
  return ranks

然后我们可以枚举出一共有9种情况,并用数字代表每一种情况的等级,利用Python的比较功能,将等级放在第一位,如果等级相同,那么再比较后面的。

def hand_rank(hand):
  "Return a value indicating the ranking of a hand."
  ranks = card_ranks(hand) 
  if straight(ranks) and flush(hand):
    return (8, max(ranks))
  elif kind(4, ranks):
    return (7, kind(4, ranks), kind(1, ranks))
  elif kind(3, ranks) and kind(2, ranks):
    return (6, kind(3, ranks), kind(2, ranks))
  elif flush(hand):
    return (5, ranks)
  elif straight(ranks):
    return (4, max(ranks))
  elif kind(3, ranks):
    return (3, kind(3, ranks), ranks)
  elif two_pair(ranks):
    return (2, two_pair(ranks), ranks)
  elif kind(2, ranks):
    return (1, kind(2, ranks), ranks)
  else:
    return (0, ranks)

可以看到,如果等级相同,接下来比较的是每套牌中牌的大小了。同时我们需要三个函数,代表同花,顺子,以及kind(n, ranks),代表ranks有n张牌的点数。这里的三个函数实现非常巧妙,利用了set去重的特性。

def straight(ranks):
  return (max(ranks) - min(ranks)) == 4 and len(set(ranks)) == 5

def flush(hand):
  suit = [s, for r, s in hand]
  return len(set(suit)) == 1
def kind(n, ranks):
  for s in ranks:
    if ranks.count(s) == n : return s
  return None

我们发现,有一种情况是含有两个对,于是需要一个函数来判断是否是这种情况,这个函数中调用了kind()函数,由于kind()函数满足短路特性,只会返回先得到的满足情况的点数,于是将其翻转后,在调用一边kind,若得到的结果相同,那么就只有一个对(或者没有),否则就有两个。

def two_pairs(ranks):
  pair = kind(2, ranks)
  lowpair = kind(2, list(reverse(ranks)))
  if pair != lowpair:
    return (pair, lowpair)
  else:
    return None

好了,整体的骨架算是搭完了,接下来处理会产生bug的情况,首先是A2345,当排序时由于A被算作14,所以针对这个问题需要单独列一个if

处理A是最低:
def card_ranks(hand):
  ranks = ['--23456789TJQKA'.INDEX(r) for r, s in hand]
  ranks.sort(reverse=True)
  return [5, 4, 3, 2, 1] if (ranks = [14, 5, 4, 3, 2] else ranks

之后就是进一步的简化了,思路挺好的

def poker(hands):
  return allmax(hands, key=hand_ranks)
def allmax(iterable, key=None):
  result, maxval = [], None
  ket = key or lambda(x): x
  for x in iterable:
    xval = key(x)
    if not result or xval > maxval:
      result, maxval = [x], xval
    elif:
      result.append(x)
  return result
"""大于就取代,等于就加入,小于不作处理"""
import random
mydeck = [r+s for r in '23456789TJKQA' for s in'SHDC]
def deal(numhands, n=5, deck = [r+s for r in '23456789TJKQA' for s in'SHDC]):
  random.shuffle(deck)
  return [deck[n*i:n*(i + 1)] for i in range(numhands)]
def hand_ranks(hand):
  groups = group['--23456789TJQKA'.index(r) for r, s in hand]
  counts, ranks = unzip(groups)
  if rnaks == (14, 5, 4, 3, 2, 1):
    ransk = (5, 4, 3, 2, 1)
  straight = len(ranks) == 5 and max(ranks) - min(ranks) == 4
  flush = len(set([s for r, s in hand])) ==1
  return(9 if (5,) == count else
     8 if straight and flush else
     7 if (4, 1) == counts else
     6 if (3, 2) == counts else
     5 if flush else
     4 if straight else
     3 if (3, 1, 1) == counts else
     2 if (5, 1, 1) == counts else
     1 if (2, 1, 1, 1) == counts else
     0), ranks
def group(items):
  groups = [(items.count(x), x) for x in set(items)]
  return sorted(groups, reverse = True)
def unzips(pairs):return zip(*pairs)

def hand_ranks(hand):
   groups = group['--23456789TJQKA'.index(r) for r, s in hand]
  counts, ranks = unzip(groups)
  if rnaks == (14, 5, 4, 3, 2, 1):
    ransk = (5, 4, 3, 2, 1)

  straight = len(ranks) == 5 and max(ranks) - min(ranks) == 4
  flush = len(set([s for r, s in hand])) ==1
  return max(count_ranks[counts], 4*straight + 5 * flush), ranks
count_rankings = {(5,):10, (4, 1):7, (3,2):6, (3,1,1):3, (2,2,1):2,
(2,1,1,1): 1,(1,1,1,1,1):0}

总结下,面对一个问题的思维步骤:

started:understand problems look at specification See if it make sense 
define the piece of problem reuse the piece you have test! >explore 
最后是是的程序在各个方面达到均衡 
correctness elegance efficienct featrues

总结

以上就是本文关于Python实现比较扑克牌大小程序代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python中pygame模块用法实例
Oct 09 Python
Python 冒泡,选择,插入排序使用实例
Feb 05 Python
python遍历数组的方法小结
Apr 30 Python
Python 数据结构之队列的实现
Jan 22 Python
安装python3的时候就是输入python3死活没有反应的解决方法
Jan 24 Python
简单了解django索引的相关知识
Jul 17 Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
Feb 06 Python
python 伯努利分布详解
Feb 25 Python
Django自定义列表 models字段显示方式
Apr 03 Python
python基础之匿名函数详解
Apr 21 Python
python unittest单元测试的步骤分析
Aug 02 Python
Python3简单实例计算同花的概率代码
Dec 06 #Python
Python基于回溯法解决01背包问题实例
Dec 06 #Python
Python基于动态规划算法解决01背包问题实例
Dec 06 #Python
Python机器学习之决策树算法实例详解
Dec 06 #Python
快速入门python学习笔记
Dec 06 #Python
Python中django学习心得
Dec 06 #Python
Python标准库inspect的具体使用方法
Dec 06 #Python
You might like
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
php 无法载入mysql扩展
2010/03/12 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
php实现的http请求封装示例
2016/11/08 PHP
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
用 JavaScript 迁移目录
2006/12/18 Javascript
读jQuery之八 包装事件对象
2011/06/21 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
用Webpack构建Vue项目的实践
2017/11/07 Javascript
基于vue、react实现倒计时效果
2019/08/26 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
vue实现购物车选择功能
2020/01/10 Javascript
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
使用python 3实现发送邮件功能
2018/06/15 Python
python实现flappy bird小游戏
2018/12/24 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
使用IDLE的Python shell窗口实例详解
2019/11/19 Python
python基于selenium爬取斗鱼弹幕
2021/02/20 Python
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
应届生的求职推荐信范文
2013/11/30 职场文书
中学生期末评语
2014/02/03 职场文书
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
感恩的演讲稿
2014/05/06 职场文书
人事行政专员岗位职责
2014/07/23 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
2016入党心得体会范文
2016/01/06 职场文书
家电创业计划书
2019/08/05 职场文书