#include
#include
#include
#define SUIT 52
#define HALF 26
#define COLOR ((char)13)
// 撲克牌的編碼是壹組13進制的數據,從0編到51
// 函數tell用於解釋編碼的內容
int tell(char card, char * description)
{
char i=0, j=0;
char *suit[]={"Spades","Hearts","Clubs","Diamonds"};
char *face[] = {"A","2","3","4","5","6","7","8","9",
"10","Jack","Queen","King"};
//題幹比較奇怪,要求扣8張底牌,但是含大小王。正確的規則應該是不含大小王的情況下扣8張牌,每人11張牌就對了
//否則應該扣10張牌或者6張牌,否則每人發牌得到的牌數不相同(不是4的倍數)
//如需要,可自行定義JB=52,JA=53,SUIT=54,HALF=27即可。
//if (card > JB || card < 0 || !description) return 0;
//if (card == JB) { sprintf(description, "Big Joker"); return 1; }
//if (card == JA) { sprintf(description, "Little Joker"); return 1; }
i = card / COLOR; j = card % COLOR;
sprintf(description, "%s %s", suit[i], face[j]);
return 1;
}
//初始化牌,形成壹個順序牌
int init(char *poker)
{
char i = 0;
if (!poker) return 0;
for (i=0; i<SUIT; i++) poker[i]=i;
srand((unsigned)time(0));
return 1;
}
//洗牌,將當前牌分成上下兩組,然後交叉,有右手先和左手先兩種可能,這壹個是左手先交換法
int wash_left_hand(char *poker)
{
char i=0, j=0, k=0;
char boker[SUIT];
if(!poker) return 0;
for(i=0; i<HALF; i++) {
j = i * 2; //上半組
boker[j] = poker[i];
k = i + HALF; //下半組
boker[j+1]=poker[k];
}//next i
memcpy(poker, boker, SUIT);
return 1;
}
//洗牌,將當前牌分成上下兩組,然後交叉,有右手先和左手先兩種可能,這壹個是右手先交換法
//註意左右手先後順序的區別在於變量j的奇偶變化
int wash_right_hand(char *poker)
{
char i=0, j=0, k=0;
char boker[SUIT];
if(!poker) return 0;
for(i=0; i<HALF; i++) {
j = i * 2; //上半組
boker[j+1] = poker[i];
k = i + HALF; //下半組
boker[j]=poker[k];
}//next i
memcpy(poker, boker, SUIT);
return 1;
}
//在當前牌的基礎上洗壹次牌,主要用隨機函數的奇偶性確定用左手洗還是右手洗
int wash_once(char *poker)
{
return rand()%2?wash_left_hand(poker):wash_right_hand(poker);
}
//在當前牌的基礎上隨機洗若幹次牌,至少8次,最多18次
int wash_full(char *poker)
{
int i = 0, j = 0, k = 0;
i = rand() % 10 + 8;
printf("\nTry to wash %d times.\n", i);
for (j=0; j < i ; j++) k+=wash_once(poker);
return k;
}
int main(void)
{
char choice = 0, i = 0, j = 0; char poker[SUIT], card[16];
init(poker);
do {
printf("\n\tWelcome to My Poker Game!\n");
printf("\t0-Wash.\n");
printf("\t1-Show A.\n");
printf("\t2-Show B.\n");
printf("\t3-Show C.\n");
printf("\t4-Show D.\n");
printf("\tany other number-quit.\n");
printf("Your Choice?");
scanf("%d", &choice);
if(choice 4) break;
if(choice ==0) {
wash_full(poker);
continue;
}//end if
i = (choice - 1) * 11; //註意用11張牌,扣8張底牌
printf("His card is...\n");
for(j = i; j<i+11; j++) {
tell(poker[j], card);
printf("%s\t", card);
}//next
printf("\n");
}while(1);
return 0;
}