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 + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
Jul 14 Python
python中的内置函数getattr()介绍及示例
Jul 20 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
Python编程产生非均匀随机数的几种方法代码分享
Dec 13 Python
Python利用openpyxl库遍历Sheet的实例
May 03 Python
详解Python下载图片并保存本地的两种方式
May 15 Python
一文了解Python并发编程的工程实现方法
May 31 Python
python循环定时中断执行某一段程序的实例
Jun 29 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
使用tensorflow显示pb模型的所有网络结点方式
Jan 23 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
Sep 03 Python
Python之Matplotlib绘制热力图和面积图
Apr 13 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和ACCESS写聊天室(六)
2006/10/09 PHP
smarty内置函数section的用法
2015/01/22 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
Vue.js对象转换实例
2017/06/07 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
AnglarJs中的上拉加载实现代码
2018/02/08 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
对tensorflow 的模型保存和调用实例讲解
2018/07/28 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
Tahari ASL官方网站:高级设计师女装
2021/03/15 全球购物
大学生秋游活动方案
2014/02/17 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书
详解前端任务构建利器Gulp.js使用指南
2021/04/30 Javascript