当前位置: 首页 > news >正文

用Python写炸金花游戏

文章目录

      • **代码分解与讲解**
        • 1. **扑克牌的生成与洗牌**
        • 2. **给玩家发牌**
        • 3. **打印玩家的手牌**
        • 4. **定义牌的优先级**
        • 5. **判断牌型**
        • 6. **确定牌型优先级**
        • 7. **比较两手牌的大小**
        • 8. **计算每个玩家的牌型并找出赢家**
        • 9. **打印结果**
      • 完整代码

以下游戏规则:


在这里插入图片描述
那么我们要实现的功能,就是以下几个:

  1. 生成扑克牌。
  2. 随机洗牌并分发给五名玩家,每人三张牌。
  3. 判断每位玩家的牌型(例如:豹子、同花顺等)。
  4. 比较五名玩家的牌型,得出赢家。

代码分解与讲解

1. 扑克牌的生成与洗牌
suit_cards = ['黑桃', '红桃', '方块', '梅花']  # 花色
check_number = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']  # 点数# 嵌套循环生成扑克牌
# poker_list = [f"{suit}{check}" for suit in suit_cards for check in check_number]
poker_list = []
for suit in suit_cards:for check in check_number:poker_list.append(f"{suit}{check}")random.shuffle(poker_list)  # 洗牌

功能

  • 通过嵌套循环,生成一副完整的扑克牌(共 52 张)。
    • 例如,“黑桃2”、“红桃A” 等。
  • 使用 random.shuffle() 对扑克牌列表进行随机洗牌,确保发牌的随机性。
  • 这里面把存储牌的容器设置为列表poker_list,其实集合set也可以,不过集合有随机性,还是喜欢都在掌握中的感觉,而且列表方便管理。

2. 给玩家发牌
player = ['player1', 'player2', 'player3', 'player4', 'player5']  # 玩家列表
# player_poker = {p: [] for p in player}  # 初始化每个玩家的手牌为空列表(字典推导式)
player_poker = {}  # 初始化一个空字典
for p in player:  # 遍历每个玩家player_poker[p] = []  # 为每个玩家赋值一个空列表,表示其手牌,player_poker是个字典,键是用户,列表是值(也就是玩家手牌)# 确保牌的数量足够分发
if len(poker_list) < len(player) * 3:raise ValueError("牌堆中牌的数量不足以分发给所有玩家!")# 每人发三张牌
for i in range(3):  # 每人发3轮for p in player:       # 嵌套循环,player中有5个,一共循环15次poker = poker_list.pop()  # 从牌堆顶部发一张牌player_poker[p].append(poker)

功能

  1. 初始化 5 名玩家,每名玩家分配一个空手牌列表。
  2. 检查如果牌堆中牌的数量不足,则抛出错误。
  3. 每名玩家每轮发一张牌,共发 3 轮,每人得到 3 张牌。
  4. 发牌后,每名玩家的牌存储在 player_poker 中,结构如下:
    {'player1': ['黑桃K', '方块Q', '红桃A'],'player2': ['梅花7', '黑桃8', '红桃10'],...
    }
    

3. 打印玩家的手牌
for player, pokers in player_poker.items():  # items是字典的方法,返回一个可迭代对象,每个元素是一个键值对print(f"{player}的牌是:{', '.join(pokers)}")

功能

  • 将每名玩家的手牌以字符串形式打印出来,方便观察。
  • .join() 是一个字符串方法,用于将列表中的元素用指定的字符串连接起来。
  • ', '.join(pokers) 会将列表中的元素用逗号加空格(, )连接成一个字符串:
', '.join(['黑桃A', '红桃K', '方块Q'])  # 结果: '黑桃A, 红桃K, 方块Q'

输出示例:

player1的牌是:黑桃K, 方块Q, 红桃A
player2的牌是:梅花7, 黑桃8, 红桃10
...

4. 定义牌的优先级
point_rank = {point: i for i, point in enumerate(check_number, start=2)}  # 字典推导式(i,point)对

这里解释一下:point是键,i是值, 可以去看一下字典推导式的结构组成
功能

  • point_rank:定义点数的大小,数值越大点数越高。例如,“A” 的优先级最大,值为 14。
    {'2': 2, '3': 3, ..., 'K': 13, 'A': 14}
    

5. 判断牌型
def poker_type(cards):  #这个cards是列表,也就是前面键值对中的值points = sorted([card[2:] for card in cards], key=lambda x: point_rank[x])  # 提取点数并按大小排序suits = [card[:2] for card in cards]  # 提取花色(列表推导式),索引前两个字符# 判断是否为豹子if points[0] == points[1] == points[2]:return '豹子', points# 判断是否为同花顺is_straight = (point_rank[points[2]] - point_rank[points[1]] == 1 and \point_rank[points[1]] - point_rank[points[0]] == 1) or points == ['2', '3', 'A']if len(set(suits)) == 1 and is_straight:   # len(set(suit))==1判断一个列表或字符串中的所有元素是否相同return '同花顺', points# 判断是否为顺子if is_straight:return '顺子', points# 判断是否为同花if len(set(suits)) == 1:return '同花', points# 判断是否为对子if points[0] == points[1] or points[1] == points[2] or points[0] == points[2]:return '对子', points# 如果都不是,返回单张return '单张', points

功能
根据玩家的三张牌,判断牌型并返回 牌型名称点数列表

  1. 豹子:三张点数相同。
  2. 同花顺:花色相同,点数连续。
  3. 顺子:点数连续(但花色不一定相同)。
  4. 同花:花色相同(但点数不一定连续)。
  5. 对子:两张牌点数相同。
  6. 单张:既不连续,也不同花或对子。

6. 确定牌型优先级
hand_rankings = ['单张', '对子', '顺子', '同花', '同花顺', '豹子']

功能

  • 定义牌型的优先级,牌型从低到高依次为:
    • 单张 < 对子 < 顺子 < 同花 < 同花顺 < 豹子。

7. 比较两手牌的大小
def compare_hands(player1, player2):type1, points1 = player1type2, points2 = player2# 比较牌型优先级if hand_rankings.index(type1) > hand_rankings.index(type2):return 1elif hand_rankings.index(type1) < hand_rankings.index(type2):return -1# 如果牌型相同,逐个比较点数for p1, p2 in zip(reversed(points1), reversed(points2)):if point_rank[p1] > point_rank[p2]:return 1elif point_rank[p1] < point_rank[p2]:return -1# 如果点数相同return 0

功能

  • 先比较两手牌的牌型优先级,优先级高者胜。
  • 如果牌型相同,逐一比较点数,由高到低比较。

8. 计算每个玩家的牌型并找出赢家
player_hands = {player: poker_type(cards) for player, cards in player_poker.items()}winner = max(player_hands.items(), key=lambda item: (hand_rankings.index(item[1][0]), item[1][1]))

功能

  1. 遍历每名玩家的手牌,计算牌型。
  2. 使用 max 函数,根据牌型优先级和点数大小,找出赢家。

9. 打印结果
print("\n牌局结果:")
for player, (hand_type, points) in player_hands.items():print(f"{player} 的牌型: {hand_type} ({', '.join(points)})")print(f"赢家是: {winner[0]},牌型: {winner[1][0]} ({', '.join(winner[1][1])})")

功能

  • 输出每名玩家的牌型和点数。
  • 输出赢家及其牌型。

输出示例:

player1 的牌型: 顺子 (10, J, Q)
player2 的牌型: 对子 (8, 8, K)
player3 的牌型: 单张 (7, 9, A)
player4 的牌型: 同花 (4, 6, J)
player5 的牌型: 豹子 (K, K, K)赢家是: player5,牌型: 豹子 (K, K, K)

完整代码

import random# 定义扑克牌花色和点数
suit_cards = ['黑桃', '红桃', '方块', '梅花']
check_number = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']# 生成扑克牌
poker_list = [f"{suit}{check}" for suit in suit_cards for check in check_number]
random.shuffle(poker_list)  # 洗牌# 玩家和玩家手牌
player = ['player1', 'player2', 'player3', 'player4', 'player5']
player_poker = {p: [] for p in player}# 发牌,每人发三张
if len(poker_list) < len(player) * 3:raise ValueError("牌堆中牌的数量不足以分发给所有玩家!")for i in range(3):for p in player:poker = poker_list.pop()player_poker[p].append(poker)# 打印每个玩家的牌
for player, pokers in player_poker.items():print(f"{player}的牌是:{', '.join(pokers)}")# 定义点数优先级
point_rank = {point: i for i, point in enumerate(check_number, start=2)}# 判断牌型
def poker_type(cards):points = sorted([card[2:] for card in cards], key=lambda x: point_rank[x])suits = [card[:2] for card in cards]# 判断是否为豹子if points[0] == points[1] == points[2]:return '豹子', points# 判断是否为同花顺is_straight = (point_rank[points[2]] - point_rank[points[1]] == 1 and \point_rank[points[1]] - point_rank[points[0]] == 1) or points == ['2', '3', 'A']if len(set(suits)) == 1 and is_straight:return '同花顺', points# 判断是否为顺子if is_straight:return '顺子', points# 判断是否为同花if len(set(suits)) == 1:return '同花', points# 判断是否为对子if points[0] == points[1] or points[1] == points[2] or points[0] == points[2]:return '对子', points# 否则为单张return '单张', points# 定义牌型优先级
hand_rankings = ['单张', '对子', '顺子', '同花', '同花顺', '豹子']# 比较两手牌的大小
def compare_hands(player1, player2):type1, points1 = player1type2, points2 = player2# 比较牌型优先级if hand_rankings.index(type1) > hand_rankings.index(type2):return 1elif hand_rankings.index(type1) < hand_rankings.index(type2):return -1# 如果牌型相同,逐个比较点数for p1, p2 in zip(reversed(points1), reversed(points2)):if point_rank[p1] > point_rank[p2]:return 1elif point_rank[p1] < point_rank[p2]:return -1# 如果点数相同,结果为平局return 0# 计算每个玩家的牌型
player_hands = {player: poker_type(cards) for player, cards in player_poker.items()}# 找出最大牌
winner = max(player_hands.items(), key=lambda item: (hand_rankings.index(item[1][0]),[point_rank[point] for point in item[1][1]]))# 打印结果
print("\n牌局结果:")
for player, (hand_type, points) in player_hands.items():print(f"{player} 的牌型: {hand_type} ({', '.join(points)})")print(f"赢家是: {winner[0]},牌型: {winner[1][0]} ({', '.join(winner[1][1])})")

相关文章:

用Python写炸金花游戏

文章目录 **代码分解与讲解**1. **扑克牌的生成与洗牌**2. **给玩家发牌**3. **打印玩家的手牌**4. **定义牌的优先级**5. **判断牌型**6. **确定牌型优先级**7. **比较两手牌的大小**8. **计算每个玩家的牌型并找出赢家**9. **打印结果** 完整代码 以下游戏规则&#xff1a; 那…...

计算机的错误计算(一百九十二)

摘要 用两个大模型计算 csc(0.999), 其中&#xff0c;0.999是以弧度为单位的角度&#xff0c;结果保留5位有效数字。两个大模型均给出了 Python代码与答案。但是&#xff0c;答案是错误的。 例1. 计算 csc(0.999), 其中&#xff0c;0.999是以弧度为单位的角度&#xff0c;结…...

37 Opencv SIFT 特征检测

文章目录 Ptr<SIFT> SIFT::create示例 Ptr SIFT::create Ptr<SIFT> SIFT::create(int nfeatures 0,int nOctaveLayers 3,double contrastThreshold 0.04,double edgeThreshold 10,double sigma 1.6 );参数说明&#xff1a;nfeatures&#xff1a;类型&#x…...

Nginx界的天花板-Oracle 中间件OHS 11g服务器环境搭建

环境信息 服务器基本信息 如下表&#xff0c;本次安装总共使用2台服务器&#xff0c;具体信息如下&#xff1a; 服务器IP DNS F5配置 OHS1 172.xx.xx.xx ohs01.xxxxxx.com ohs.xxxxxx.com OHS2 172.xx.xx.xx ohs02.xxxxxx.com 服务器用户角色信息均为&#xff1a;…...

域名解析协议

一、DNS简述 ‌DNS协议是一种应用层协议&#xff0c;用于将域名转换为对应的IP地址‌&#xff0c;使得客户端可以通过域名来访问Internet上的各种资源‌ DNS的基础设施是由分层的DNS服务器实现的分布式数据库&#xff0c;它运行在UDP之上‌&#xff0c;通常使用端口号53‌ DN…...

微信小程序给外面的view设置display:flex;后为什么无法给里面的view设置宽度

如果父盒子view设置了display:flex&#xff0c;子view设置宽度值无效&#xff0c;宽度值都是随着内容多少而改变&#xff1a; 问题视图&#xff1a; 原因&#xff1a; flex布局元素的子元素&#xff0c;自动获得了flex-shrink的属性 解决方法&#xff1a; 给子view增加:fl…...

Maven怎么会出现一个dependency-reduced-pom.xml的文件

问题 今天打包时突然发现&#xff0c;多出了一个名为dependency-reduced-pom.xml的文件 解决方法 由于使用了maven-shade-plugin插件导致的&#xff0c;在 <plugin> 标签下添加 <configuration><createDependencyReducedPom>false</createDependencyR…...

突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除

GitLab停止为中国大陆、香港和澳门地区提供服务&#xff0c;要求用户在60天内迁移账号&#xff0c;否则将被删除。这一事件即将引起广泛的关注和讨论。以下是对该事件的扩展信息&#xff1a; 1. 背景介绍&#xff1a;GitLab是一家全球知名的软件开发平台&#xff0c;提供代码托…...

自学记录HarmonyOS Next DRM API 13:构建安全的数字内容保护系统

在完成了HarmonyOS Camera API的开发之后&#xff0c;我开始关注更复杂的系统级功能。在浏览HarmonyOS Next文档时&#xff0c;我发现了一个非常有趣的领域&#xff1a;数字版权管理&#xff08;DRM&#xff09;。最新的DRM API 13提供了强大的工具&#xff0c;用于保护数字内容…...

Vue 3 + Element Plus 实现文件上传组件:详细解析与实现指南

Vue 3 文件上传组件实现详解 在实际的前端开发中&#xff0c;文件上传是一个常见的需求&#xff0c;尤其是在需要处理文档、图片或其他类型文件的应用中。Vue 3 结合 Element Plus UI 组件库为我们提供了一个简单且灵活的文件上传解决方案。在这篇文章中&#xff0c;我们将详细…...

qt5.12.11+msvc编译器编译qoci驱动

1.之前编译过minGW编译器编译qoci驱动,很顺利就完成了,文章地址:minGW编译qoci驱动详解,今天按照之前的步骤使用msvc编译器进行编译,直接就报错了: 查了些资料,发现两个编译器在编译时,pro文件中引用的库不一样,下面是msvc编译器引用的库,其中编译引用的库我这里安装…...

Ubuntu 20.04 安装 LNMP

1. 更新系统 sudo apt update sudo apt upgrade2. 安装 Nginx sudo apt install nginx3. 安装 MariaDB (作为 MySQL 的替代) sudo apt install mariadb-server mariadb-client初始化 MariaDB 数据库&#xff08;可选&#xff09; sudo mysql_secure_installation4. 安装 PH…...

Llama 3 简介(一)

目录 1. 引言 1.1 Llama 3 的简介 1.2 性能评估 1.3 开源计划 1.4 多模态扩展 ps 1. 缩放法则 2. 超额训练&#xff08;Over-training&#xff09; 3. 计算训练预算 4. 如何逐步估算和确定最优模型&#xff1f; 2. 概述 2.1 Llama 3 语言模型开发两个主要阶段 2.2…...

在 CentOS 上安装 FFmpeg

在CentOS 上安装 FFmpeg 方法一&#xff1a;在线安装 添加 EPEL 和 RPM Fusion 源&#xff1a; sudo yum install epel-release sudo yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm安装 FFmpeg&#xff1a; sudo yu…...

Python------Pandas的数据结构

Pandas主要处理以下三个数据结构&#xff1a; 序列(Series) 数据帧(DataFrame) 面板(Panel) 数据结构维数描述序列11维结构&#xff0c;值可变&#xff0c;大小不变数据帧22维结构&#xff0c;值可变&#xff0c;大小可变&#xff0c;表结构面板3维标记&#xff0c;值可变…...

矩阵碰一碰发视频源码技术解析,支持OEM

一、引言 随着近场通信技术的不断发展&#xff0c;矩阵碰一碰发视频技术作为一种创新的交互方式&#xff0c;逐渐在各个领域崭露头角&#xff0c;如智能营销、展览展示、教育科普等场景中都有着广泛的应用前景。通过将多个碰一碰设备或感应区域组成矩阵形式&#xff0c;用户能够…...

【汇编语言】外中断(一)—— 外中断的魔法:PC机键盘如何触发计算机响应

文章目录 前言1. 背景介绍2. 接口芯片和端口3. 外中断信息3.1 什么是外中断信息3.2 外中断源的分类3.2.1 可屏蔽中断3.2.1.1 什么是可屏蔽中断&#xff1f;3.2.1.2 可屏蔽中断的处理过程 3.2.2 不可屏蔽中断3.2.2.1 什么是不可屏蔽中断&#xff1f;3.2.2.2 不可屏蔽中断的处理过…...

pymssql-2.1.4.dev5-cp37-cp37m-win_amd64.whl 安装

pip install pymssql 安装pymssql出现下面的问题 error: Microsoft Visual C 14.0 is required. Get it with “Microsoft Visual C Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools 因为要使用python连接sqlserver数据库&#xff0c;需要pymssq…...

在HTML中使用Vue如何使用嵌套循环把集合中的对象集合中的对象元素取出来(我的意思是集合中还有一个集合那种)

在 Vue.js 中处理嵌套集合&#xff08;即集合中的对象包含另一个集合&#xff09;时&#xff0c;使用多重 v-for 指令来遍历这些层次结构。每个 v-for 指令可以用于迭代一个特定级别的数据集&#xff0c;并且可以在模板中嵌套多个 v-for 来访问更深层次的数据。 例如&#xff…...

Apriori关联规则算法 HNUST【数据分析技术】(2025)

1.理论知识 Apriori是一种常用的数据关联规则挖掘方法&#xff0c;它可以用来找出数据集中频繁出现的数据集合。该算法第一次实现在大数据集上的可行的关联规则提取&#xff0c;其核心思想是通过连接产生候选项及其支持度&#xff0c;然后通过剪枝生成频繁项集。 Apriori算法的…...

保姆级教程:用Keil5将你的STM32F103工程无缝迁移到国民技术N32G45X

从STM32F103到N32G45X&#xff1a;嵌入式工程师的国产MCU迁移实战指南 在嵌入式开发领域&#xff0c;芯片选型往往决定着项目的成败。随着国产微控制器的崛起&#xff0c;越来越多的工程师开始考虑将原有基于STM32的项目迁移到国产平台。国民技术的N32G45X系列以其出色的性价比…...

resume-cli实际案例分享:成功求职者的简历配置终极指南

resume-cli实际案例分享&#xff1a;成功求职者的简历配置终极指南 【免费下载链接】resume-cli CLI tool to easily setup a new resume &#x1f4d1; 项目地址: https://gitcode.com/gh_mirrors/re/resume-cli resume-cli是一款基于JSON Resume标准的命令行工具&…...

药流和人流哪个恢复快?术后修护行业洞察与实用指南

意外怀孕后&#xff0c;药流和人流的恢复差异及术后修护&#xff0c;是女性关注的核心话题&#xff0c;也是孕产修护领域的重点议题。术后修护作为缩短恢复周期、减少并发症的关键&#xff0c;其科学合理性直接影响女性生殖健康。本文结合行业现状与实用经验&#xff0c;探讨药…...

OpenClaw+千问3.5-9B:个性化新闻摘要与推送系统

OpenClaw千问3.5-9B&#xff1a;个性化新闻摘要与推送系统 1. 为什么需要个人新闻助手&#xff1f; 每天早上打开新闻App&#xff0c;总会被各种无关信息轰炸——明星八卦、标题党、重复推送...作为一个技术从业者&#xff0c;我真正需要的是垂直领域的高质量内容。尝试过RSS…...

Bugtton:ATmega328P专用超低开销按钮消抖库

1. 项目概述Bugtton 是一款专为 ATmega328P 微控制器深度优化的轻量级按钮消抖库&#xff0c;其设计哲学直指嵌入式系统中一个被长期忽视却至关重要的性能瓶颈&#xff1a;空闲状态下的 CPU 周期开销。在传统 Arduino 风格的按钮处理方案中&#xff0c;digitalRead()函数因其通…...

毕业论文答辩利器:AI驱动的10款高效工具及模板深度评测

工具对比速览表 工具名称 核心功能 适用场景 特色优势 Aibiye 智能成文、文献查找、数据分析 社科/金融/理工类论文 融合多模型架构&#xff0c;精准把握高校规范 Aicheck 初稿生成、大纲定制、图表插入 快速完成初稿需求 全学科覆盖&#xff0c;20-30分钟极速生成 …...

MAA助手跨平台部署与自动化实践指南

MAA助手跨平台部署与自动化实践指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitcode.com/GitHub_Trending/ma/…...

【西瓜带你学设计模式 | 第十二期 - 装饰器模式】装饰器模式 —— 动态叠加功能实现、优缺点与适用场景

文章目录前言1. 装饰器模式是什么&#xff1f;2. 装饰器模式解决什么问题&#xff1f;3. 实现步骤4. 静态结构4.1 抽象组件&#xff1a;Coffee&#xff08;统一接口&#xff09;4.2 具体组件&#xff1a;SimpleCoffee&#xff08;基础咖啡&#xff09;4.3 装饰器抽象类&#xf…...

如何使用 ECharts 绘制 K 线图

在金融数据可视化领域&#xff0c;K 线图&#xff08;又称蜡烛图&#xff09;是展示股票、期货等价格走势的核心工具。它通过矩形实体和上下影线直观呈现开盘价、收盘价、最高价和最低价&#xff0c;帮助投资者快速捕捉市场趋势。本文将结合 ECharts 的官方文档和实战案例&…...

OpenFBX:轻量级FBX文件解析的终极解决方案

OpenFBX&#xff1a;轻量级FBX文件解析的终极解决方案 【免费下载链接】OpenFBX Lightweight open source FBX importer 项目地址: https://gitcode.com/gh_mirrors/op/OpenFBX OpenFBX是一款轻量级开源FBX导入工具&#xff0c;专为解决3D开发中FBX文件解析难题而设计。…...