模拟斗地主发牌

#define _CRT_SECURE_NO_WARNINGS 1

#define ROW 5
#define COLUMN 13
#define PLAYER_NUM 3
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int visited[ROW][COLUMN] = { 0 };

// 用户
char players[PLAYER_NUM][17][256] = { 0 };

int main_ddz()
{
	void sendCard(char(*cards)[COLUMN]);
	void showPlayerCards();
	void showBottomCards(char(*cards)[COLUMN]);
	// 存储牌
	// 第一行 1梅花  2红桃 3 黑桃  4方块 5 大小王
	char  cards[ROW][COLUMN] = { {'A','2','3','4','5','6','7','8','9','T','J','Q','K'},
	{'A','2','3','4','5','6','7','8','9','T','J','Q','K'} ,
	{'A','2','3','4','5','6','7','8','9','T','J','Q','K'} ,
	{'A','2','3','4','5','6','7','8','9','T','J','Q','K'} ,{'W','w'} };
	// 发牌
	sendCard(cards);

	// 打印玩着的牌
	showPlayerCards();

	// 打印底牌
	printf("打印底牌:\n");
	showBottomCards(cards);
	return 1;
}

// 函数名sendCard,参数个数(1个)及类型 &cards[0]  char (*)[])
void sendCard(char(*cards)[COLUMN]) {
	void getColor(int color, int* p_pointNum, char* card);
	// 播种
	srand((unsigned int)time(NULL));
	int i = 0;
	for (; i < 51; ) {
		// 随机发牌
		int color = rand() % 5;
		int pointNum = rand() % 13;

		char card[128] = { 0 };
		getColor(color, &pointNum, card);

		// 判断是否已经出现过
		if (visited[color][pointNum] == 0) {

			char num[2] = { *(*(cards + color) + pointNum) ,'\0' };
			// 将花色和点数拼接成牌
			strcat(card, num);
			// 将牌发给用户
			strcpy(players[i / 17][i % 17], card);

			visited[color][pointNum] = 1;// 表示已经随机过
			i++;
		}
	}
}


// 获取花色
void getColor(int color, int* p_pointNum, char* card) {
	switch (color)
	{
	case 0:
		strcpy(card, "梅花 ");
		break;
	case 1:
		strcpy(card, "红桃 ");
		break;
	case 2:
		strcpy(card, "黑桃 ");
		break;
	case 3:
		strcpy(card, "方块 ");
		break;
	case 4:
		// 解决:随机大小王的问题
		*p_pointNum = (*p_pointNum) % 2;
		strcpy(card, "");
		break;
	}

}

void showPlayerCards() {
	for (int i = 0; i < PLAYER_NUM; i++) {
		printf("player%d:\n", i + 1);
		for (int j = 0; j < 17; j++) {
			printf("%-8s", *(players + i) + j);
		}
		printf("\n");
	}
}

// 显示底牌
void showBottomCards(char(*cards)[COLUMN]) {
	void getColor(int color, int* p_pointNum, char* card);
	int count = 1;
	// 遍历visited数组
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COLUMN; j++) {
			if (count > 3) {
				return;//终止循环
			}
			if (*(*(visited + i) + j) == 0) {
				char card[128] = { 0 };
				int pointNum = j;
				getColor(i, &pointNum, card);

				char num[2] = { *(*(cards + i) + pointNum) ,'\0' };
				// 将花色和点数拼接成牌
				strcat(card, num);
				printf("%-8s", card);
				count++;
			}
		}
	}
}

/*
54张牌
4种花色,每种花色13张牌
大小王
<1>如何存储牌
数组
二维数组[5][13], 特殊的10使用T来代替

<2>发牌
随机发
3个用户,17张,3张底牌

rand函数(花色 ------ 点数)(组成一张牌)【考虑重复的问题】---》重新随机

<3> 将用户的牌打印出来
 底牌打印出来


*/

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值