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自动扫雷实现方法
Jul 25 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
Nov 15 Python
python实现定时自动备份文件到其他主机的实例代码
Feb 23 Python
Python中的二维数组实例(list与numpy.array)
Apr 13 Python
Python使用win32 COM实现Excel的写入与保存功能示例
May 03 Python
Python格式化输出字符串方法小结【%与format】
Oct 29 Python
利用Python将文本中的中英文分离方法
Oct 31 Python
python opencv 简单阈值算法的实现
Aug 04 Python
Python利用for循环打印星号三角形的案例
Apr 12 Python
Python astype(np.float)函数使用方法解析
Jun 08 Python
Python Tkinter实例——模拟掷骰子
Oct 24 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
Dec 04 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
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
PHP中常用的转义函数
2014/02/28 PHP
php中stdClass的用法分析
2015/02/27 PHP
PHP实现获取并生成数据库字典的方法
2016/05/04 PHP
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
简述Matlab中size()函数的用法
2016/03/20 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
浅谈String.valueOf()方法的使用
2016/06/06 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
python通过apply使用元祖和列表调用函数实例
2015/05/26 Python
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
详解用python生成随机数的几种方法
2019/08/04 Python
Python字典底层实现原理详解
2019/12/18 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
法律进社区实施方案
2014/03/21 职场文书
特教教师先进事迹
2014/05/21 职场文书
学校花圃的标语
2014/06/18 职场文书
领导干部民主生活会自我剖析材料范文
2014/09/20 职场文书
党的群众路线教育实践活动专题组织生活会发言材料
2014/10/17 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
新郎新娘答谢词
2015/01/04 职场文书
教师理论学习心得体会
2016/01/21 职场文书
工程移交协议书
2016/03/24 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript