随机发牌

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一副扑克牌,不包含大小王,有红桃(hearts)、黑桃(spades)、方片(diamonds)、梅花(clubs)四种花色,每种花色有A、2、3、4、5、6、7、8、9、10、J、Q、K十三张牌。编写程序将一副牌随机发给4个玩家,对玩家手中的牌按花色和点数进行排序后显示发牌结果。

作业分析:

给定了4种花色,每种花色有13张牌,共52张牌,因为这52张牌都是不一样的,而且都只有一张,那么我们就可以将每张牌都看成一个数字1-13代表红桃的A-K,剩下的三种花色也一样分别用14-26,27-39,40-52;

这样的好处是,我们可以用一个数组cards[]来包含这些牌,而不用考虑它们的花色,等到输出的时候在判断是属于哪个花色即可。

因为我们是使用随机发牌,也就是利用随机数,那么,我们就要保证不能产生同样的随机数;

那么每次发出一张牌就要给这张牌标记一下,这样就可以保证在发牌过程中不会发出同样的牌,而且每个玩家正好可以拿到13张牌。

因为要求每个玩家拿到牌后,显示的结果要按牌的花色和点数排序,所以我们可以定义分别定义4个player[]数组或者一个players[][]数组用以记录每个玩家拿到的牌,以便进行排序。

实现方法1:统一发完牌再排序输出,二维数组应用

#include

#include

#include

#include

int cards[55];

int players[5][15];

char types[4] = {'h','s','d','c'};//四种花色

char special_points[5] = {'K','A','J','Q'};//四个特殊点数

void deal()

{

for(int i=1;i<=4;i++)//循环给4个玩家发牌

for(int j=1;j<=13;j++) {

int card = rand() % 52 + 1; //产生1~52的随机数

while(cards[card]) //若此牌已经发出,重新产生一张,直至发到没有使用过的card = rand() % 52 + 1;

cards[card] = 1;//给发出的牌做标记

players[i][j] = card;//将牌交给玩家

}

}

void sort()

{

for(int k=1;k<=4;k++) //循环给4个玩家奖牌排好序

for(int i=1;i<=13;i++)

for(int j=i+1;j<=13;j++)

if(players[k][i]>players[k][j]) {

int temp = players[k][i];

players[k][i] = players[k][j];

players[k][j] = temp;

}

}

void output()

{

for(int i=1;i<=4;i++) {

printf("Player%d: ",i);

for(int j=1;j<=13;j++) {

int type = (players[i][j] - 1) / 13; //判断牌的花色

int point = players[i][j] % 13; //牌的点数

printf("%c",types[type]);

if(point <=1 || point >10) //牌为A,J,Q,K的输出

printf("%c ",special_points[point%9]);

else //一般点数的输出

printf("%d ",point);

}

printf("\n");

}

}

int main()

{

memset(cards,0,sizeof(cards));//将cards数字初设为0,为做标记做准备srand(time(NULL));//时间种子

deal(); //给玩家发牌

sort();//给玩家的牌进行排序

output();//将玩家的牌输出

}

实现方法二:每个玩家单独发牌后排序输出,一维数组循环使用

#include

#include

#include

#include

int cards[55],players[15];

char types[4] = {'h','s','d','c'};//四种花色

char points[13][3] = {"K","A","2","3","4","5","6","7","8","9","10","J","Q"};//点数void deal()

{

for(int i=1;i<=13;i++) {

int card = rand() % 52 + 1; //产生1~52的随机数

while(cards[card]) //若此牌已经发出,重新产生一张,直至发到没有使用过的card = rand() % 52 + 1;

cards[card] = 1;//给发出的牌做标记

players[i] = card;//将牌交给玩家

}

}

void sort()

{

for(int i=1;i<=13;i++)

for(int j=i+1;j<=13;j++)

相关文档
最新文档