嵌入式开发学习(第二阶段 C语言笔记)

发布于:2025-06-05 ⋅ 阅读:(15) ⋅ 点赞:(0)

综合案例

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)排列
  2. 洗牌功能:
    • 使用随机数对牌组进行随机排序
    • 确保每次运行洗牌结果不同(基于时间种子)
  3. 发牌功能:
    • 将洗好的牌发给3个玩家
    • 每个玩家17张牌
    • 剩余3张作为底牌
  4. 显示功能:
    • 打印每个玩家的手牌
    • 打印底牌

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.代码显示

/*************************************************************************
  > 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]);
	}
}

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到