【例11-6】随机发牌。一副纸牌有52张,4种花色,每种花色13张。用程序模拟随机发牌过程,将52张牌按轮转的方式发放给4人,并输出发牌结果。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct card{
int suit;
int face;
};
int deal(struct card *wdeck);
int main(){
const char *suit[4]={"红心","方块","梅花","黑桃"};
const char *face[13]={"A","K","Q","J","10","9","8","7","6","5","4","3","2"};
struct card deck[52];
int i;
deal(deck);
for(i=0;i<52;i++){
if(i%13==0){
printf("\nplayer:%d\n",i/13+1);
}
printf("%s%s ",suit[deck[i].suit],face[deck[i].face]);
}
return 0;
}
int deal(struct card *wdeck){ //用于生成打乱顺序的牌 ,相当于创建完整牌组+洗牌
static int temp[52]={0}; //规定:0代表未被发出,1代表已发出;意味着使生成的随机数不重复
srand(time(NULL));
int i,t,m;
for(i=0;i<52;i++){
while(1){
m=rand()%52; //随机发出的牌号
if(temp[m]==0)break;//如果之前没发过这张牌号,则跳出循环确定该号牌的花色和点数;否则重新生成牌号
}
temp[m]=1;
t=(i%4)*13+(i/4); //轮流发牌,0~12为1号牌主,13~25为2号牌主,26~38为3号牌主,39~51为4号牌主
wdeck[t].suit=m/13; //借助牌号确定花色和点数
wdeck[t].face=m%13;
}
}
输出结果:
player:1
方块10 红心4 梅花2 黑桃J 梅花6 梅花7 红心J 方块7 黑桃8 黑桃9 黑桃10 方块Q 黑桃4
player:2
红心7 梅花5 黑桃6 黑桃Q 红心6 黑桃3 方块8 红心10 梅花Q 红心3 梅花10 红心2 方块2
player:3
黑桃K 梅花K 梅花9 黑桃5 红心8 梅花3 方块4 方块9 梅花J 梅花8 方块A 红心5 红心K
player:4
梅花A 方块5 方块6 红心9 方块K 红心Q 黑桃2 方块3 梅花4 黑桃7 红心A 方块J 黑桃A