您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > C语言实现斗地主发牌程序
实验四、斗地主发牌程序的实现一、实验目的1.了解线性表的顺序存储与基本操作;2.了解线性表的链接存储与基本操作;二、实验工具VC6.0三、实验练习和要求3.1实验内容:1)考虑好纸牌的存储结构,定义好纸牌大小的比较规则;2)分别建立顺序线性表和链接线性表,可以进行定位删除,可以进行保序插入,可以进行顺序输出……;3)利用上述线性表类,构造若干个线性表的实例,构造一个含有全部纸牌的线性表,从中随机抽取……随机发给三家(每家17张),并保留底牌3张;4)按大小顺序分别输出各家的牌和底牌。3.2实验要求:1)利用♣♦♥♠王显示每家发得的牌和底牌(ASCII:\5\4\3\6);2)每家的牌要求有序排列(数字中3最小,2最大,不同的花色按♣,♦,♥,♠,王渐大处理);3)所发的牌是随机的;4)顺序线性表和链接线性表都要用到。3.3实验难点:1)如何存储一张牌;2)如何比较牌的大小(345678910JQKA2);3)如何实现顺序表与链接表的无差别性?3.4实现提示1)54张牌可以用整数:0--53来表示,也可以用两个独立的整数来表示;2)用利用C语言的RAND()函数来产生随机数;3)牌的大小比较规则,除王比较大外,一般的牌先比较点儿数,再比较花色;4)建议用保序插入,而不要使用最后排序。3.5注意事项1)顺序表和链接表的操作接口要尽量一致;2)345678910JQKA2中的10占两位?3)大王与小王的特殊处理。3.6本次实验可以三人构成学习小组,上交一份作业,并给出每一个人贡献分数。四、实验内容本次实验分别使用顺序表和单链表实现,三人手中的牌都已经按照大小以及花色从小到大排序。代码如下:顺序表实现随机发牌#includestdio.h#includemalloc.h#includetime.h#includestdlib.h#defineMaxSize100typedefintdataType;typedefstruct{dataTypedata[MaxSize];intsize;}SqList;SqList*CreateList(dataTypea[],intn){SqList*t=(SqList*)malloc(sizeof(SqList));for(inti=0;in;i++)t-data[i]=a[i];t-size=n;returnt;}SqList*CreateListemp(){SqList*t=(SqList*)malloc(sizeof(SqList));t-size=0;returnt;}voidExchange(SqList*l,inti,intj){inttemp;temp=l-data[i];l-data[i]=l-data[j];l-data[j]=temp;}intMin(SqList*l){intmin=l-data[0];for(inti=1;il-size;i++){if(l-data[i]min)min=l-data[i];}returnmin;}voidDelete(SqList*l,intk){if(k1||kl-size)exit(1);for(inti=k;il-size;i++)l-data[i-1]=l-data[i];l-size--;}intLocate(SqList*l,dataTypex){for(inti=0;il-size;i++)if(l-data[i]==x)returni+1;return0;}voidPrint(SqList*l){for(inti=0;il-size;i++)printf(%d,l-data[i]);}SqList*Sort(SqList*pa){SqList*pb=CreateListemp();intM;for(inti=0;i17;i++){M=Min(pa);pb-data[i]=M;Delete(pa,Locate(pa,M));pb-size++;}returnpb;}intmain(){inta[54],i,j,N;intone[17];inttwo[17];intthree[17];intcover[3];char*poker[]={梅花3,方块3,红桃3,黑桃3,梅花4,方块4,红桃4,黑桃4,梅花5,方块5,红桃5,黑桃5,梅花6,方块6,红桃6,黑桃6,梅花7,方块7,红桃7,黑桃7,梅花8,方块8,红桃8,黑桃8,梅花9,方块9,红桃9,黑桃9,梅花10,方块10,红桃10,黑桃10,梅花J,方块J,红桃J,黑桃J,梅花Q,方块Q,红桃Q,黑桃Q,梅花K,方块K,红桃K,黑桃K,梅花A,方块A,红桃A,黑桃A,梅花2,方块2,红桃2,黑桃2,小王,大王};printf(顺序表实现:3个人,每人随机发17张牌,留3张底牌。\n\n);for(i=0,j=1;i54;i++){a[i]=j;j++;}SqList*pl=CreateList(a,54);srand((unsigned)time(0));for(N=0;NMaxSize;N++){i=rand()%54;j=rand()%54;Exchange(pl,i,j);}for(i=0,j=0;j17;j++,i++){one[i]=pl-data[j];}for(i=0,j=17;j34;j++,i++){two[i]=pl-data[j];}for(i=0,j=34;j51;j++,i++){three[i]=pl-data[j];}for(i=0,j=51;j54;j++,i++){cover[i]=pl-data[j];}SqList*first=CreateList(one,17);SqList*second=CreateList(two,17);SqList*third=CreateList(three,17);SqList*left=CreateList(cover,3);printf(--------------------------------\n);printf(按照大小以及花色排序后的结果\n);printf(--------------------------------\n);SqList*sortedfirst=Sort(first);SqList*sortedsecond=Sort(second);SqList*sortedthird=Sort(third);printf(第一个人的牌:);for(i=0;i17;i++){printf(%s,poker[sortedfirst-data[i]-1]);}printf(\n);printf(第二个人的牌:);for(i=0;i17;i++){printf(%s,poker[sortedsecond-data[i]-1]);}printf(\n);printf(第三个人的牌:);for(i=0;i17;i++){printf(%s,poker[sortedthird-data[i]-1]);}printf(\n);printf(底牌:);for(i=0;i3;i++){printf(%s,poker[left-data[i]-1]);}return0;}运行两次结果截图:单链表实现随机发牌#includestdio.h#includemalloc.h#includetime.h#includestdlib.htypedefintElemType;typedefstructnode{ElemTypedata;structnode*next;}slink;slink*creslink(ElemTypea[],intn){slink*head,*p,*s;inti;p=head=(slink*)malloc(sizeof(slink));for(i=1;i=n;i++){s=(slink*)malloc(sizeof(slink));s-data=a[i-1];p-next=s;p=s;}p-next=NULL;returnhead;}slink*creslinkemp(){slink*head,*p;p=head=(slink*)malloc(sizeof(slink));p-next=NULL;returnhead;}intgetelem(slink*head,inti,ElemType*e){slink*p;intj;p=head-next;j=1;while(p!=NULL&&ji){p=p-next;j++;}if(p==NULL)return0;*e=p-data;return1;}intinsert(slink*head,inti,ElemTypex){slink*p,*q;intj;p=head;j=0;while(p!=NULL&&j(i-1)){p=p-next;j++;}if(p==NULL)return0;q=(slink*)malloc(sizeof(slink));q-data=x;q-next=p-next;p-next=q;return1;}intDelete(slink*head,inti){slink*p,*q;intj;if(i1)return0;p=head;j=0;while(p-next!=NULL&&ji-1){p=p-next;j++;}if(p-next==NULL)return0;q=p-next;p-next=q-next;free(q);return1;}voidsort(inta[],intsize){for(inti=0;isize-1;i++){inttmpmin=i;for(intj=i+1;jsize;j++){if(a[j]a[tmpmin])tmpmin=j;}inttmp=a[i];a[i]=a[tmpmin];a[tmpmin]=tmp;}}voidPrint(slink*head,char*a[]){slink*p;p=head-next;while(p!=NULL){printf(%s,a[(p-data)-1]);p=p-next;}printf(\n);}intmain(){inta[54],r,R;intone[17];inttwo[17];intthree[17];intcover[3];printf(单链表实现:3个人,每人随机发17张牌,留3张底牌。\n);for(inti=0,j=1;i54;i++){a[i]=j;j++;}char*poker[]={梅花3,方块3,红桃3,黑桃3,梅花4,方块4,红桃4,黑桃4,梅花5,方块5,红桃5,黑桃5,梅花6,方块6,红桃6,黑桃6,梅花7,方块7,红桃7,黑桃7,梅花8,方块8,红桃8,黑桃8,梅花9,方块9,红桃9,黑桃9,梅花10,方块10,红桃10,黑桃10,梅花J,方块J,红桃J,黑桃J,梅花Q,方块Q,红桃Q,黑桃Q,梅花K,方块K,红桃K,黑桃K,梅花A,方块A,红桃A,黑桃A,梅花2,方块2,红桃2,黑桃2,小王,大王};slink*paNum=creslink(a,54);slink*pbNum=creslinkemp();for(intx=1,n=54;x=54;x++,n--){srand((unsigned)time(0));r=(rand()%n)+1;getelem(paNum,r,&R);insert(pbNum,x,R);Delete(paNum,r);}printf(\n);slink*pone=pbNum-next;for(inti=0;i17;i++){one[i]=pone-data;pone=pone-next;}slink*ptwo=pbNum-next;for(inti=0;i17;i++){
三七文档所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
本文标题:C语言实现斗地主发牌程序
链接地址:https://www.777doc.com/doc-4457975 .html