【python】模拟斗牛纸牌游戏「牛牛」

您所在的位置:网站首页 牛牛发牌怎么搞鬼 【python】模拟斗牛纸牌游戏「牛牛」

【python】模拟斗牛纸牌游戏「牛牛」

2023-05-31 06:11| 来源: 网络整理| 查看: 265

相信大家都玩过或者看别人玩过一个纸牌游戏斗牛,或者也叫牛牛的吧,我们进行就来使用python来实现一下简单的模仿. 在这里插入图片描述

请你写一个模拟纸牌斗牛(或者也叫做牛牛)的程序,用以模拟纸牌的生成,洗牌,发牌,点数计算,牌的显示等过程。 附:先完成基本功能,(同花顺 ,五小牛 , 金牛 , 炸弹 , 葫芦 ,同花 ,顺子,倍数)等情况可以先不考虑.

如果牌型大小一样的话,假设算庄家胜,比如同样牛9的牌,算庄家胜。在1庄家3个闲家,每家都押注10块的情况下,试计算连玩10局庄家的输赢值

至于相关的规则我这里简要的讲述一下: 就是每人五张牌,自己进行分堆,分成3,2两堆.三张牌的点数要是10的倍数,然后剩下两张牌的点数之和取个位就是你的牛数,当然如果没有任何三张牌可以凑成10的倍数,那么就是没牛.(JKQ都是按照10来计算,A按照1来计算) 举个例子: ♥2 ♠5 ♦8 ♣J ♥A 我们可以分成 ♥2 ♦8 ♣J一堆,♠5 ♥A一堆 那么这幅牌就是牛六 (是不是非常好理解~) 如果还不能理解的,建议自行去百度(没有看不起你的意思hh)

思路讲解:

首先需要先初始化纸牌,将花色和数字对应好存入pokers变量中.再洗牌,我这里使用的random库中的shuffle方法来洗的(注意!这个方法没有返回值,所以直接调用就可以了)为了确保是真的随机,我加了一个随机的洗牌次数,这样应该会更接近真随机一点.(其实一开始我想使用的是py里面切片来进行三等分交换位置来达到洗牌的目的但不知为何,就是洗很多遍也还是不是很乱,搞不懂,后来也就直接使用了shuffle方法来做了.)然后是发牌,按照顺序依次发给四名玩家,然后再用切片来减少pokers中的前四张牌,一共发五次也就是每人五张牌.接下来是展示玩家的手牌,这个很简单就是简单print就可以了然后需要对玩家手里的牌进行计算来求出一个牛的数量.但是因为存在JKQA这些字母存在所以直接进行计算会显得很麻烦,所以我首先调用fmt函数来对手牌进行"格式化",也就是把JKQ变为10,然后将A变为1,存入手牌中(因为之前已经输出过手牌了,所以不用担心会把手牌搞错)接下来这才是计算牛数,因为需要对五张牌进行排列组合,为了简单一点,我是用itertools库中的combinations方法来求排列组合,然后对不同组合进行判断,如果他们的和是10的倍数,也就是符合3那堆的条件,这时候再把全部5张牌相加对10取余,这个余数就是牛的数量(为什么可以这么做?因为有三个数可以被10整除了,所以加上他们也无伤大雅,最后求的还是剩下两个数的对于10的取余).最后因为五张牌里面可能存在多组符合条件的分堆法,所以需要进行求最大值,这个就很简单了,我就不细说了.最后,需要进行判断谁是最终赢家.如果庄家的点数是四人中的最大,那么就是庄家赢,要不然就是剩下三者中的最大值那方获得胜利.因为题目还有一个条件需要计算玩10把庄家赢的概率,所以再来一个函数来求胜率.把游戏循环进行10次,每次庄家赢就使cnt加一,最后就可以知道庄家的胜率了.这里有个地方需要注意,因为使连续玩玩很多次,所以需要再每次开始的时候把玩家和庄家的手牌都置为0,要不然会影响新游戏的运行.好了!!

代码:

import random import itertools def initCards(): poker = [] pokers = [] for i in {"梅花", "方块", "红桃", "黑桃"}: for j in {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "K", "Q"}: poker.append(i) poker.append(j) pokers.append(poker) poker = [] return pokers def shuffleCards(pokers): for i in range(100): c = random.randint(0, 100) for j in range(c): random.shuffle(pokers) return pokers player1 = [] player2 = [] player3 = [] playerZhuang = [] def deal(pokers): for i in range(5): playerZhuang.append(pokers[0]) player1.append(pokers[1]) player2.append(pokers[2]) player3.append(pokers[3]) pokers = pokers[4:] def showCards(): print(player1) print(player2) print(player3) print(playerZhuang) def fmtCards(player): points = [] for card in player: if card[-1] == "A": points.append(1) elif card[-1] == "J" or card[-1] == "K" or card[-1] == "Q": points.append(10) else: points.append(int(card[-1])) return points def calCards(points): maxN = 0 for i in itertools.combinations(points, 3): niu = 0 if sum(i) % 10 == 0: if sum(points) % 10 == 0: niu = 10 else: niu = sum(points) % 10 if niu > maxN: maxN = niu return maxN def judge(zhuang, p1, p2, p3): if zhuang == max(zhuang, p1, p2, p3): return "庄家获胜" elif p1 == max(p1, p2, p3): return "player1获胜" elif p2 == max(p2, p3): return "player2获胜" else: return "player3获胜" def clearCards(): player1 = [] player2 = [] player3 = [] playerZhuang = [] def gameStart(time): cnt = 0 for i in range(time): clearCards() cards = initCards() cards = shuffleCards(cards) deal(cards) if judge(calCards(fmtCards(playerZhuang)), calCards(fmtCards(player1)), calCards(fmtCards(player2)), calCards(fmtCards(player3))) == "庄家获胜": cnt = cnt + 1 gailv = cnt / time * 100 print(f"庄家{time}场获胜概率为{gailv}%") cards = initCards() cards = shuffleCards(cards) deal(cards) showCards() p1 = calCards(fmtCards(player1)) p2 = calCards(fmtCards(player2)) p3 = calCards(fmtCards(player3)) zhuang = calCards(fmtCards(playerZhuang)) print(f"玩家1 牛{p1}") print(f"玩家2 牛{p2}") print(f"玩家3 牛{p3}") print(f"庄家 牛{zhuang}") print(judge(zhuang, p1, p2, p3)) gameStart(10)

最后代码运行展示: 在这里插入图片描述

新手上路,有错请指正;



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3