C++实现洗牌发牌排序功能的示例代码
在内存中模拟出一副牌,然后模拟洗牌,发牌等动作。
流程是这样的:构建一副牌保存到一个数组中—洗牌—创建玩家—向玩家发牌–输出每个玩家的牌。
#include#include #include //定义扑克的花色 enumSuit{ heart, spade, diamond, club, joker1, joker2 }; //一副牌的数量 #defineCARD_COUNT54 //定义扑克 typedefstructCard{ intvalue;//牌的点数从1开始 enumSuitsuit;//花色 }Card; //定义玩家 typedefstructPlayer{ charname[64];//玩家的名字 Card**cards;//玩家分到的牌。每项是一个指针,指向原始一副牌数组中的一项,这样可以节省空间 intcardsCount;//玩家分到的牌的数量 }Player; //分牌完成后调用的函数的类型 typedefint(*COMPARE)(Card*,Card*); //函数声明们 char*getCardName(constCard*); Card**shuffle(constCard*); voiddispatchCards(Player**,int,constCard**); voidsort(Card**,int,COMPARE); intcompare1(Card*,Card*); intcompare2(Card*,Card*); voidinitOnePack(); //原始一副牌所在的数组 Cardpokers[CARD_COUNT]; //入口函数 intmain(void) { //初始化一副牌 initOnePack(); //洗牌,shuffledPokers保存洗后的牌们 Card**shuffledPokers=shuffle(pokers); //构建三个玩家 Playerplayer1; strcpy(player1.name,"隔壁老王"); player1.cards=NULL; player1.cardsCount=0; Playerplayer2; strcpy(player2.name,"小明"); player2.cards=NULL; player2.cardsCount=0; Playerplayer3; strcpy(player3.name,"田中龟孙"); player3.cards=NULL; player3.cardsCount=0; //把三放到一个数组中,以传入发牌函数中 Player*players[]={&player1,&player2,&player3}; //发牌 dispatchCards(players,sizeof(players)/sizeof(Player*),shuffledPokers); //洗后的牌用完了,释放之 free(shuffledPokers); inti; //打印出每个玩家手中的牌 for(i=0;i name); //需要对玩家手中的牌排序 sort(players[i]->cards,players[i]->cardsCount,compare1); //打印玩家手中所有的牌 intj; for(j=0;j cardsCount;j++){ char*name=getCardName(players[i]->cards[j]); printf("%s",name); free(name); } //每个玩家都需要换一次行 printf("\n"); } //释放玩家手中牌的数组 for(i=0;i cards); } return0; } //构造一副牌 voidinitOnePack(){ inti=0; //前52张 for(;i cards=cards; } //轮流向每个玩家发牌 for(i=0;i cards[curPlayer->cardsCount]=shuffledCards[i]; //玩家手中实际的牌数增加 curPlayer->cardsCount++; } } //排序函数 //cards是要排序的牌,每一项是牌的指针 //cardsCount是牌的数量 //compare_func是比较函数 voidsort(Card**cards,intcardsCount,COMPAREcompare_func){ inti; for(i=0;i value>b->value){ return1; }elseif(a->value value){ return0; }else{ if(a->suit>b->suit) return1; else return0; } } //比较函数,先比较点数再比较花色 intcompare2(Card*a,Card*b){ if(a->value>b->value){ return0; }elseif(a->value value){ return1; }else{ if(a->suit>b->suit) return0; else return1; } } //获取牌的名字 //返回牌的名字字符串,调用者用完后需要free()之。 char*getCardName(constCard*card){ //存放花色名字 charsuitStr[16]={0};//0=='\0' switch(card->suit){ caseheart: strcpy(suitStr,"红桃"); break; casespade: strcpy(suitStr,"黑桃"); break; casediamond: strcpy(suitStr,"方块"); break; caseclub: strcpy(suitStr,"梅花"); break; } //存放点数名字 charvalueStr[16]; switch(card->value){ case1: strcpy(valueStr,"A"); break; case11: strcpy(valueStr,"J"); break; case12: strcpy(valueStr,"Q"); break; case13: strcpy(valueStr,"K"); break; case14: strcpy(valueStr,"小王"); break; case15: strcpy(valueStr,"大王"); break; default: sprintf(valueStr,"%d",card->value); break; } //动态分配足够的空间 char*ret=malloc(16); //将两个名字合并到ret中 sprintf(ret,"%s%s",suitStr,valueStr); returnret; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。