用Python写炸金花游戏

文章目录

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

以下游戏规则:


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

  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 custom_key(item):hand_rank = hand_rankings.index(item[1][0])point_ranks = sorted([point_rank[point] for point in item[1][1]], reverse=True)if hand_rank == 1:second_card_rank = point_ranks[1]first_card_rank = point_ranks[0]return (hand_rank, second_card_rank, first_card_rank)return(hand_rank, point_ranks)
# 计算每个玩家的牌型
player_hands = {player: poker_type(cards) for player, cards in player_poker.items()}# 找出最大牌
winner = max(player_hands.items(),key=custom_key)

player_hands 被假设为一个字典,其中的值是含有两个元素的元组,例如:

player_hands = {
“player1”: (“豹子”, [“A”, “A”, “A”]),
“player2”: (“顺子”, [“K”, “Q”, “J”]),
}

功能

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

8. 打印结果
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 custom_key(item):hand_rank = hand_rankings.index(item[1][0])point_ranks = sorted([point_rank[point] for point in item[1][1]], reverse=True)if hand_rank == 1:second_card_rank = point_ranks[1]first_card_rank = point_ranks[0]return (hand_rank, second_card_rank, first_card_rank)return(hand_rank, point_ranks)
# 计算每个玩家的牌型
player_hands = {player: poker_type(cards) for player, cards in player_poker.items()}
winner = max(player_hands.items(),key=custom_key)
# 打印结果
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])})")

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

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

相关文章

day19-Linux软件包

科普&#xff0c;什么是代码文件。 电脑程序Program&#xff0c;就是某一个编程语言编写的一个代码文件&#xff0c;里面包含了该语言特有的指令&#xff0c;以及各种字符、符号。 linux自带的network管理脚本&#xff0c;shell脚本 什么是软件程序。 软件程序&#xff0c;就…

图像处理-Ch4-频率域处理

Ch4 频率域处理(Image Enhancement in Frequency Domain) FT &#xff1a;将信号表示成各种频率的正弦信号的线性组合。 频谱&#xff1a; ∣ F ( u , v ) ∣ [ R 2 ( u , v ) I 2 ( u , v ) ] 1 2 |F(u, v)| \left[ R^2(u, v) I^2(u, v) \right]^{\frac{1}{2}} ∣F(u,v)…

Vue BPMN Modeler流程图

1、参考地址 git clone https://github.com/evanyangg/vue-bpmn-modeler.git 2、安装bpmn.js npm install bpmn-js --save 3、使用bpmn.js <template><div class"containers"><div class"canvas" ref"canvas"></div&g…

STM32完全学习——FATFS0.15移植SD卡

一、下载FATFS源码 大家都知道使用CubMAX可以很快的将&#xff0c;FATFS文件管理系统移植到单片机上&#xff0c;但是别的芯片没有这么好用的工具&#xff0c;就需要自己从官网下载源码进行移植。我们首先解决SD卡的驱动问题&#xff0c;然后再移植FATFS文件管理系统。 二、SD…

5、栈应用-表达式求值

本章内容使用上述栈结构函数&#xff0c;来完成表达式求值操作。 表达式例如&#xff1a;3*(7-2) 或者 (0-12)*((5-3)*32)/(22) 。 1、实现思路 a、建立OPTR&#xff08;运算符&#xff09;和OPND&#xff08;数字&#xff09;两个栈&#xff0c;后输入字符串以结束 b、自左向…

【递归与回溯深度解析:经典题解精讲(下篇)】—— Leetcode

文章目录 有效的数独解数独单词搜索黄金矿工不同的路径||| 有效的数独 递归解法思路 将每个数独的格子视为一个任务&#xff0c;依次检查每个格子是否合法。 如果当前格子中的数字违反了数独规则&#xff08;在行、列或 33 小方块中重复&#xff09;&#xff0c;直接返回 Fals…

Llama 3 预训练(二)

目录 3. 预训练 3.1 预训练数据 3.1.1 网络数据筛选 PII 和安全过滤 文本提取与清理 去重&#xff08;De-duplication&#xff09; 启发式过滤&#xff08;Heuristic Filtering&#xff09; 基于模型的质量过滤 代码和数学推理数据处理 多语言数据处理 3.1.2 确定数…

双指针——查找总价格为目标值的两个商品

一.题目描述 LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 这个题目非常简单&#xff0c;其实就是判断有没有两个数加起来等于target。 三.算法解析 1.暴力解法 暴力解法的话我们可以枚举出所有的情况&#xff0c;然后判…

sqlserver镜像设置

本案例是双机热备&#xff0c;只设置主体服务器&#xff08;主&#xff09;和镜像服务器&#xff08;从&#xff09;&#xff0c;不设置见证服务器 设置镜像前先检查是否启用了 主从服务器数据库的 TCP/IP协议 和 RemoteDAC &#xff08;1&#xff09;打开SQL Server配置管理器…

Elasticsearch:analyzer(分析器)

一、概述 可用于将字符串字段转换为单独的术语&#xff1a; 添加到倒排索引中&#xff0c;以便文档可搜索。级查询&#xff08;如 生成搜索词的 match查询&#xff09;使用。 分析器分为内置分析器和自定义的分析器&#xff0c;它们都是由若干个字符过滤器&#xff08;chara…

ElementPlus 自定义封装 el-date-picker 的快捷功能

文章目录 需求分析 需求 分析 我们看到官网上给出的案例如下&#xff0c;但是不太满足我们用户想要的快捷功能&#xff0c;因为不太多&#xff0c;因此需要我们自己封装一些&#xff0c;方法如下 外部自定义该组件的快捷内容 export const getPickerOptions () > {cons…

低代码开发平台排名2024

低代码开发平台在过去几年中迅速崛起&#xff0c;成为企业数字化转型的重要工具。这些平台通过可视化界面和拖放组件&#xff0c;使业务人员和技术人员都能快速构建应用程序&#xff0c;大大缩短了开发周期。以下是一些在2024年值得关注和使用的低代码开发平台。 一、Zoho Cre…

计算机网络——期末复习(4)协议或技术汇总、思维导图

思维导图 协议与技术 物理层通信协议&#xff1a;曼彻斯特编码链路层通信协议&#xff1a;CSMA/CD &#xff08;1&#xff09;停止-等待协议&#xff08;属于自动请求重传ARQ协议&#xff09;&#xff1a;确认、否认、重传、超时重传、 &#xff08;2&#xff09;回退N帧协…

【MySQL学习笔记】关于索引

文章目录 【MySQL学习笔记】关于索引1.索引数据结构2.索引存储3.联合索引3.1 联合索引的b树结构3.2 索引覆盖&#xff1f;回表&#xff1f;3.3 联合索引最左匹配原则3.5 索引下推 4.索引失效 【MySQL学习笔记】关于索引 1.索引数据结构 索引是一种能提高查询速度的数据结构。…

D104【python 接口自动化学习】- pytest进阶参数化用法

day104 pytest参数化parametrize单参数 学习日期&#xff1a;20241223 学习目标&#xff1a;pytest基础用法 -- pytest参数化parametrize单参数 学习笔记&#xff1a; 参数化 parametrize 参数化可以组装测试数据&#xff0c;在测试前定义好测试数据&#xff0c;并在测试用…

第T4周:TensorFlow实现猴痘识别(Tensorboard的使用)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标&#xff1a; 1、学习tensorboard的使用 具体实现&#xff1a; &#xff08;一&#xff09;环境&#xff1a; 语言环境&#xff1a;Python 3.10 编 译 器…

Docker-构建自己的Web-Linux系统-镜像webtop:ubuntu-kde

介绍 安装自己的linux-server,可以作为学习使用&#xff0c;web方式访问&#xff0c;基于ubuntu构建开源项目 https://github.com/linuxserver/docker-webtop安装 docker run -d -p 1336:3000 -e PASSWORD123456 --name webtop lscr.io/linuxserver/webtop:ubuntu-kde登录 …

小米路由器开启SSH,配置阿里云ddns,开启外网访问SSH和WEB管理界面

文章目录 前言一、开启SSH二、配置阿里云ddns1.准备工作2.创建ddns脚本3.添加定时任务 三、开启外网访问SSH和WEB管理界面1、解除WEB管理页面访问限制2.手动添加防火墙端口转发规则&#xff0c;开启外网访问WEB管理和SSH 前言 例如&#xff1a;随着人工智能的不断发展&#xf…

什么是ESC ---- 防止车辆打滑并提高驾驶时稳定性的技术

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所谓鸡汤&#xff0c;要么蛊惑你认命&#xff0c;要么怂恿你拼命&#xff0c;但都是回避问题的根源&…

LinkedList类 (链表)

目录 一. LinkedList 基本介绍 二. LinkedList 中的法及其应用 1. 添加元素 (1) add() (2) addAll() (3) addFirst() (4) addLast() 2. 删除元素 (1) remove() (2) removeAll() (3) removeFirst() (4) removeLast() 3. 遍历元素 (1) for 循环遍历 (2) for - each …