用Python写炸金花游戏

devtools/2025/1/8 7:56:28/

文章目录

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

以下游戏规则:


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

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

代码分解与讲解

1. 扑克牌的生成与洗牌
python">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. 给玩家发牌
python">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 中,结构如下:
    python">{'player1': ['黑桃K', '方块Q', '红桃A'],'player2': ['梅花7', '黑桃8', '红桃10'],...
    }
    

3. 打印玩家的手牌
python">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. 定义牌的优先级
python">point_rank = {point: i for i, point in enumerate(check_number, start=2)}  # 字典推导式(i,point)对

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

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

5. 判断牌型
python">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. 确定牌型优先级
python">hand_rankings = ['单张', '对子', '顺子', '同花', '同花顺', '豹子']

功能

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

7. 比较两手牌的大小
python">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. 打印结果
python">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.ppmy.cn/devtools/147319.html

相关文章

INT303 Big Data Analytics 笔记

Lecture1 Introduction 不考&#xff01; “Data Mining is the study of collecting, processing, analyzing, and gaining useful insights from data” EXPLORATORY ANALYSIS Make measurements to understand what the data looks like first steps when collecting da…

Vue axios 异步请求,请求响应拦截器

在 Vue.js 中使用 axios 进行网络请求是非常常见的做法&#xff0c;因为它提供了比原生的 Fetch API 更丰富的功能&#xff0c;并且更易于处理错误和配置。结合 Axios 的拦截器功能&#xff0c;你可以对所有的请求或响应进行预处理&#xff0c;比如添加认证头信息、统一处理错误…

008-SpringBoot 限流

SpringBoot 限流 一、引入依赖二、创建注解三、Redis 配置四、创建切面1.第一种写法&#xff1a;2.第二种写法&#xff1a; 五、配置 Application六、工具七、测试 Controller八、演示结果 自定义注解助力系统保护与高效运行 一、引入依赖 <parent><groupId>org.…

计算机网络 (14)数字传输系统

一、定义与原理 数字传输系统&#xff0c;顾名思义&#xff0c;是一种将连续变化的模拟信号转换为离散的数字信号&#xff0c;并通过适当的传输媒介进行传递的系统。在数字传输系统中&#xff0c;信息被编码成一系列的二进制数字&#xff0c;即0和1&#xff0c;这些数字序列能够…

C语言插入排序及其优化

插入排序算法详解 插入排序是一种简单直观的排序算法。它通过构建有序序列&#xff0c;将未排序部分的元素插入到已排序部分的正确位置&#xff0c;直到所有元素排序完成。下面是插入排序的关键点及其实现细节。 算法思想 从第二个元素&#xff08;下标为 1&#xff09;开始&…

Python 向量检索库Faiss使用

Faiss&#xff08;Facebook AI Similarity Search&#xff09;是一个由 Facebook AI Research 开发的库&#xff0c;它专门用于高效地搜索和聚类大量向量。Faiss 能够在几毫秒内搜索数亿个向量&#xff0c;这使得它非常适合于实现近似最近邻&#xff08;ANN&#xff09;搜索&am…

Kubernetes第二天

1.pod运行一个容器 1.创建目录 mkdir -p /manifests/pod 2.编写pod资源清单文件 vim 01-myweb.yaml 说明&#xff1a; apiVersion:指的是Api的版本 metadata&#xff1a;资源的元数据 spec:用户期望的资源的运行状态 status&#xff1a;资源实际的运行状态 由于拉取远…

4种更快更简单实现Python数据可视化的方法

数据可视化是数据科学或机器学习项目中十分重要的一环。通常&#xff0c;你需要在项目初期进行探索性的数据分析&#xff08;EDA&#xff09;&#xff0c;从而对数据有一定的了解&#xff0c;而且创建可视化确实可以使分析的任务更清晰、更容易理解&#xff0c;特别是对于大规模…