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通过pil将图片转换成黑白效果的方法
Mar 16 Python
Python连接mysql数据库的正确姿势
Feb 03 Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
Apr 13 Python
Python制作简易注册登录系统
Dec 15 Python
完美解决Python2操作中文名文件乱码的问题
Jan 04 Python
python处理Excel xlrd的简单使用
Sep 12 Python
Python Xml文件添加字节属性的方法
Mar 31 Python
Python3数据库操作包pymysql的操作方法
Jul 16 Python
python 使用re.search()筛选后 选取部分结果的方法
Nov 28 Python
python经典趣味24点游戏程序设计
Jul 26 Python
使用tqdm显示Python代码执行进度功能
Dec 08 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 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
php适配器模式介绍
2012/08/14 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
再谈IE中Flash控件的自动激活 ObjectWrap
2007/03/09 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
Python中的Matplotlib模块入门教程
2015/04/15 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
django框架F&Q 聚合与分组操作示例
2019/12/12 Python
Python读取YAML文件过程详解
2019/12/30 Python
简单了解python列表和元组的区别
2020/05/14 Python
详解python datetime模块
2020/08/17 Python
Currentbody澳大利亚:美容仪专家
2019/11/11 全球购物
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
请说出你所知道的线程同步的方法
2013/04/19 面试题
兼职学生的自我评价
2013/11/24 职场文书
马云的职业生涯规划之路
2014/01/01 职场文书
写给女朋友的道歉信
2014/01/08 职场文书
客服部班长工作责任制
2014/02/25 职场文书
婚礼主持词开场白
2014/03/13 职场文书
培训班主持词
2014/03/28 职场文书
python爬虫selenium模块详解
2021/03/30 Python