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编程模板汇总
Feb 12 Python
Python引用模块和查找模块路径
Mar 17 Python
python3使用pyqt5制作一个超简单浏览器的实例
Oct 19 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
对python判断是否回文数的实例详解
Feb 08 Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 Python
requests在python中发送请求的实例讲解
Feb 17 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 Python
Python 中数组和数字相乘时的注意事项说明
May 10 Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 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
星际争霸 Starcraft 秘技补丁
2020/03/14 星际争霸
php中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
PHP以指定字段为索引返回数据库所取的数据数组
2013/06/30 PHP
PHP匿名函数和use子句用法实例
2016/03/16 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
php字符集转换
2017/01/23 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
css3实现背景模糊的三种方式
2021/03/09 HTML / CSS
User Scripts: Video Download by User Scripts
2007/05/14 Javascript
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
2016/10/14 Javascript
webpack入门必知必会
2017/01/16 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
2017/04/10 Javascript
Vue的路由动态重定向和导航守卫实例
2018/03/17 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
python创建文件备份的脚本
2018/09/11 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
用python计算文件的MD5值
2020/12/23 Python
html5指南-3.如何实现html元素拖拽功能
2013/01/07 HTML / CSS
专门经营化妆刷的美国彩妆品牌:Sigma Beauty
2017/09/11 全球购物
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
教师求职信范文分享
2013/12/27 职场文书
市场营销管理制度
2014/01/29 职场文书
《小猪家的桃花树》教学反思
2014/04/11 职场文书
党员志愿者活动方案
2014/08/28 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书
Python中的tkinter库简单案例详解
2022/01/22 Python
asyncio异步编程之Task对象详解
2022/03/13 Python
基于docker安装zabbix的详细教程
2022/06/05 Servers