相信大家都玩过或者看别人玩过一个纸牌游戏斗牛,或者也叫牛牛的吧,我们进行就来使用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)


思路讲解:

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

代码:

import random
import itertoolsdef 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 pokersdef shuffleCards(pokers):for i in range(100):c = random.randint(0, 100)for j in range(c):random.shuffle(pokers)return pokersplayer1 = []
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 pointsdef calCards(points):maxN = 0for i in itertools.combinations(points, 3):niu = 0if sum(i) % 10 == 0:if sum(points) % 10 == 0:niu = 10else:niu = sum(points) % 10if niu > maxN:maxN = niureturn maxNdef 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 = 0for 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 + 1gailv = cnt / time * 100print(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)

最后代码运行展示:


新手上路,有错请指正;

【python】模拟斗牛纸牌游戏「牛牛」相关推荐

  1. 拥有计算机并以拨号方式上网的用户必须使用,2017年计算机一级考试模拟试题及答案「选择题」...

    2017年计算机一级考试模拟试题及答案「选择题」 资格考试的核心目的是,给予考试者一个公平竞争的机会,以获得某个更高层次的学习或工作台的资格.下面是小编整理的关于计算机一级考试模拟试题及答案,欢迎大家 ...

  2. 20年,1人写出70万行代码!沙盒游戏「鼻祖」13年靠玩家捐赠维生

    本文转载自 新智元 一款游戏,让一位玩家皈依佛教. 这位玩家曾寄信开发者,因其开发的游戏理解了「众生皆苦,世事无常」. 究竟是什么游戏还能让人看破红尘? Dwarf Fortress (矮人堡垒)! ...

  3. python十点半纸牌游戏教程

    作品:十点半 / TenPointHalf(?) 前言:这是我的python编程作业,一个python写的纸牌游戏. 本文适合python入门新手,都是python基础知识 文章底部会贴出完整代码,如 ...

  4. 利用 Python / R 对数据集进行「长」「宽」转换

    晚上在微信群看到有人提问: 这其实是数据处理中经常遇到的数据集「长」「宽」格式转换问题.看起来似乎挺难,有很多细节要考虑.实际上这个问题也的确不简单,如果从零开始码要花不少精力,效果还不好保证. 但是 ...

  5. 机器人笔记psv中文_游戏「机器人笔记」、「月英学园」将登陆PSV平台

    "科学ADV系列"第三弹「机器人笔记」将发售PSV版,将于今年冬季发售.声优杉田智和原作游戏「月英学园」的PSV版将于10月10日发售,名为「月英学园-kou-」. 5pb.与Ni ...

  6. Scratch闯关游戏「离子反应」游戏规则

    请查看 Scratch闯关游戏作品:「离子反应」 下载资源. 单人游戏规则: 使用鼠标瞄准和射击,<Q>丢弃物品,<R>填充药剂,<滚轮>切换武器,<E> ...

  7. python创建游戏代码_用Python类创建纸牌游戏

    我试图通过创建一个纸牌游戏来练习Python中的编程类.现在我要做的是让玩家从牌堆中抽一张牌.我有如下代码: class Deck(): def __init__(self): #create the ...

  8. python operation not permitted_python - 安装「splinter」提示「Operation not permitted」

    python - 安装「splinter」提示「Operation not permitted」 怪我咯2017-04-17 16:36:44 0 0 105 我安装 splinter 提示 ...

  9. Python——模拟轮盘抽奖游戏

    题目要求: 模拟轮盘抽奖游戏 轮盘分为三部分: 一等奖, 二等奖和三等奖; 轮盘转的时候是随机的, 如果范围在[0,0.08)之间,代表一等奖, 如果范围在[0.08,0.3)之间,代表2等奖, 如果 ...

  10. Python模拟轮盘抽奖游戏 轮盘分为三部分: 一等奖, 二等奖和三等奖;轮盘转的时候是随机的, 如果范围在[0,0.08)之间,代表一等奖,如果范围在[0.08,0.3)之间,代表2等奖, 如果范围

    .模拟轮盘抽奖游戏 轮盘分为三部分: 一等奖, 二等奖和三等奖;轮盘转的时候是随机的, 如果范围在[0,0.08)之间,代表一等奖,如果范围在[0.08,0.3)之间,代表2等奖, 如果范围在[0, ...

最新文章

  1. 如何通过中序和层序序列建立二叉树
  2. CSS基础篇--css reset重置样式有那么重要吗?
  3. linux 安装sap,Solman系列 安装SAP Solution Manager 7.1 on Suse Linux
  4. weboffice 应用
  5. 前端学习(338):堆栈
  6. Python小白的数学建模课-B5. 新冠疫情 SEIR模型
  7. 小提琴机器人拉法_小提琴的拉琴姿势探讨
  8. 深圳出差 第一天【原创】
  9. 向架构师进军--定义需求
  10. Android 9.0/P 开发问题及解决方案汇总
  11. Android核心分析 之二方法论探讨之概念空间篇
  12. VTK:交互与Widget——观察者/命令模式
  13. 【单片机笔记】PWM信号与PPM信号简单理解
  14. Android 裸眼3D效果View
  15. 【Python】 matplotlib 以pdf形式保存图片
  16. Codeforces1153D-Serval and Rooted Tree(树形dp)
  17. 我是谁:没有绝对安全的系统黑客手法介绍
  18. 神州优车开源业界领先的增量数据同步中间件——DataLink
  19. js区分单击双击,双击不会触发单击事件
  20. arm服务器还是x86架构的服务器,哪个稳定?

热门文章

  1. 6目摄像头照片球面投影变换拼接全景图片
  2. 搜狐新闻表情出现怪异现象
  3. 华为一员工猝死出租屋 警方初步排除他杀
  4. 关于安装ANACONDA遇到的无法定位动态链接库问题
  5. SAP中部分凭证状态导致的审计序时账和科目余额不平——会计凭证中的注释项目
  6. 旧计算机硬盘驱动器可以进口吗,解决方案:可以在新计算机上安装旧的机械硬盘驱动器吗?台式计算机添加新旧机械硬盘+分区教程...
  7. 提高测试工作效率的硬技能和软技能
  8. 【大数据】大数据-实时统计分析-方案选型
  9. 第三次作业-李纯锐-201731084433
  10. 苹果笔记本突然开机黑屏