综合案例:斗地主

news2025/7/26 13:36:34

综合案例:斗地主

1.程序概述

这是一个模拟斗地主游戏发牌过程的C语言程序,实现了扑克牌的初始化、洗牌和发牌功能。

2.功能需求

2.1 扑克牌定义
  • 使用结构体 Card 表示一张牌,包含:
    • 花色属性suit(0-3表示普通花色♥♠♦♣,4表示小王,5表示大王)
    • 点数属性rank(0-12对应3-A,2,-1表示大小王)
2.2 主要功能
  1. 初始化牌组
  • 创建包含54张牌的牌组(52张普通牌+2张王牌)
  • 普通牌按花色(♠,♥,♣,♦)和点数(3-2)排列
  1. 洗牌功能

    • 使用随机数对牌组进行随机排序
    • 确保每次运行洗牌结果不同(基于时间种子)
  2. 发牌功能

    • 将洗好的牌发给3个玩家
    • 每个玩家17张牌
    • 剩余3张作为底牌
  3. 显示功能

    • 打印每个玩家的手牌 打印底牌
    • 打印底牌

3.数据结构

  • suits[] : 存储4种花色符号的字符串数组
  • ranks[]: 存储13个点数等级的字符串数组
  • jokers[] : 存储大小王描述的字符串数组
  • Card 结构体: 表示单张牌的数据结构
  • 牌组数组: deck[54]
  • 玩家手牌数组: player1[17] , player2[17], player3[17]
  • 底牌数组: bottomCards[3]

4.用户交互

程序运行后自动完成以下流程:

  1. 初始化牌组
  2. 洗牌
  3. 发牌
  4. 显示发牌结果(3个玩家的手牌和底牌)

5.输出格式

  • 普通牌显示格式:花色+点数(如"♠ 3")
  • 王牌显示格式:“小王"或"大王”
  • 玩家手牌按顺序显示,每张牌用空格分隔
  • 底牌同样格式显示

6.代码演示

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>

// 定义扑克牌的花色和点数
const char *suits[] = {"♠","♥","♣","♦"}; // 花色
const char *ranks[] = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; // 点数
const char *joker[] = {"小王","大王"}; // 大小王

// 定义牌的结构体
typedef struct
{
    int suit; // 花色(0-3:普通牌,4:小王,5:大王)
    int rank; // 点数(0-12:普通牌,-1:大小王)
}Card;

// 声明函数原型
void initDeck(Card *deck);
void shuffeDeck(Card *deck, int len);
void dealCards(Card *deck, Card *player1, Card *player2, Card *player3, Card *bottomCards);
void printCard(Card card);

int main(int argc,char *argv[])
{
    Card deck[54]; // 一副牌(54张,包含大小王)
    Card player1[17], player2[17], player3[17]; // 三个玩家的手牌
    Card bottomCards[3]; // 底牌
    
    // 初始化牌
    initDeck(deck);
    
    // 洗牌
    shuffeDeck(deck, 54);
    
    // 发牌
    dealCards(deck, player1, player2, player3, bottomCards);
    
    // 打印玩家手牌和底牌
    int i;
    printf("玩家1的手牌:");
    for(i = 0; i < 17; i++) printCard(player1[i]);
    printf("\n");
    printf("玩家2的手牌:");
    for(i = 0; i < 17; i++) printCard(player2[i]);
    printf("\n");
    printf("玩家3的手牌:");
    for(i = 0; i < 17; i++) printCard(player3[i]);
    printf("\n");
    printf("底牌:");
    for(i = 0; i < 3; i++) printCard(bottomCards[i]);
    printf("\n");
    
    return 0;
}

/**
* 初始化一副牌(54张,包含大小王)
*/
void initDeck(Card *deck)
{
    // 定义一个索引
    int index = 0;
    
    // 初始化普通牌
    for(int suit = 0; suit < 4; suit++) // 遍历花色
    {
        for(int rank = 0; rank < 13; rank++) // 遍历点数
        {
            deck[index].suit = suit; // 每一张牌的花色(索引)
            deck[index].rank = rank; // 每一张牌的点数(索引)
            index++;
        }
    }
    
    // 初始化大小王
    deck[index].suit = 4; // 小王
    deck[index].rank = -1;
    index++;
    deck[index].suit = 5; // 大王
    deck[index].rank = -1;
}

/**
* 洗牌(打乱牌序)
*/
void shuffeDeck(Card *deck, int len)
{
    // 设置随机种子
    srand(time(NULL));
    
    // 洗牌
    for(int i = 0; i < len; i++)
    {
        int j = rand() % len; // 索引 0 ~ 53
        // 将随机出来的牌序和原本的排序交换
        Card temp = deck[i]; 
        deck[i] = deck[j];
        deck[j] = temp;  
    }
}
/**
* 发牌(3个玩家各自17张牌,最后3张牌作为底牌)
*/
void dealCards(Card *deck, Card *player1, Card *player2, Card *player3, Card *bottomCards)
{
    int index = 0;
    
    // 给玩家发牌
    for(int i = 0; i < 17; i++)
    {
        player1[i] = deck[index++]; // 玩家1 等价于 deck[index]; index++;
        player2[i] = deck[index++]; // 玩家2
        player3[i] = deck[index++]; // 玩家3
    }
    
    // 最后3张留作底牌
    for(int i = 0; i < 3; i++)
    {
        bottomCards[i] = deck[index++];
    }
}

/**
* 打印牌(根据牌的索引,显示对应的字符串)
*/
void printCard(Card card)
{
    if(card.suit == 4 || card.suit == 5)
    {
        // 大小王
        printf("%s ", joker[card.suit - 4]);
    }
    else
    {
        // 普通牌
        printf("%s %s ", suits[card.suit], ranks[card.rank]);
    }
}

运行效果:

在这里插入图片描述

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

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

相关文章

前端组件推荐 Swiper 轮播与 Lightbox 灯箱组件深度解析

在互联网产品不断迭代升级的今天&#xff0c;用户对于页面交互和视觉效果的要求越来越高。想要快速打造出吸睛又实用的项目&#xff0c;合适的组件必不可少。今天就为大家推荐两款超好用的组件 ——Swiper 轮播组件和 Lightbox 灯箱组件&#xff0c;轻松解决你的展示难题&#…

Deepfashion2 数据集使用笔记

目录 数据类别: 筛选类别数据: 验证精度筛选前2个类别: 提取类别数据 可视化类别数据: Deepfashion2 的解压码 旋转数据增强 数据类别: 类别含义: Class idx类别名称英文名称0短上衣short sleeve top1长上衣long sleeve top2短外套short sleeve outwear3长外套lo…

Dify知识库下载小程序

一、Dify配置 1.查看或创建知识库的API 二、下载程序配置 1. 安装依赖resquirements.txt ######requirements.txt##### flask2.3.3 psycopg2-binary2.9.9 requests2.31.0 python-dotenv1.0.0#####安装依赖 pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.…

数据库中求最小函数依赖集-最后附解题过程

今天来攻克数据库设计里一个超重要的知识点 —— 最小函数依赖集。对于刚接触数据库的小白来说&#xff0c;这概念可能有点绕&#xff0c;但别担心&#xff0c;咱们一步步拆解&#xff0c;轻松搞定&#x1f4aa;&#xff01; &#xff08;最后fuyou&#xff09; 什么是最小函数…

嵌入式系统中常用的开源协议

目录 1、GNU通用公共许可证&#xff08;GPL&#xff09; 2、GNU宽松通用公共许可证&#xff08;LGPL&#xff09; 3、MIT许可证 4、Apache许可证2.0 5、BSD许可证 6、如何选择合适的协议 在嵌入式系统开发中&#xff0c;开源软件的使用已成为主流趋势。从物联网设备到汽车…

第二篇:Liunx环境下搭建PaddleOCR识别

第二篇&#xff1a;Liunx环境下搭建Paddleocr识别 一&#xff1a;前言二&#xff1a;安装PaddleOCR三&#xff1a;验证PaddleOCR是否安装成功 一&#xff1a;前言 PaddleOCR作为业界领先的多语言开源OCR工具库&#xff0c;其核心优势在于深度整合了百度自主研发的飞桨PaddlePa…

复杂业务场景下 JSON 规范设计:Map<String,Object>快速开发 与 ResponseEntity精细化控制HTTP 的本质区别与应用场景解析

Moudle 1 Json使用示例 在企业开发中&#xff0c;构造 JSON 格式数据的方式需兼顾 可读性、兼容性、安全性和开发效率&#xff0c;以下是几种常用方式及适用场景&#xff1a; 一、直接使用 Map / 对象转换&#xff08;简单场景&#xff09; 通过 键值对集合&#xff08;如 M…

二叉数-965.单值二叉数-力扣(LeetCode)

一、题目解析 顾名思义&#xff0c;就是二叉树中所存储的值是相同&#xff0c;如果有不同则返回false 二、算法原理 对于二叉树的遍历&#xff0c;递归无疑是最便捷、最简单的方法&#xff0c;本题需要用到递归的思想。 采取前序遍历的方法&#xff0c;即根、左、右。 我们…

[蓝桥杯]对局匹配

对局匹配 题目描述 小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分&#xff0c;代表他的围棋水平。 小明发现网站的自动对局系统在匹配对手时&#xff0c;只会将积分差恰好是 K 的两名用户匹配在一起。如果两人分差小于或大于 KK&#xff0c;…

Redis 持久化机制详解:RDB 与 AOF 的原理、优缺点与最佳实践

目录 前言1. Redis 持久化机制概述2. RDB 持久化机制详解2.1 RDB 的工作原理2.2 RDB 的优点2.3 RDB 的缺点 3. AOF 持久化机制详解3.1 AOF 的工作原理3.2 AOF 的优点3.3 AOF 的缺点 4. RDB 与 AOF 的对比分析5. 持久化机制的组合使用与最佳实践6. 结语 前言 Redis 作为一款高性…

【Kotlin】简介变量类接口

【Kotlin】简介&变量&类&接口 【Kotlin】数字&字符串&数组&集合 【Kotlin】高阶函数&Lambda&内联函数 【Kotlin】表达式&关键字 文章目录 Kotlin_简介&变量&类&接口Kotlin的特性Kotlin优势创建Kotlin项目变量变量保存了指向对…

Mybatis入门到精通

一&#xff1a;什么是Mybatis 二&#xff1a;Mybatis就是简化jdbc代码的 三&#xff1a;Mybatis的操作步骤 1&#xff1a;在数据库中创建一个表&#xff0c;并添加数据 我们这里就省略了 2&#xff1a;Mybatis通过maven来导入坐标&#xff08;jar包&#xff09; 3&#xff1a…

Unity性能优化笔记

降低Draw Call 降低draw call&#xff08;unity里叫batches&#xff09;的方法有&#xff1a; 模型减少材质&#xff1b; 多模型共用材质&#xff1b; 烘焙灯光&#xff1b; 关闭阴影和雾&#xff1b; 遮挡剔除&#xff1b; 使用LOD&#xff1b; 模型减少材质 > 见…

BERT vs Rasa 如何选择 Hugging Face 与 Rasa 的区别 模型和智能体的区别

我在之前的一篇文章中提到我的短期目标的问题&#xff0c;即想通过Hugging Face的BERT或Rasa搭建一个简单的意图识别模型&#xff0c;针对发票业务场景来展示其效果 [如&#xff1a;开发票、查询发票]。 开篇&#xff0c;有必要记录几个英文缩写或术语 &#xff08;如果喜欢&a…

Excel 重复项标记,删除重复项时出现未响应的情况

目录 一、重复值标记&#xff1a; 二、删除重复值&#xff1a; 三、未响应问题 一、重复值标记&#xff1a; 方法1&#xff1a;开始 》条件格式 》突出显示单元格规则 》重复值 》设置颜色 》确定 PS&#xff1a;样式可自定义&#xff08;边框、字体、背景填充...&#xff0…

Python:操作 Excel 格式化

🔧Python 操作 Excel 格式化完整指南(openpyxl 与 xlsxwriter 双方案) 在数据处理和报表自动化中,Python 是一把利器,尤其是配合 Excel 文件的读写与格式化处理。本篇将详细介绍两大主流库: openpyxl:适合读取与修改现有 Excel 文件xlsxwriter:适合创建新文件并进行复…

雷卯针对易百纳 SS524多媒体处理演示评估板防雷防静电方案

一、 应用场景 1. 远程视频会议 2. 安防监控 3. 人/车检测 4. 人脸检测、比对 5. 屏幕拼接墙 二、 功能概述 1 四核 ARM Cortex-A7 1.2GHz 2 AI算力 1.0Tops 3 4K30fps 4*1080P30编解码 三、 扩展接口 l RAM&#xff1a;板载 2*DDR4&#xff0c;共 2GB&#xff1b; …

【BUG解决】关于BigDecimal与0的比较问题

这是一个很细小的知识点&#xff0c;但是很容易被忽略掉&#xff0c;导致系统问题&#xff0c;因此记录下来 问题背景 明明逻辑上看a和b都不为0才会调用除法&#xff0c;但是系统会报错&#xff1a;java.lang.ArithmeticException异常&#xff1a; if (!a.equals(BigDecimal…

Spring Bean 为何“难产”?攻克构造器注入的依赖与歧义

本文已收录在Github&#xff0c;关注我&#xff0c;紧跟本系列专栏文章&#xff0c;咱们下篇再续&#xff01; &#x1f680; 魔都架构师 | 全网30W技术追随者&#x1f527; 大厂分布式系统/数据中台实战专家&#x1f3c6; 主导交易系统百万级流量调优 & 车联网平台架构&a…

【Lecture01】动手开发科研智能体(WIN11系统)

1. 配置win11系统中的环境&#xff0c;安装管理器Choco&#xff1a; # Download and install Chocolatey: powershell -c "irm https://community.chocolatey.org/install.ps1|iex" # Download and install Node.js: choco install nodejs-lts --version"22&qu…