目录
一、头函数及主函数
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int card[52] = { 0 };
filedeck(card, 52);
shuffle(card);
deal(card);
return 0;
}
二、新牌
void filedeck(int pk[], int cardn)
{
for (int i = 0; i < cardn; i++)
{
int k = i / 13 + 3;
pk[i] = k*100 + i + 1;
}
}
函数filedeck(int pk[], int cardn)用于初始化牌堆,将52张牌存储在数组pk中。每张牌用一个三位数表示,百位表示花色,个位和十位表示点数,例如202表示红桃2,413表示黑桃K。
三、发牌
void deal(int pk[])
{
int i, j, k;
for (i = 0; i < 4; i++)
{
printf("玩家%d\n", i + 1);
for (j = 0; j < 13; j++)
{
printf(" -- ");
}
printf("\n");
for (j = i * 13; j < (i + 1) * 13; j++)
{
printf("|%c |", pk[j] / 100);
}
printf("\n");
for (j = i * 13; j < (i + 1) * 13; j++)
{
if ((pk[j] % 100 - 1) % 13 == 9)
printf("|10|");
else
printf("| %c|", "A234567890JQK"[(pk[j] % 100 - 1) % 13]);
}
printf("\n");
for (j = 0; j < 13; j++)
{
printf(" -- ");
}
printf("\n");
}
}
函数deal(int pk[])用于发牌操作,按照四个玩家轮流发牌,并输出每个玩家的牌面。首先输出一行横线,表示牌面上方的边界;然后输出一个空格和三个连字符,表示每张牌的左边界和右边界;接着输出花色符号,例如红桃用♥表示;再接着输出点数,其中牌面数字10需要特判处理;最后输出一行横线表示牌面下方的边界。
五、洗牌
void shuffle(int pk[])
{
int i, j, k;
srand((unsigned)(time(NULL)));
for (i = 0; i < 10000; i++)
{
j = rand() % 52;
k = rand() % 52;
int temp = 0;
temp = pk[j];
pk[j] = pk[k];
pk[k] = temp;
}
}
函数shuffle(int pk[])用于洗牌操作,通过随机交换两张牌的位置,对牌堆进行打乱。循环10000次是为了增加随机性,更好地模拟洗牌过程。
六、运行结果
七、完整代码
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void filedeck(int pk[], int cardn)
{
for (int i = 0; i < cardn; i++)
{
int k = i / 13 + 3;
pk[i] = k*100 + i + 1;
}
}
void deal(int pk[])
{
int i, j, k;
for (i = 0; i < 4; i++)
{
printf("玩家%d\n", i + 1);
for (j = 0; j < 13; j++)
{
printf(" -- ");
}
printf("\n");
for (j = i * 13; j < (i + 1) * 13; j++)
{
printf("|%c |", pk[j] / 100);
}
printf("\n");
for (j = i * 13; j < (i + 1) * 13; j++)
{
if ((pk[j] % 100 - 1) % 13 == 9)
printf("|10|");
else
printf("| %c|", "A234567890JQK"[(pk[j] % 100 - 1) % 13]);
}
printf("\n");
for (j = 0; j < 13; j++)
{
printf(" -- ");
}
printf("\n");
}
}
void shuffle(int pk[])
{
int i, j, k;
srand((unsigned)(time(NULL)));
for (i = 0; i < 10000; i++)
{
j = rand() % 52;
k = rand() % 52;
int temp = 0;
temp = pk[j];
pk[j] = pk[k];
pk[k] = temp;
}
}
int main()
{
int card[52] = { 0 };
filedeck(card, 52);
shuffle(card);
deal(card);
return 0;
}
八、补充说明
在这里小编用的编译器是vs2022,要打印出扑克牌花色,需改用旧版本的控制台,步骤如下:
1.在应用中搜索cmd,点击以管理员身份运行
2. 在控制台界面左上角右击鼠标,选择默认值
3. 选择使用旧版本控制台,选择点阵字体