文档详情

数据结构扑克牌发牌问题

夏**
实名认证
店铺
DOC
71KB
约8页
文档ID:388596541
数据结构扑克牌发牌问题_第1页
1/8

数据结构上机作业 内容:问题重述:设计一个四个人玩的纸牌游戏的程序,一共有五十四张牌,要发给四个人,并且每次发出的牌都不一样并且符合纸牌的规则(可以是桥牌、升级、红四、斗地主等,但是必须说明规则)并且程序能按照设定的游戏规则从小到大进行排序,如果有底牌的话要说明底牌的情况最后要验证每次发牌是否合法该程序纸牌的玩法:在一副牌中,去除大小王,然后2最大其次是A,然后按顺序从大到小一次减小所用到的具体算法:冒泡法, 线性表删除元素操作;具体做法为:先将一副扑克牌中的大小王拿掉,还会剩下52张牌,在进行随机的洗牌,将所有的排顺序打乱,然后在打乱后一定的顺序情况下,按照规则平均分发给四个人,每人会得到十三张牌,最后将每人手里的牌按照3、4、5、6、7、8、9、10、J、Q、K、A、2的顺序进行排列,在排列过程中会出现花色的前后顺序排列再将四个人手里的拍验证,检验是否每张牌是否都出现并且只出现一次如果出现并且只出现一次,说明程序成功,否则程序失败,则需要重新进行程序的检验,修改流程图大致情况:设计的结构体变量说明:char CardColor是存储花色的变量 char CardNumber[2]是存储扑克牌的面值变量 int flag;//判断标志struct pukepai Card[52]用char类型存储52张扑克牌int card[52]用int类型形式并且,我们在一开始定义每张牌的变量每张牌现在我们给予赋值,例如108代表方块8,212代表红桃Q,其中三位数中第一为代表花色:1代表方块,2代表红桃,3代表梅花,4代表黑桃。

01代表A,02代表2,依次类推,11代表J,12代表Q,13代表K具体的函数说明均在程序中标注,不再重复说明程序执行结果为:1. 2. 3. 结论:通过以上多次程序运行,满足了多次结果不相同,并保证每次都会有所有的排出现且仅出现一次遇到的问题 :对一些代码的含义不太清楚,用起来不太熟练解决方法是,通过学习书上的知识,了解代码含义,多训练慢慢熟练附录 运行程序为:#include#include#include#include//**********************************************************//这是一个模仿五十K的发牌游戏//定义一个结构体,然后定义一个该结构体的数组Card[52](大写的),存储扑克牌(这个存储的是字符串)//定义一个int类型的card[52](小写的),来表示扑克牌,比如105,1代表花色(方块),05代表面值5//再比如313,就是梅花K,401就是黑桃A (ASCII表中3,4,5,6分别表示红桃,方块,梅花,黑桃。

将他们减去2就代表百位的数值)//再说一下排序,就是设置一个标志位,标识牌的面值的大小3->0 , 4->1 , 5->2 ,......, J->8 , Q->9 , K->10 , A->11 , 2->12//然后就是card[52]排序,再转换一下到结构体数组Card[52]就行了.//**********************************************************//定义结构体,存储扑克牌struct pukepai{ char CardColor;//存储花色 char CardNumber[2];//存储扑克牌的面值 int flag;//判断标志,如果按照card[52]排序,那么牌由小到大就是:A,2,3,4,5,6,7,8,9,10,J,Q,K //而我们需要由小到大排序是:3,4,5,6,7,8,9,10,J,Q,K,A,2};struct pukepai Card[52];//用char类型存储52张扑克牌int card[52];//用int类型形式//*************************************************//洗牌函数:将牌打乱void xipai(){ int i,j,k,temp; srand(time(0)); for( i=0;i<4;i++) for(j=0;j<13;j++) card[i*13+j]=(i+1)*100+j+1; //printf("how many times for card:"); //scanf("%d",&count); //for(j=1;j<=count;j++) //洗牌 for(i=0;i<52;i++) { k=rand()%(51-i+1)+i; temp=card[i]; card[i]=card[k]; card[k]=temp; } printf("\n");}//*************************************************//转换函数:card[52]->Card[52],将牌的存储由int类型转换为char类型void zhuanhuan(){ int i,temp; //将数字转换为牌 for(i=0;i<52;i++) { Card[i].CardColor=card[i]/100+2; temp=card[i]%100; if(temp==1) { Card[i].CardNumber[0]='A'; Card[i].CardNumber[1]='\0'; continue; } if(temp==10) { Card[i].CardNumber[0]='1'; Card[i].CardNumber[1]='0'; continue; } if(temp==11) { Card[i].CardNumber[0]='J'; Card[i].CardNumber[1]='\0'; continue; } if(temp==12) { Card[i].CardNumber[0]='Q'; Card[i].CardNumber[1]='\0'; continue; } if(temp==13) { Card[i].CardNumber[0]='K'; Card[i].CardNumber[1]='\0'; continue; } Card[i].CardNumber[0]=temp+48; Card[i].CardNumber[1]='\0'; } //设置标志位,用来判断牌的面值大小 for(i=0;i<52;i++) { Card[i].CardColor=card[i]/100+2; temp=card[i]%100; //一律将面值减3作为标志位 Card[i].flag=temp-3; //如果是A或者是2,那么标志加上13 if(temp==1||temp==2) Card[i].flag+=13; } }//*************************************************//排序:对char[52]进行排序(不管花色,只看牌的面值)void paixu(){ int i,j,k; struct pukepai temp; for(i=0;i<4;i++) { for(j=0;j<13;j++) for(k=0;k<12;k++) { //不管花色,只看牌的面值,所以要对100求余,然后再比较 if(Card[i*13+k].flag>Card[i*13+k+1].flag) { temp=Card[i*13+k]; Card[i*13+k]=Card[i*13+k+1]; Card[i*13+k+1]=temp; } } }}//输出函数:输出四个玩家的扑克牌void output(){ int i; for(i=0;i<52;i++) { if(i%13==0) printf("第%d个玩家的牌为:",i/13+1); printf("%c%c%c ",Card[i].CardColor,Card[i].CardNumber[0],Card[i].CardNumber[1]); if(i%13==12) printf("\n"); } printf("\n");}//验证函数:验证是否有重复的牌void yanzheng(){ int flag=0; int i,j; for(i=0;i<52;i++) for(j=0;j<52;j++) { if(i!=j) { //如果有重复的牌,那么就让flag=1 if(card[i]==card[j]) { flag=1; } } } if(flag==0) printf("没有重复的牌!\n\n"); if(flag==1) printf("有重复的牌!\n\n");}void main(){ xipai();//洗牌 zhuanhuan();//转换 paixu();//排序 yanzheng();//验证 output();//输出- 8 -。

下载提示
相似文档
正为您匹配相似的精品文档