//
前言:虽然用的是cpp,但下文写的代码本质上是c语言。
#include<stdio.h>
#include<stdlib.h>//用于调用rand函数和srand函数
#include<time.h>//用系统时间设定随机数
struct card{
int suit;
int face;
//
可以看到这里的suit和face都是整型变量而不是char型
//花色有四个,面值有十三个,这是suit和face数字化的前提
//之后可以通过数学运算,通过随机数确定每个牌的suit和face的值是多少
//然后用这个值作为新数组char *suit和char *face的项,就能得到对应牌号的花色和面值
};//用结构体定义card的所包含的两个元素suit和face
void deal(struct card *wdeck){//引用deal函数发牌
int i,m,t;//i是循环变量,m用于选取随机数,然后i给t定调,保证t遍历0~51(合计52张牌,也就是除去大小王)
int temp[52]={0};//0和1判断未发牌和发牌
srand(time(NULL));//随机数的初始化,如果只写rand会导致每次随机生成的结果不变
for(i=0;i<52;i++){
while(1){//如果temp[m]不是0就一直循环
m=rand()%52;
if(temp[m]==0){
break;
}
}
temp[m]=1;
t=(i%4)*13+(i/4);//
这样做模拟了整个发牌流程,i%4保证是依次发牌,*13保证了每个人是13张牌,i/4表示每个人都得到一张牌后,进入下一个周期
//部分流程示意:i=0时,t=0*13+0,此时给1号玩家发牌;i=1时,t=13+0,此时给2号玩家发牌;i=2时,t=26+0,此时给3号玩家发牌;i=3时,t=39+0,此时给4号玩家发牌;i=4时,t=0*13+1,此时给1号玩家发牌,加法前一部分定了发牌顺序,牌主所得牌的牌号范围,后一部分则保证了经历过一遍循环之后牌号就往前挪一次。
//照这种分法,1号玩家的牌号就是0~12,2号玩家的牌号就是13~25,以此类推。
wdeck[t].suit=m/13;//m/13只有四种可能,随机确定花色
wdeck[t].face=m%13;//m%13只有十三种可能,随机确定面值
}
}
int main(void){
struct card deck[52];
const char *suit[]={"Heart","Diamond","Club","Spade"};//定义char型的指针数组,
//方便使用%s直接打印
const char *face[]={"A","K","Q","J","2","3","4","5","6","7","8","9","10"};
//道理同上
deal(deck); //引用deal函数发牌
for(int i=0;i<52;i++){
if(i%13==0){
//一个玩家需要循环13次,从0~12为第一位玩家,所以以0,13,26,39作为玩家标记
printf("Player %d\n",i/13+1);
//加1让结果向后偏移一位,正好能指向当前被发牌的玩家
}
printf("%s ",face[deck[i].face]);
//回看结构体中suit和face的定义,再去看主函数中的suit和face的定义
//就能理解为什么这里是face[deck[i].face]了
//我简单解释一下,内层i确定了内层face的值是多少
//然后用这个值作为外层face的项数,就能确定face是多少了,suit同理。
printf("%s\n",suit[deck[i].suit]);
}
return 0;
}感谢您的收看,如果您有其他见解(如算法优化),不妨留言讨论吧!![$[阿鲁表情]::(害羞)](/usr/themes/joe-master/assets/images/owo/aru/E5AEB3E7BE9E_2x.png)
前言:虽然用的是cpp,但下文写的代码本质上是c语言。
#include<stdio.h>
#include<stdlib.h>//用于调用rand函数和srand函数
#include<time.h>//用系统时间设定随机数
struct card{
int suit;
int face;
//
可以看到这里的suit和face都是整型变量而不是char型
//花色有四个,面值有十三个,这是suit和face数字化的前提
//之后可以通过数学运算,通过随机数确定每个牌的suit和face的值是多少
//然后用这个值作为新数组char *suit和char *face的项,就能得到对应牌号的花色和面值
};//用结构体定义card的所包含的两个元素suit和face
void deal(struct card *wdeck){//引用deal函数发牌
int i,m,t;//i是循环变量,m用于选取随机数,然后i给t定调,保证t遍历0~51(合计52张牌,也就是除去大小王)
int temp[52]={0};//0和1判断未发牌和发牌
srand(time(NULL));//随机数的初始化,如果只写rand会导致每次随机生成的结果不变
for(i=0;i<52;i++){
while(1){//如果temp[m]不是0就一直循环
m=rand()%52;
if(temp[m]==0){
break;
}
}
temp[m]=1;
t=(i%4)*13+(i/4);//
这样做模拟了整个发牌流程,i%4保证是依次发牌,*13保证了每个人是13张牌,i/4表示每个人都得到一张牌后,进入下一个周期
//部分流程示意:i=0时,t=0*13+0,此时给1号玩家发牌;i=1时,t=13+0,此时给2号玩家发牌;i=2时,t=26+0,此时给3号玩家发牌;i=3时,t=39+0,此时给4号玩家发牌;i=4时,t=0*13+1,此时给1号玩家发牌,加法前一部分定了发牌顺序,牌主所得牌的牌号范围,后一部分则保证了经历过一遍循环之后牌号就往前挪一次。
//照这种分法,1号玩家的牌号就是0~12,2号玩家的牌号就是13~25,以此类推。
wdeck[t].suit=m/13;//m/13只有四种可能,随机确定花色
wdeck[t].face=m%13;//m%13只有十三种可能,随机确定面值
}
}
int main(void){
struct card deck[52];
const char *suit[]={"Heart","Diamond","Club","Spade"};//定义char型的指针数组,
//方便使用%s直接打印
const char *face[]={"A","K","Q","J","2","3","4","5","6","7","8","9","10"};
//道理同上
deal(deck); //引用deal函数发牌
for(int i=0;i<52;i++){
if(i%13==0){
//一个玩家需要循环13次,从0~12为第一位玩家,所以以0,13,26,39作为玩家标记
printf("Player %d\n",i/13+1);
//加1让结果向后偏移一位,正好能指向当前被发牌的玩家
}
printf("%s ",face[deck[i].face]);
//回看结构体中suit和face的定义,再去看主函数中的suit和face的定义
//就能理解为什么这里是face[deck[i].face]了
//我简单解释一下,内层i确定了内层face的值是多少
//然后用这个值作为外层face的项数,就能确定face是多少了,suit同理。
printf("%s\n",suit[deck[i].suit]);
}
return 0;
}