目的:
54张牌发给三个人,每人17张,三张底牌。
必要准备:
使用一个二维数组存放卡牌(牌库)行数决定花色,列数决定数字。
使用三维数组存放发到手里的牌 排数决定玩家 行数决定卡牌信息。
具体功能:
将54张牌随机发给三个玩家(共51张)将剩余的三张底牌发出,并输出。
必要知识:
1 》 srand()函数:
void srand (unsigned int seed);//播种
2》rand()函数:
int rand (void); //生成随机数
3》strcat()函数:
char * strcat ( char * destination, const char * source );//拼接字符串
功能介绍:
将源字符串的副本追加到目标字符串。destination 中的终止 null 字符被 source 的第一个字符覆盖,并且 null 字符包含在由 destination 中两者的串联形成的新字符串的末尾
3》strcpy()函数:
char * strcpy ( char * destination, const char * source );//复制字符串
功能介绍:
将源指向的 C 字符串复制到目标指向的数组中,包括终止 null 字符(并在该点处停止)。
为避免溢出,目标指向的数组的大小应足够长,以包含与源相同的 C 字符串(包括终止 null 字符),并且不应在内存中与源重叠。
主要思想:
1>花色获取
:rand()%5得到0-4随机数。代表0-3代表花色,4代表大小王。
2>点数获取;
rand()%13得到0-12随机数代表的十三张牌。
3>获取牌:
花色对应switch()语句利用strcpy()花色存储到一个新的char数组中。例如arr[128]="方片"
再将得到的点数存储到数组中,利用strcat拼接到arr[]数组后面 ,此时一张牌的具体信息已经得到。
4>考虑重复问题:
初始化一个与牌库行列都相同的数组,初始化为0.。当有一张牌发给玩家后标记这个位置为1.每当循环发牌前判断该牌是否已经发过(是否为0).
考虑到牌库中随机到第五行时仅有前两个元素大王小王,所以每当随机为4(第五行)时将列数改变只有两列。
总代码为:
#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define ROW 5
#define LINE 13
/*
54张牌
4种花色,每种花色13张牌
大小王
<1>如何存储牌
数组
二维数组[5][13], 特殊的10使用T来代替
<2>发牌
随机发
3个用户,17张,3张底牌
rand函数(花色 ------ 点数)(组成一张牌)【考虑重复的问题】---》重新随机
<3> 将用户的牌打印出来
底牌打印出来
*/
players[3][17][128] = {0};
char cards[ROW][LINE] = { { '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'} };
int visited[ROW][LINE] = { 0 };
void getcolor(int color,char* arry,int* number)
{
switch (color)
{
case 0:
{
strcpy(arry, "方片");
break;
}
case 1:
{
strcpy(arry, "红桃");
break;
}
case 2:
{
strcpy(arry, "黑桃");
break;
}
case 3:
{
strcpy(arry, "梅花");
break;
}
case 4:
{
(*number) = (*number) % 2;
strcpy(arry, " ");
break;
}
}
}
void SendCards()
{
srand((unsigned)time(NULL));//播种在循环外部
for (int i = 0; i < 51;)
{
int color = rand() % 5;
int number = rand() % 13;
//获取花色
char arry[128] = { 0 };
getcolor(color, arry, &number); // 获取颜色,改变最后一行的列数,,,(如果是第四行在判断之前就要改变第四行的列数)否则将无法标记第四行2列后面的0
if (visited[color][number] == 0)
{
char arrynumber[2] = { cards[color][number],'\0' }; //获取数字
strcat(arry,arrynumber); //将颜色和数字放进一个数组中
strcpy(players[i / 17][i % 17], arry); //将颜色和数字一起放进玩家的牌中
visited[color][number] = 1;
i++;
}
}
}
void printfCards()
{
for (int i = 0; i < 3; i++)
{
printf("第%d玩家的牌为\n",i+1);
for (int j = 0; j < 17; j++)
{
printf("%-8s", *(players+i)+j);
}
printf("\n");
}
}
//打印在visited数组中未被标记的卡牌
int printfLastCards()
{
int flag = 0;
printf("底牌为 ");
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 13; j++)
{
if (flag >= 3)
{
return 0;
}
char arry[128] = { 0 };
getcolor(i, arry, &j);//颜色行数,存放颜色的数组,数字列数,传入函数中
if (visited[i][j] == 0)
{
char arrynumber[2] = { cards[i][j],'\0' };
strcat(arry,arrynumber);
printf("%-8s",arry);
flag++;
}
}
}
}
int main()
{
SendCards();
printfCards();
printfLastCards();
return 0;
}
运行结果示例:
完毕。