第十一章 指针进阶之随机发牌)
【例11-6】随机发牌。一副纸牌有52张,4种花色,每种花色13张。用程序模拟随机发牌过程,将52张牌按轮转的方式发放给4人,并输出发牌结果。#includestdio.h #includestdlib.h #includetime.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(i0;i52;i){ if(i%130){ printf(\nplayer:%d\n,i/131); } 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(i0;i52;i){ while(1){ mrand()%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].suitm/13; //借助牌号确定花色和点数 wdeck[t].facem%13; } }输出结果player:1方块10 红心4 梅花2 黑桃J 梅花6 梅花7 红心J 方块7 黑桃8 黑桃9 黑桃10 方块Q 黑桃4player:2红心7 梅花5 黑桃6 黑桃Q 红心6 黑桃3 方块8 红心10 梅花Q 红心3 梅花10 红心2 方块2player:3黑桃K 梅花K 梅花9 黑桃5 红心8 梅花3 方块4 方块9 梅花J 梅花8 方块A 红心5 红心Kplayer:4梅花A 方块5 方块6 红心9 方块K 红心Q 黑桃2 方块3 梅花4 黑桃7 红心A 方块J 黑桃A