python均分纸牌_Python实现比较扑克牌大小程序代码示例

是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实现比较扑克牌大小程序代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

Python3简单实例计算同花的概率代码

Python语言描述最大连续子序列和

Python数据可视化正态分布简单分析及实现代码

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

底层基础软件崛起,达梦数据库的选择与收获

作者 | 宋慧 出品 | CSDN 作为基础软件三驾马车之一,数据库一直是 IT 系统的核心。中国 IT 应用发展迅速,创新的应用场景为操作系统、数据库这样的底层基础软件提供了新的发展机会。基础数据成为“十四五”的重点关注方向,中国数据库正在快…

Apache Flink在 bilibili 的多元化探索与实践

简介: bilibili 万亿级传输分发架构的落地,以及 AI 领域如何基于 Flink 打造一套完善的预处理实时 Pipeline。 本文由 bilibili 大数据实时平台负责人郑志升分享,本次分享核心讲解万亿级传输分发架构的落地,以及 AI 领域如何基于 …

【开通指南】 实时计算 Flink 全托管版本

简介: 【开通指南】实时计算 Flink 全托管版本 1、试用的实时计算 Flink 版产品是后付费还是预付费?是否有额外费用产生? 预付费,有额外的SLB费用,一天2元封顶。(开通 Flink 全托管产品,需使用…

tomcat启动成功 未加载项目_喜讯!济宁医学院附属医院SPD项目成功启动

济宁医学院附属医院(简称济医附院)始建于1951年,医院拥有79个临床科室,9个重症监护病区,开放床位3028张,是山东省首家通过JCI认证的大型综合医院,作为山东省区域医疗中心,早在2016年,医院就通过…

java like a_如何在Java中实现类似“ LIKE”运算符的SQL?

我需要Java中的比较器,该比较器的语义与sql"赞"运算符相同。例如:myComparator.like("digital","%ital%");myComparator.like("digital","%gi?a%");myComparator.like("digital","di…

Mendix发布全球低代码报告,中国软件与低代码发展远超全球

调查显示: 1、86%的受访者表示,企业对于开发人员的需求已经达到了白热化的程度。另外,78%的受访企业表示会依靠非技术人员来缓解IT部门的压力。 2、低代码开发用于标准化数据安全、数据建模和可视化、现有工作流程自动化等应用。 3、受访的IT…

Vineyard 加入 CNCF Sandbox,将继续瞄准云原生大数据分析领域

简介: Vineyard 是一个专为云原生环境下大数据分析场景中端到端工作流提供内存数据共享的分布式引擎,我们很高兴宣布 Vineyard 在 2021 年 4 月 27 日被云原生基金会(CNCF)TOC 接受为沙箱(Sandbox)项目。 作…

java 电子编号生成器_业务编号生成器

在我们实际做项目的过程中,时常需要生成一些跟业务相关的一些唯一的业务编号,这些编号又需要一定的规则,一般是每生成一个新的编号是在前一个编号的集成上尾号递增1个单位,下面是我业余时间写的一个编号生成器,直接贴代…

殷浩详解DDD:领域层设计规范

简介: 在一个DDD架构设计中,领域层的设计合理性会直接影响整个架构的代码结构以及应用层、基础设施层的设计。但是领域层设计又是有挑战的任务,特别是在一个业务逻辑相对复杂应用中,每一个业务规则是应该放在Entity、ValueObject …

arcgis怎么用python重新排序_python - 根据排序数据添加新的顺序ID号(ArcGIS) - 堆栈内存溢出...

我需要一行代码,它将根据我为数据规定的顺序发出新的顺序ID。 基本上,在按照我的喜好对数据进行排序后,原始的Object_Id对我来说不再是有意义的顺序。 在我的表中,我创建了一个新字段(短整数)。 在现场计算器的预逻辑脚本框中&…

融资 6 亿元后,端点科技将致力于类SaaS化软件服务

据艾瑞咨询最新发布《2021 中国企业级 SaaS 行业研究报告》显示,在疫情催化下,2020 年 SaaS 市场增速飞快,市场规模达538亿元,同比增长48.7%。 随着数字化转型步伐加快,企业对 SaaS 接受度提升,应用场景从…

稳定性之故障应急处理流程

简介: 尽管可以通过稳定性体系建设,来避免出现生产系统故障。但是仍然无法彻底避免一点风险都不会产生,当稳定性风险产生后,怎么快速协调组织,缩短故障时长,科学的流程呢? 作者 | 金喜 来源 | 阿…

java 参数传值的练习题及答案_java方法参数传递面试题三则

传值还是传引用是Java中很基础的一个问题,也是笔试的时候经常被考察的一个问题,总结一下。题目1: 写出以下程序的输出内容。public class Test {public static void changeValue(int value){value 0;}public static void main(String[] args…

如何限制浏览器使用_论如何优雅地使用chrome 浏览器

chrome 浏览器目前已经算得上是在浏览器市场独占鳌头了,就连它的最强对手IE也不得不低下头颅改用Chromium内核,这让chrome 浏览器更是没有对手了,但是你真的了解这个你时时刻刻都在用到的浏览器吗?今天装糊涂先森就来教你如何优雅…

520,一份给程序员的“硬核”脱单秘籍

简介: 各位,520快乐! 今天是个粉红色的日子,我们来聊聊和技术无关的“技术活”,比如:“如何表白?”当技术人碰上心动的姑娘,他的浪漫开关就打开了。 各位,520快乐&#…

95后架构师晒出工资单:狠补了这个,真香...

前段时间看见某95后阿里P7晒出工资单,我是真酸了……只能狠补一下技术了。Java 一面基本上都是基础题,同样是 CURD 的活,谁更熟练要谁,比如下面这个Java面试手册,八股文越熟练越容易通过 Java 面试。这份资料内容涵盖极…

阿里云 EDAS 3.0 助力唱鸭提升微服务幸福感

简介: EDAS 3.0 提供的微服务治理,很好的支持了唱鸭 APP 实现微服务应用的发布、监控、管理等日常业务场景。作为运维侧的重要平台和开框架的提供者,EDAS 3.0 帮助用户可以更专注业务。微服务架构升级后,业务具备水平扩展能力&…

java 生产者消费者 demo_生产者与消费者--demo1---bai

import java.util.ArrayList;import java.util.List;import java.util.Random;//自定义类,描述仓库public class StoreHouse{private List products new ArrayList(); //仓库的所有商品的列表public void add(String product){this.products.add(product);}Random …

python字典是什么数据结构_Python常用数据结构——字典

Time will tell.前言迄今为止,我们已经为大家介绍了Python中的三种容器型数据类型,但是这些数据类型还不足以帮助我们解决所有的问题。例如,我们要保存一个人的信息,包括姓名、年龄、体重、单位地址、家庭住址、本人手机号、紧急联…

Serverless:这真的是未来吗?(二)

简介: 在关于无服务器的第二篇文章中,我们将讨论一些更广泛的问题。再次强调,我们并不是要做硬性规定。我们想提出一些观点,以促进所有利益相关者之间的讨论。许多说所有应用程序都将是无服务器的应用程序的人并未大规模运行其应用…