/*洗盘程序*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#define CARD_NUMBER 14
typedef struct
{
char play_name[20];
unsigned char card[CARD_NUMBER]; // 每个人的牌数
} PlayAttribute;
void shuffle(PlayAttribute *play1, PlayAttribute *play2, PlayAttribute *play3)
{
int i;
char card_flag[54] = {0}; // 牌的标志,为1表示此牌已使用
unsigned char card1, card2, card3;
for(i = 0; i < CARD_NUMBER; i++)
{
do
{
card1 = rand() % 54; // 生成0~53之间的数字
} while(card_flag[card1] == 1); // 此牌已使用,重新生成
do
{
card2 = rand() % 54; // 生成0~53之间的数字
} while((card_flag[card2] == 1) || (card2 == card1)); // 此牌已使用,重新生成
do
{
card3 = rand() % 54; // 生成0~53之间的数字
} while((card_flag[card3] == 1) || (card3 == card2) || (card3 == card1)); // 此牌已使用,重新生成
// 以下3张牌已使用,进行标记
card_flag[card1] = 1;
card_flag[card2] = 1;
card_flag[card3] = 1;
play1->card[i] = card1;
play2->card[i] = card2;
play3->card[i] = card3;
}
}
wchar_t *get_card(unsigned char card) // 返回数字对应的字符串
{
static wchar_t table[4][4] = {L"方 ", L"梅 ", L"红 ", L"黑 "};
if((card >= 0) && (card < 13))
{
switch((card % 13) + 1)
{
case 11:
swprintf(table[0] + 1, 4, L"%c", L'J');
return table[0];
case 12:
swprintf(table[0] + 1, 4, L"%c", L'Q');
return table[0];
case 13:
swprintf(table[0] + 1, 4, L"%c", L'K');
return table[0];
case 1:
swprintf(table[0] + 1, 4, L"%c", L'A');
return table[0];
}
swprintf(table[0] + 1, 4, L"%d", (card % 13) + 1);
return table[0];
}
else if((card >= 13) && (card < 2 * 13))
{
switch((card % 13) + 1)
{
case 11:
swprintf(table[1] + 1, 4, L"%c", L'J');
return table[1];
case 12:
swprintf(table[1] + 1, 4, L"%c", L'Q');
return table[1];
case 13:
swprintf(table[1] + 1, 4, L"%c", L'K');
return table[1];
case 1:
swprintf(table[1] + 1, 4, L"%c", L'A');
return table[1];
}
swprintf(table[1] + 1, 4, L"%d", (card % 13) + 1);
return table[1];
}
else if((card >= 2 * 13) && (card < 3 * 13))
{
switch((card % 13) + 1)
{
case 11:
swprintf(table[2] + 1, 4, L"%c", L'J');
return table[2];
case 12:
swprintf(table[2] + 1, 4, L"%c", L'Q');
return table[2];
case 13:
swprintf(table[2] + 1, 4, L"%c", L'K');
return table[2];
case 1:
swprintf(table[2] + 1, 4, L"%c", L'A');
return table[2];
}
swprintf(table[2] + 1, 4, L"%d", (card % 13) + 1);
return table[2];
}
else if((card >= 3 * 13) && (card < 4 * 13))
{
switch((card % 13) + 1)
{
case 11:
swprintf(table[3] + 1, 4, L"%c", L'J');
return table[3];
case 12:
swprintf(table[3] + 1, 4, L"%c", L'Q');
return table[3];
case 13:
swprintf(table[3] + 1, 4, L"%c", L'K');
return table[3];
case 1:
swprintf(table[3] + 1, 4, L"%c", L'A');
return table[3];
}
swprintf(table[3] + 1, 4, L"%d", (card % 13) + 1);
return table[3];
}
else // 大王和小王
{
if(card == 52)
{
return L"大王";
}
else
{
return L"小王";
}
}
}
int main(void)
{
int i;
char replay;
PlayAttribute play1, play2, play3;
setlocale(LC_ALL, "chs");
srand((unsigned int)time(NULL));
printf("请输入1号玩家的名字:");
scanf("%s", play1.play_name);
printf("请输入2号玩家的名字:");
scanf("%s", play2.play_name);
printf("请输入3号玩家的名字:");
scanf("%s", play3.play_name);
printf("方=方角,梅=梅花,红=红桃,黑=黑桃\n");
do
{
shuffle(&play1, &play2, &play3); // 洗牌
printf("%s手上的牌是:", play1.play_name);
for(i = 0; i < CARD_NUMBER; i++)
{
wprintf(L"%ls ", get_card(play1.card[i]));
}
putchar('\n');
printf("%s手上的牌是:", play2.play_name);
for(i = 0; i < CARD_NUMBER; i++)
{
wprintf(L"%ls ", get_card(play2.card[i]));
}
putchar('\n');
printf("%s手上的牌是:", play3.play_name);
for(i = 0; i < CARD_NUMBER; i++)
{
wprintf(L"%ls ", get_card(play3.card[i]));
}
putchar('\n');
printf("重新洗牌(Y/N)?");
getchar();
scanf("%c", &replay);
} while((replay == 'Y') || (replay == 'y'));
return 0;
}