// 扑克牌的四种玩法
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define PUKE_SIZE 54
// 定义 花色 和 内容
char *colors[] = {"♣", "♠", "♦", "♥"};
char *values[] = {"3", "4", "5", "6", "7", "8", "9",
"10", "J", "Q", "K", "A", "2", "小王", "大王"};
typedef struct
{
char color[12];
char value[12];
// 定义牌的序号,方便比较大小
int index;
} Puke;
// 交换两种牌
// a, b 牌的 索引
void swap_pukes(Puke pukes[], int a, int b);
// 定义一或两副牌
// n 为牌的副数
void init_pukes(Puke pukes[], int n);
// 洗牌
// 牌的张数
void shuffle_pukes(Puke pukes[], int size);
// 整理牌
// n 玩家数
// N 每个玩家牌的张数
void sort_pukes(Puke pukes[], int N, int n);
// 打印牌
// size 牌的张数
// n 玩家数
// N 每个玩家牌的张数
// 若 size > n * N,说明 有地主牌
void print_pukes(Puke pukes[], int size, int N, int n);
int main(int argc, char const *argv[])
{
int n;
Puke pukes[2 * PUKE_SIZE];
while (1)
{
printf("-----------------------------------\n");
printf("1) 三人斗地主 2) 四人斗地主\n");
printf("3) 跑的快 4) 2 VS 2\n");
printf("-----------------------------------\n");
printf("请选择玩法(else to quit):");
scanf("%d", &n);
printf("\n");
switch (n)
{
case 1:
init_pukes(pukes, 1);
shuffle_pukes(pukes, 54);
sort_pukes(pukes, 17, 3);
print_pukes(pukes, 54, 17, 3);
break;
case 2:
init_pukes(pukes, 2);
shuffle_pukes(pukes, 108);
sort_pukes(pukes, 25, 4);
print_pukes(pukes, 108, 25, 4);
break;
case 3:
init_pukes(pukes, 1);
swap_pukes(pukes, 48, 47);
shuffle_pukes(pukes, 48);
sort_pukes(pukes, 16, 3);
print_pukes(pukes, 48, 16, 3);
break;
case 4:
init_pukes(pukes, 2);
shuffle_pukes(pukes, 108);
sort_pukes(pukes, 27, 4);
print_pukes(pukes, 108, 27, 4);
break;
default:
return 0;
}
printf("\n");
printf("\n");
}
return 0;
}
void init_pukes(Puke pukes[], int N)
{
int n;
while (N > 0)
{
if (N == 2)
n = 54;
else
n = 0;
int m = 1;
for (int i = 0; i < 13; i++)
{
for (int j = 0; j < 4; j++)
{
strcpy(pukes[n].color, colors[j]);
strcpy(pukes[n].value, values[i]);
pukes[n].index = m;
m++;
n++;
}
}
strcpy(pukes[n].color, "");
strcpy(pukes[n].value, values[13]);
pukes[n].index = 53;
n++;
strcpy(pukes[n].color, "");
strcpy(pukes[n].value, values[14]);
pukes[n].index = 54;
N--;
}
}
void swap_pukes(Puke pukes[], int a, int b)
{
char c[12];
char v[12];
int n;
strcpy(c, pukes[a].color);
strcpy(v, pukes[a].value);
n = pukes[a].index;
strcpy(pukes[a].color, pukes[b].color);
strcpy(pukes[a].value, pukes[b].value);
pukes[a].index = pukes[b].index;
strcpy(pukes[b].color, c);
strcpy(pukes[b].value, v);
pukes[b].index = n;
}
// rand()会返回一个范围 0 ~ RAND_MAX(32767) 之间的伪随机数(整数)
// rand函数每一次被调用的时候,它都会查看之前是否调用了srand函数
// 1.如果调用了,则会调用srand(seed) 来初始化它的随机值
// 2.如果没有调用,则会默认的调用srand(1) 来初始化它的随机值
// time(NULL) 计算机时间(long int 型) 微秒
// time 相当于一个种子,srand函数根据这个种子,设置一个随机起点,而rand函数根据这个随机起点,返回一个随机数
// 如果随机种子相同,每次产生的随机数也会相同
void shuffle_pukes(Puke pukes[], int size)
{
srand((unsigned)time(NULL));
for (int i = 0; i < 100 * size; i++)
{
int a = rand() % size;
int b = rand() % size;
swap_pukes(pukes, a, b);
}
}
void sort_pukes(Puke pukes[], int N, int n)
{
for (int k = 0; k < n; k++)
{
for (int i = k * N; i < N * (k + 1) - 1; i++)
{
for (int j = N * (k + 1) - 1; j > i; j--)
{
if (pukes[j].index > pukes[j - 1].index)
swap_pukes(pukes, j, j - 1);
}
}
}
if (N * n < 54 * (n - 2))
{
for (int i = N * n; i < 54 * (n - 2) - 1; i++)
{
for (int j = 54 * (n - 2) - 1; j > i; j--)
{
if (pukes[j].index > pukes[j - 1].index)
swap_pukes(pukes, j, j - 1);
}
}
}
}
void print_pukes(Puke pukes[], int size, int N, int n)
{
for (int i = 0; i < n; i++)
{
printf("玩家%d:", i + 1);
for (int j = i * N; j < (i + 1) * N; j++)
printf("%s%s ", pukes[j].color, pukes[j].value);
printf("\n");
}
if (N * n < size)
{
printf("地主 :");
for (int i = N * n; i < 54 * (n - 2); i++)
printf("%s%s ", pukes[i].color, pukes[i].value);
}
}
C语言实现 扑克牌 (4种玩法) 洗牌,发牌,整理牌
最新推荐文章于 2024-03-26 21:15:07 发布