您好,欢迎访问三七文档
1#includestdafx.h#includestdlib.h#includetime.htypedefstruct{int*x;//玩家1int*platex;int*figx;intopenx;int*y;//玩家2int*platey;int*figy;intopeny;int*z;//玩家3int*platez;int*figz;intopenz;}list;intbrandcost[11]={0};//存放单张牌的数组intbrandcost1[20]={0};//存放两张相同牌的数组intbrandcost2[20]={0};//存放三张相同牌的数组intbrandcost3[16]={0};//存放四张相同牌的数组intbrandcost4[2]={0};//存放两张王相同的数组intbloom[11]={0};//存放单张牌的花色intbloom1[20]={0};//存放两张相同的花色intbloom2[20]={0};//存放三张相同的花色intbloom3[16]={0};//存放四张相同的花色intbloom4[2]={0};//存放四张相同的花色intmenu()/*菜单功能选择*/{intk;printf(输入1游戏开始,输入0退出游戏\n);scanf_s(%d,&k);switch(k){case0:printf(退出游戏\n);2return0;case1:printf(游戏开始\n);return1;}returnk;}voidinitialize(intbrand[])/*初始化牌*/{inti=0;while(i54){if(i==0||i==1||i==2||i==3)//将数值0-3(扑克牌A)改成数值52-55{brand[i++]=52+i;}elseif(i==4||i==5||i==6||i==7)//将数值4-7(扑克牌2)改成数值56-59{brand[i++]=56+i;}elseif(i==52||i==53)//将数值52-53(扑克牌大小王)改成数值64-65{brand[i++]=12+i;}else{brand[i++]=i;//赋原值}}}voidoutput(intbrand[])/*输出整副牌*/{inti=0;for(;i54;++i){printf(%d,brand[i]);}printf(\n);}3voidoutput1(int*plate,int*fig,intk)/*输出玩家结构数据*/{inti;printf(\n);for(i=0;ik;++i){if(plate[i]1&&plate[i]11){printf(%c%d,fig[i],plate[i]);//输出1--10}else{switch(plate[i]){case11:printf(%c%c,fig[i],74);//输出jbreak;case12:printf(%c%c,fig[i],81);//输出Qbreak;case13:printf(%c%c,fig[i],107);//输出kbreak;case14:printf(%c%c,fig[i],65);//输出Abreak;case16:printf(%c%d,fig[i],2);//输出2break;case17:printf(%c,1);//输出小王break;case18:printf(%c,2);//输出大王break;}4}}}voidoutput2(list*enjoy)/*调用输出三个玩家牌的函数*/{printf(玩家x方的牌是:);output1(enjoy-platex,enjoy-figx,enjoy-openx);//调用玩家x的数据printf(\n);printf(电脑玩家y方的牌是:);output1(enjoy-platey,enjoy-figy,enjoy-openy);//调用电脑玩家y的数据printf(\n);printf(电脑玩家z方的牌是:);output1(enjoy-platez,enjoy-figz,enjoy-openz);//调用电脑玩家z的数据printf(\n);}voidoptout(list*enjoy,intj)/*选择输出不多余输出牌的数据*/{printf(j---=%d,j);if(j==0){enjoy-openx=20,enjoy-openy=17,enjoy-openz=17;//玩家x多输出3张}elseif(j==1){enjoy-openx=17,enjoy-openy=20,enjoy-openz=17;//电脑玩家y多输出3张}else{enjoy-openx=17,enjoy-openy=17,enjoy-openz=20;//电脑玩家z多输出3张}output2(enjoy);}voidriffle(intbrand[])/*洗牌*/{inti,j,k=0;intcommute;while(k100)//交换100次{i=rand()%54;//随机分配交换牌的坐标5j=rand()%54;//随机分配交换牌的坐标commute=brand[i];//牌坐标相互交换brand[i]=brand[j];brand[j]=commute;++k;}}voiddeal(intbrand[],list*enjoy)/*发牌*/{inti;for(i=0;i17;++i){enjoy-x[i]=brand[0+i*3];//三人轮流发牌enjoy-y[i]=brand[1+i*3];enjoy-z[i]=brand[2+i*3];}}list*initlist()/*创建玩家结构体*/{list*enjoy;enjoy=(list*)malloc(sizeof(list));enjoy-x=(int*)malloc(sizeof(int)*20);enjoy-figx=(int*)malloc(sizeof(int)*20);enjoy-platex=(int*)malloc(sizeof(int)*20);enjoy-y=(int*)malloc(sizeof(int)*20);enjoy-figy=(int*)malloc(sizeof(int)*20);enjoy-platey=(int*)malloc(sizeof(int)*20);enjoy-z=(int*)malloc(sizeof(int)*20);enjoy-figz=(int*)malloc(sizeof(int)*20);enjoy-platez=(int*)malloc(sizeof(int)*20);returnenjoy;}inttaxis1(int*address,intlow,inthigh)/*快速排序排序*/{intwork;work=address[low];//以第一个元素值为中心点数值while(lowhigh)//低位数值小于高位{while(lowhigh&&address[high]=work)//大于中心点数值{6--high;//高位-1}address[low]=address[high];//小于中心点数值的数赋给低位没用的空位while(lowhigh&&address[low]=work)//小于中心点数值{++low;//低位+1}address[high]=address[low];//大于中心点数值的数赋给高位没用的空位}address[low]=work;//中心点数值填补剩余的一个空位returnlow;//返回中心点坐标}voidtaxis(int*address,intlow,inthigh)/*快速排序递归*/{intwork;if(lowhigh)//最底位坐标数小于最高位{work=taxis1(address,low,high);//排序主体函数调用taxis(address,low,work-1);//左半部分排序taxis(address,work+1,high);//右半部分排序}}voidoutput_x(intx)/*输出x*/{printf(x==%d,x);printf(\n);}voidoutput_y(inty)/*输出y*/{printf(y==%d,y);printf(\n);}voidoutput_z(intz)/*输出z*/{printf(z==%d,z);printf(\n);}intcompare(intx,inty,intz)/*比较三个数的大小*/7{if(xy){if(xz){return0;//返回0代表玩家x叫的数最大}else{return2;//返回2代表玩家z叫的数最大}}else{if(yz){return1;//返回1代表玩家y叫的数最大}else{return2;//返回2代表玩家z叫的数最大}}}intcallcent1(int*x)/*找地主之1电脑玩家最先叫分*/{*x=rand()%4;//随机选取(0)不叫,或者大于玩家x的数值4-x剩余可选数的个数if(*x==3)//如果x等于3x玩家是地主{return0;//返回0代表x玩家是地主}else{return-1;}}intcallcent2(intx,int*y)/*找地主之2电脑玩家随机叫分*/{*y=rand()%(4-x);//随机选取(0)不叫,或者大于玩家x的数值4-x剩余可选数的个数if(*y!=0)//如果玩家x选择了不是0(不叫)的分数{8*y=(*y)+x;//剩余可选个数的随机数加上玩家x所选的分数不会大于3并且不小于x}if(*y==3)//如果y等于3y玩家是地主{return1;//返回1代表y玩家是地主}else{return-1;}}intcallcent3(intx,inty)/*找地主之3找最大叫分值*/{intmaxdata;if(xy)//比较x与y的大小最大数的赋给data;{maxdata=x;}else//比较x与y的大小最大数的赋给data;{maxdata=y;}returnmaxdata;}intcallcent4(intmaxdata,int*z)/*找地主之4电脑玩家随机叫分*/{*z=rand()%(4-maxdata);//随机选取(0)不叫,或者大于其它玩家最大的叫分值4-x剩余可选数的个数if(*z!=0)//如果玩家x选择了不是0(不叫)的分数{*z=(*z)+maxdata;//剩余可选个数的随机数加上玩家z所选的分数不会大于3并且不小于x}if(*z==3)//如果z等于3z玩家是地主{return2;//返回2代表z玩家是地主}else{return-1;}9}intcallcent5(intx,inty,intz)/*找地主之5判断最终叫分情况*/{if(x==0&&y==0&&z==0)//如果玩家x,y,z都选择0(不叫){printf(x==%dy==%dz==%d,x,y,z);printf(\n);printf(重新发牌:\n);return-1;}else{returncompare(x,y,z);//选择最大数的玩家做为地主}}intcallcent6(int*x,intmaxdata)/*找地主之6玩家x叫分*/{while(*x0||*x3-maxdata)//控制数字在[0,3-data]之间{printf(请输入大于0,并且小于3-maxdata的分数:\n);scanf_s(%d,x);//超出[0,3-data]重新输入if(*x!=maxdata)//这里是为了方便习惯性输入3和0{if(*x!=0){*x=*x-maxdata;//将其减小到出循环的情况}}}if(*x!=0)//如果玩家x选择了不是0(不叫)的分数{*x=*x+maxdata;//剩余可选个数的随机数加
本文标题:斗地主源码
链接地址:https://www.777doc.com/doc-5140960 .html