C语言实现自动发牌

C语言实现自动发牌(每步基本有注释)

1.初始化54张扑克
2.随机洗牌
3.依次分发给三个人
4.显示每个人手里的牌

注:
1.主要利用随机数、结构体和数组来实现
2.常量均以宏替换
3.花色用3,4,5,6 ,1的ASCII码表示

程序运行效果:程序运行效果
代码部分 :

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

#define PokeTotal 54                //扑克的总数
#define UserTotal 3                 //用户数量
#define UserPokeTotal 18            //用户可持有的最大牌数
#define PokeNumberTotal 13          //扑克的全部牌号
#define PokeFlowerTotal 4           //扑克的全部花色
#define ShuffleCardsTotal 5000      //洗牌次数
#define DisplayRowTotal 6           //每行显示牌的个数
#define PokeFlowerType {3,4,5,6}    //花色种类
#define PokeKingFlower 1            //大王和小王的花色
#define PokeBigKingNumber 'B'       //大王的牌号
#define PokeSmallKingNumber 'S'     //小王的牌号

//牌号种类
#define PokeNmberType  { 'A','2','3','4','5','6','7','8','9','0','J','Q','k' }

///
//定义一张牌
struct aPoke
{
	char PokeNumber;        //扑克的牌号      
	char PokeFlower;        //扑克的花色
}AllPoke[PokeTotal],User[UserTotal][UserPokeTotal];  

///
//初始化牌组
void InitalizaPoke()
{
	int i, j, contentNumber;
	char AllPokeNumber[PokeNumberTotal] = PokeNmberType;
	char AllPokeFlower[PokeFlowerTotal] = PokeFloweType;

	//第一张牌
	contentNumber = 0;

	//按顺序储存每张牌号
	for (i = 0; i < PokeNumberTotal; i++)
	{

		//储存四张牌号相同,花色不同的牌
		for (j = 0; j < PokeFlowerTotal; j++)
		{
			//先储存牌号,再储存花色
			AllPoke[contentNumber].PokeNumber = AllPokeNumber[i];
			AllPoke[contentNumber].PokeFlower = AllPokeFlower[j];

			//储存下一张牌
			++contentNumber;
		}

	}

	//设置大王和小王
	AllPoke[52].PokeNumber = PokeSmallKingNumber;
	AllPoke[52].PokeFlower = PokeKingFlower;
	AllPoke[53].PokeNumber = PokeBigKingNumber;
	AllPoke[53].PokeFlower = PokeKingFlower;

}

///
//洗牌
void ShuffleCards()
{
	int i,RandNumber1, RandNumber2;
	char pNumber, pFlower;

	srand((unsigned)time(NULL));

	//洗牌
	for (i = 0; i < ShuffleCardsTotal; i++)
	{
		//随机抽两张牌
		RandNumber1 = rand() % PokeTotal;
		RandNumber2 = rand() % PokeTotal;

		//交换位置
		pFlower=AllPoke[RandNumber1].PokeFlower;
		pNumber = AllPoke[RandNumber1].PokeNumber;
		AllPoke[RandNumber1].PokeFlower = AllPoke[RandNumber2].PokeFlower;
		AllPoke[RandNumber1].PokeNumber = AllPoke[RandNumber2].PokeNumber;
		AllPoke[RandNumber2].PokeFlower = pFlower;
		AllPoke[RandNumber2].PokeNumber = pNumber;
	}
}

///
//发牌
void DealCards()
{
	int i,j,ContentPoke=0;

	//依次发牌
	for (i = 0; i < UserPokeTotal; i++)
	{
		for (j = 0; j < UserTotal; j++)
		{
			User[j][i].PokeFlower = AllPoke[ContentPoke].PokeFlower;
			User[j][i].PokeNumber = AllPoke[ContentPoke].PokeNumber;
			++ContentPoke;
		}
	}

}


///
//显示每个人的牌
void LookCards()
{
	int i, j, ContentPoke = 0,cNumber=0;

	//依次显示每个人的牌
	for (i = 0; i < UserTotal; i++)
	{
		printf("第%d个人的牌\n",i+1);

		for (j = 0; j < UserPokeTotal; j++)
		{
       
			printf("%c",User[i][j].PokeFlower);
			
            //替换牌号为0的牌,正确显示牌号为10的牌
			if (User[i][j].PokeNumber == '0')
			{
				printf("10 ");
			}
			else
			{
				printf("%c  ", User[i][j].PokeNumber);
			}
			++ContentPoke;
			++cNumber;
			
            //每行显示的牌数
			if (cNumber % DisplayRowTotal == 0)
			{
				printf("\n");
			}
		}

		printf("\n\n");
	}
}

int main()
{
	int Judge;

	printf("1为开始\n0为结束\n");
	scanf("%d", &Judge);

	while (Judge)
	{
		//初始化牌组
		InitalizaPoke();

		//洗牌
		ShuffleCards();

		//发牌
		DealCards();

		//显示每个人的牌
		LookCards();

		printf("1为开始\n0为结束\n");
		scanf("%d", &Judge);

	}
	return 0;
}
  • 24
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
好的,为了模拟扑克牌自动发牌,我们需要定义一个扑克牌的结构体,以及一个存放所有扑克牌的数组。以下是一份简单的代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define CARD_NUM 52 /* 扑克牌结构体 */ struct card { int rank; // 牌面大小,2~10表示2~10,11表示J,12表示Q,13表示K,14表示A char suit; // 花色,'S'表示黑桃,'H'表示红心,'D'表示方块,'C'表示梅花 }; /* 初始化扑克牌,将52张牌加入到cards数组中 */ void init_cards(struct card *cards) { int i, j; for (i = 0; i < 4; ++i) { for (j = 2; j <= 14; ++j) { cards[i * 13 + j - 2].rank = j; switch (i) { case 0: cards[i * 13 + j - 2].suit = 'S'; break; case 1: cards[i * 13 + j - 2].suit = 'H'; break; case 2: cards[i * 13 + j - 2].suit = 'D'; break; case 3: cards[i * 13 + j - 2].suit = 'C'; break; default: break; } } } } /* 随机洗牌,打乱cards数组中的牌 */ void shuffle_cards(struct card *cards) { int i, j; struct card temp; srand(time(NULL)); // 以当前时间作为随机数种子 for (i = CARD_NUM - 1; i > 0; --i) { j = rand() % (i + 1); // 生成0~i之间的随机数 temp = cards[i]; cards[i] = cards[j]; cards[j] = temp; } } /* 发牌,从cards数组中摸n张牌,存放到hand数组中 */ void deal_cards(struct card *cards, int n, struct card *hand) { int i; for (i = 0; i < n; ++i) { hand[i] = cards[CARD_NUM - i - 1]; } } /* 打印牌面,将card结构体转换为字符串输出 */ void print_card(struct card c) { if (c.rank >= 2 && c.rank <= 10) { printf("%d%c ", c.rank, c.suit); } else { switch (c.rank) { case 11: printf("J%c ", c.suit); break; case 12: printf("Q%c ", c.suit); break; case 13: printf("K%c ", c.suit); break; case 14: printf("A%c ", c.suit); break; default: break; } } } /* 打印手牌,将hand数组中的所有牌打印出来 */ void print_hand(struct card *hand, int n) { int i; for (i = 0; i < n; ++i) { print_card(hand[i]); } printf("\n"); } int main() { struct card cards[CARD_NUM]; struct card hand[5]; init_cards(cards); shuffle_cards(cards); deal_cards(cards, 5, hand); print_hand(hand, 5); return 0; } ``` 这份代码定义了一个扑克牌的结构体,包含了牌面大小和花色两个属性;并定义了初始化牌、洗牌、发牌、打印牌面等函数。在主函数中,我们初始化52张牌,随机洗牌,5张牌给手牌,最后打印手牌。 在运行程序时,每次输出的手牌都是不同的,因为我们使用了随机数生成器来打乱牌的顺序。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值