在生活中,相信大家都有过玩牌的经历,在如今游戏和网络风靡的年代,各种单机、网游牌深受大家喜爱,为此我也研究下这个方面,现在我就针对其中的一个洗牌发牌环节作出模拟。
实现原理:撇开大小王不要,剩下52张牌,用1~52,代表52张牌,例如,第一张牌为1,一次类推,用一个4行13列的数组Card随机存储这52个数(使用rand()函数产生行和列),然后再此行和列构成的Card数组单员,依次存入1~52,(用for循环是实现))完成洗牌过程,由于是随机寻找行列,可能找到的行列单元中存有数字,则再次寻找。发牌时,如果我们用花色数组,和牌面值数组包装Card的行列下标,然后将之输出,即可得到需要的花色和牌面。大家可以再下面的代码中细细体会,如有错误,望不吝赐教!
贴出代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle(int Card[4][13]);
void deal(int Card[4][13],char*wFace[13],char*wSuit[4]);
void main()
{
int Card[4][13]={0};
char*wSuit[4]={"\x3","\x4","\x5","\x6"};
char*wFace[13]={"one","two","three","four","five","six","seven","eight","nine","ten","jack","quene","king"};
srand(time(NULL));
shuffle(Card);
deal(Card,wFace,wSuit);
}
void shuffle(int Card[4][13])
{
int card,row,column;
for(card=1;card<=52;card++)
{
row=rand()%4;
column=rand()%13;
while(Card[row][column]!=0)//如寻找到的数组单元不为0,则进行再次寻找
{
row=rand()%4;
column=rand()%13;
}
Card[row][column]=card;
}
}
void deal(int Card[4][13],char*wFace[13],char*wSuit[4])
{
int card,row,column;
char c;
for(card=1;card<=52;card++)
for(row=0;row<4;row++)
for(column=0;column<13;column++)
{
if(Card[row][column]==card)
{
if(card%3==0)
{
c='\n';
}
else
{
c='\t';
}
printf("%5s %-8s%c",wSuit[row],wFace[column],c);
}
}
}