随机发牌
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++)