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学习笔记_数据排序方法
May 22 Python
Python使用ntplib库同步校准当地时间的方法
Jul 02 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 Python
详解Python中 sys.argv[]的用法简明解释
Dec 20 Python
Python错误处理操作示例
Jul 18 Python
Python多线程同步---文件读写控制方法
Feb 12 Python
使用Python求解带约束的最优化问题详解
Feb 11 Python
python 实现在shell窗口中编写print不向屏幕输出
Feb 19 Python
基于python爬取有道翻译过程图解
Mar 31 Python
Django 解决开发自定义抛出异常的问题
May 21 Python
python 利用PyAutoGUI快速构建自动化操作脚本
May 31 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 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/10/03 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
2015/04/08 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
jquery实现可旋转可拖拽的文字效果代码
2016/01/27 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
微信小程序onShareTimeline()实现分享朋友圈
2021/01/07 Javascript
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
python选择排序算法实例总结
2015/07/01 Python
python 网络编程常用代码段
2016/08/28 Python
python音频处理用到的操作的示例代码
2017/10/27 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
基于python实现坦克大战游戏
2020/10/27 Python
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
八一慰问活动方案
2014/02/07 职场文书
平安校园建设方案
2014/05/02 职场文书
司法局群众路线教育实践活动整改措施
2014/09/17 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
神龙架导游词
2015/02/11 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
聊一聊python常用的编程模块
2021/05/14 Python
Opencv实现二维直方图的计算及绘制
2021/07/21 Python
实现一个简单得数据响应系统
2021/11/11 Javascript