用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])})")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC服务质量(07)- 重传机制(04) 接收NACK消息

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

Cadence学习笔记 11 PCB中器件放置

基于Cadence 17.4&#xff0c;四层板4路HDMI电路 更多Cadence学习笔记&#xff1a;Cadence学习笔记 1 原理图库绘制Cadence学习笔记 2 PCB封装绘制Cadence学习笔记 3 MCU主控原理图绘制Cadence学习笔记 4 单片机原理图绘制Cadence学习笔记 5 四路HDMI原理图绘制Cadence学习笔记…

Docker 入门:如何使用 Docker 容器化 AI 项目(二)

四、将 AI 项目容器化&#xff1a;示例实践 - 完整的图像分类与 API 服务 让我们通过一个更完整的 AI 项目示例&#xff0c;展示如何将 AI 项目容器化。我们以一个基于 TensorFlow 的图像分类模型为例&#xff0c;演示如何将训练、推理、以及 API 服务过程容器化。 4.1 创建 …

三层交换机配置

一&#xff0c;三层交换 概念&#xff1a;三层交换技术就是&#xff1a;二层交换技术三层转发技术(路由器功能)。它解决了局域网中网段划分之后&#xff0c;网段中子网必须依赖路由器进行管理的局面&#xff0c;解决了传统路由器低速&#xff0c;复杂所造成的网络瓶颈问题。 …

LabVIEW应用在工业车间

LabVIEW作为一种图形化编程语言&#xff0c;以其强大的数据采集和硬件集成功能广泛应用于工业自动化领域。在工业车间中&#xff0c;LabVIEW不仅能够实现快速开发&#xff0c;还能通过灵活的硬件接口和直观的用户界面提升生产效率和设备管理水平。尽管其高成本和初期学习门槛可…

【CSS in Depth 2 精译_094】16.2:CSS 变换在动效中的应用(下)——导航菜单的文本标签“飞入”特效与交错渲染效果的实现

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…

Qt使用QZipWriter和QZipReader来解压、压缩文件

首先感谢这位博主的无私奉献&#xff1a;Qt - 实现压缩文件、文件夹和解压缩操作 - [BORUTO] - 博客园 多文件和目录压缩时&#xff0c;不改变原始文件和目录的相对位置结构&#xff0c;需要在addFile和addDirectory时&#xff0c;需要带上相对路径&#xff0c;如下&#xff1…

PH热榜 | 2024-12-23

1. Websparks 标语&#xff1a;让你的创意变为现实的AI软件工程师 介绍&#xff1a;现在&#xff0c;构建网页应用从未如此简单快捷&#xff01;WebSparks是一个基于人工智能的平台&#xff0c;它能让开发者、设计师&#xff0c;甚至不懂编程的人&#xff0c;都能在很短的时间…

Opencv之对图片的处理和运算

Opencv实现对图片的处理和修改 目录 Opencv实现对图片的处理和修改灰度图读取灰度图转换灰度图 RBG图单通道图方法一方法二 单通道图显色合并单通道图 图片截取图片打码图片组合缩放格式1格式2 图像运算图像ma[m:n,x:y]b[m1:n1,x1:y1] add加权运算 灰度图 读取灰度图 imread(‘…

OpenLinkSaas使用手册-Git工具

在OpenLinkSaas的工具箱里面&#xff0c;最基础的一个就是Git仓库管理。Git仓库功能让git使用更加简单和强大&#xff0c;不仅可以使用常规的commit/pull/push/branch等功能外&#xff0c;还连接了Git仓库供应商的能力。 OpenLinkSass支持使用国内主流的Git仓库供应商的账号登录…

WebRTC服务质量(12)- Pacer机制(04) 向Pacer中插入数据

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

protobuf学习使用

1、概述 protobuf是Google开发的一种语言中立、平台无关、可扩展的序列化结构数据格式。允许定义一次数据结构&#xff0c;然后可以使用各种支持的语言来生成代码&#xff0c;以轻松地读写这些结构到一个二进制流中&#xff0c;如网络传输或文件&#xff0c;Protobuf支持多种编…

CTFHUB-web进阶-php

我们用蚁剑中的这个插件来做这些关卡 一.LD_PRELOAD 发现这里有一句话木马&#xff0c;并且把ant给了我们&#xff0c;我们直接连接蚁剑 右键 选择模式&#xff0c;都可以试一下&#xff0c;这里第一个就可以 点击开始 我们进入到目录&#xff0c;刷新一下&#xff0c;会有一个…

相机、镜头参数详解以及相关计算公式

一、工业相机参数 1、分辨率 相机每次采集图像的像素点数&#xff0c;也是指这个相机总共有多少个感光晶片。在采集图像时&#xff0c;相机的分辨率对检测精度有很大的影响&#xff0c;在对同样打的视场成像时&#xff0c;分辨率越高&#xff0c;对细节的展示越明显。 相机像素…

取多个集合的交集

1.我们取多个集合的交集&#xff0c;先把各个集合放入list中 List < Set < String > > listnew ArrayList<>();HashSet<String> set1new HashSet<>();set1.add( "A" );set1.add("B" );set1.add("C" );HashSet<…

leetcode之hot100---206环形链表(C++)

思路一&#xff1a;哈希表 遍历链表&#xff0c;同时借助哈希表判断当前遍历到的节点是否已经被访问过&#xff0c;如果当前节点已被访问过&#xff0c;则说明存在环 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* L…

文档解析丨高效准确的PDF解析工具,赋能企业非结构化数据治理

在数据为王的时代浪潮中&#xff0c;企业数据治理已成为组织优化运营、提高竞争力的关键。随着数字化进程的加速&#xff0c;企业所积累的数据量呈爆炸式增长&#xff0c;数据类型也愈发多样化&#xff0c;这些数据构成了现代企业数据资产的重要组成部分。 然而&#xff0c;传…

优化 invite_codes 表的 SQL 创建语句

-- auto-generated definition create table invite_codes (id int auto_incrementprimary key,invite_code varchar(6) not null comment 邀请码&#xff0c;6位整数&#xff0c;确保在有效期内…

C语言基础:指针(数组指针与指针数组)

数组指针与指针数组 数组指针 概念&#xff1a;数组指针是指向数组的指针&#xff0c;本质上还是指针 特点&#xff1a; 先有数组&#xff0c;后有指针 它指向的是一个完整的数组 一维数组指针&#xff1a; 语法&#xff1a; 数据类型 (*指针变量名)[行容量][列容量]; 案…

进阶篇(1)

一.存储引擎: <1>MySQL体系结构: 1.连接层: 主要接收客户端的连接,完成一些连接的处理、认证授权、及相关操作安全方案、检测是否超过最大连接数等等;也会为安全接入的每个客户端验证它所具有的操作权限。 例如:在连接MySQL服务器时,我们需要输入用户名和密码,输…