南京中建乡旅建设投资有限公司网站,模板网站制作时间,网站锚点,编辑网页用什么软件是Udacity课程的第一个项目。先从宏观把握一下思路#xff0c;目的是做一个比较德州扑克大小的问题首先#xff0c;先抽象出一个处理的函数#xff0c;它根据返回值的大小给出结果。之后我们在定义如何比较两个或者多个手牌的大小#xff0c;为方便比较大小#xff0c;我们…是Udacity课程的第一个项目。先从宏观把握一下思路目的是做一个比较德州扑克大小的问题首先先抽象出一个处理的函数它根据返回值的大小给出结果。之后我们在定义如何比较两个或者多个手牌的大小为方便比较大小我们先对5张牌进行预处理将其按照降序排序如下def card_ranks(hand):ranks [--23456789TJQKA.INDEX(r) for r, s in hand]ranks.sort(reverseTrue)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)) 5def flush(hand):suit [s, for r, s in hand]return len(set(suit)) 1def kind(n, ranks):for s in ranks:if ranks.count(s) n : return sreturn 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(reverseTrue)return [5, 4, 3, 2, 1] if (ranks [14, 5, 4, 3, 2] else ranks之后就是进一步的简化了思路挺好的def poker(hands):return allmax(hands, keyhand_ranks)def allmax(iterable, keyNone):result, maxval [], Noneket key or lambda(x): xfor x in iterable:xval key(x)if not result or xval maxval:result, maxval [x], xvalelif:result.append(x)return result大于就取代等于就加入小于不作处理import randommydeck [rs for r in 23456789TJKQA for s inSHDC]def deal(numhands, n5, deck [rs for r in 23456789TJKQA for s inSHDC]):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) 4flush len(set([s for r, s in hand])) 1return(9 if (5,) count else8 if straight and flush else7 if (4, 1) counts else6 if (3, 2) counts else5 if flush else4 if straight else3 if (3, 1, 1) counts else2 if (5, 1, 1) counts else1 if (2, 1, 1, 1) counts else0), ranksdef 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) 4flush len(set([s for r, s in hand])) 1return max(count_ranks[counts], 4*straight 5 * flush), rankscount_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 sensedefine the piece of problem reuse the piece you have test! explore最后是是的程序在各个方面达到均衡correctness elegance efficienct featrues总结以上就是本文关于Python实现比较扑克牌大小程序代码示例的全部内容希望对大家有所帮助。感兴趣的朋友可以继续参阅本站Python3简单实例计算同花的概率代码Python语言描述最大连续子序列和Python数据可视化正态分布简单分析及实现代码如有不足之处欢迎留言指出。感谢朋友们对本站的支持