综合案例
1.程序概述
这是一个模拟斗地主游戏发牌过程的C语言程序,实现了扑克牌的初始化、洗牌和发牌功能。
2.功能需求
2.1扑克牌定义
- 使用结构体Card表示一张牌,包含:
- 花色属性
suit
(0-3表示普通花色❤,4表示小王,5表示大王) - 点数属性
rank
(0-12对应3-A,2,-1表示大小王)
- 花色属性
2.2主要功能
- 初始化牌组:
- 创建包含54张牌的牌组(52张普通牌+2张王牌)
- 普通牌按花色(,❤,▲,◆)和点数(3-2)排列
- 洗牌功能:
- 使用随机数对牌组进行随机排序
- 确保每次运行洗牌结果不同(基于时间种子)
- 发牌功能:
- 将洗好的牌发给3个玩家
- 每个玩家17张牌
- 剩余3张作为底牌
- 显示功能:
- 打印每个玩家的手牌
- 打印底牌
3.数据结构
suits[]
: 存储4种花色符号的字符串数组ranks[]
: 存储13个点数等级的字符串数组jokers[]
: 存储大小王描述的字符串数组Card
结构体: 表示单张牌的数据结构- 牌组数组:
deck[54]
- 玩家手牌数组:
player1[17]
,player2[17]
,player3[17]
- 底牌数组:
bottomCards[3]
4.用户交互
程序运行后自动完成以下流程:
- 初始化牌组
- 洗牌
- 发牌
- 显示发牌结果(3个玩家的手牌和底牌)
5.输出格式
- 普通牌显示格式,花色+点数(如“♠3”)
- 王牌显示格式:“小王"或"大王”
- 玩家手牌按顺序显示,每张牌用空格分隔
- 底牌同样格式显示
6.代码显示
/*************************************************************************
> File Name: DouDiZhu.c
> Author: 小刘
> Description:
> Created Time: 2025年05月28日 星期三 12时49分39秒
************************************************************************/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.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* jokers[] = {"大王","小王"};// 大王小王
typedef struct
{
int suit; //花色()
int rank; //
}Card;
//声明函数原型
void initDeck(Card *deck);
void shuffeDeck(Card *deck,int len);
void dealCards(Card *deck,Card *player1,Card *player2,Card *player3,Card *bottomCard);
void printCard(Card card);
int main(int argc,char *argv[])
{
Card deck[54]; //一副牌(54张,包含大小王)
Card player1[17],player2[17],player3[17]; // 三个玩家
Card bottomCard[3];// 底牌
//初始化牌
initDeck(deck);
//洗牌
shuffeDeck(deck,54);
//发牌
dealCards(deck,player1,player2,player3,bottomCard);
//打印玩家手牌和底牌
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(bottomCard[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 53
// 将随机出来的排序与原本的排序交换
Card temp = deck[i];
deck[i] = deck[j];
deck[j] = temp;
}
}
// 发牌(3个玩家各自17张牌,)
void dealCards(Card *deck,Card *player1,Card *player2,Card *player3,Card *bottomCard)
{
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++)
{
bottomCard[i] = deck[index++];
}
}
/**
* 打印牌(根据牌的索引,显示对应的字符串)
*/
void printCard(Card card)
{
if(card.suit == 4 ||card.suit == 5)
{
//大小王
printf("%s ",jokers[card.suit - 4]);
}
else
{
// 普通牌
printf("%s %s ",suits[card.suit],ranks[card.rank]);
}
}