斗地主源码.doc
《斗地主源码.doc》由会员分享,可在线阅读,更多相关《斗地主源码.doc(19页珍藏版)》请在冰点文库上搜索。
#include"stdafx.h"
#include
typedefstruct
{
int*x;//玩家1
int*platex;
int*figx;
intopenx;
int*y; //玩家2
int*platey;
int*figy;
intopeny;
int*z; //玩家3
int*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");
return0;
case1:
printf("游戏开始\n");
return1;
}
returnk;
voidinitialize(intbrand[])/*初始化牌*/
inti=0;
while(i<54)
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[])/*输出整副牌*/
for(;i<54;++i)
printf("%d",brand[i]);
printf("\n");
voidoutput1(int*plate,int*fig,intk)/*输出玩家结构数据*/
inti;
for(i=0;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);//输出j break; case12: printf("%c%c",fig[i],81);//输出Q break; case13: printf("%c%c",fig[i],107);//输出k break; case14: printf("%c%c",fig[i],65);//输出A break; case16: printf("%c%d",fig[i],2);//输出2 break; case17: printf("%c",1);//输出小王 break; case18: printf("%c",2);//输出大王 break; } } }}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(k<100)//交换100次 { i=rand()%54;//随机分配交换牌的坐标 j=rand()%54; //随机分配交换牌的坐标 commute=brand[i];//牌坐标相互交换 brand[i]=brand[j]; brand[j]=commute; ++k; } }voiddeal(intbrand[],list*enjoy)/*发牌*/{ inti; for(i=0;i<17;++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(low { while(low { --high;//高位-1 } address[low]=address[high];//小于中心点数值的数赋给低位没用的空位 while(low=work)//小于中心点数值 { ++low;//低位+1 } address[high]=address[low];//大于中心点数值的数赋给高位没用的空位 } address[low]=work;//中心点数值填补剩余的一个空位 returnlow;//返回中心点坐标}voidtaxis(int*address,intlow,inthigh)/*快速排序递归*/{ intwork; if(low { 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)/*比较三个数的大小*/{ if(x>y) { if(x>z) { return0;//返回0代表玩家x叫的数最大 } else { return2;//返回2代表玩家z叫的数最大 } } else { if(y>z) { 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(不叫)的分数 { *y=(*y)+x;//剩余可选个数的随机数加上玩家x所选的分数不会大于3并且不小于x } if(*y==3)//如果y等于3y玩家是地主 { return1;//返回1代表y玩家是地主 } else { return-1; }}intcallcent3(intx,inty)/*找地主之3找最大叫分值*/{ intmaxdata; if(x>y)//比较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; }}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(*x<0||*x>3-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;//剩余可选个数的随机数加上其它玩家所选的最大分数不会大于3并且不小于最大数 } if(*x==3)//如果x等于3x玩家是地主 { return0;//返回0代表x玩家是地主 } else { return-1; }}intcallcent7(intj,int*k)/*输出哪个玩家是地主*/{ *k=(j+(*k))%3;//0是玩家x,1是电脑玩家y,2是电脑玩家z switch(*k) { case0: printf("最终地主是玩家x:\n"); return0; case1: printf("最终地主是玩家y:\n"); return1; case2: printf("最终地主是玩家z:\n"); return2; } return-1;}intlaird(int*k)/*找地主过程*/{ intj,x=-1,y; intmaxdata,z=-1; printf("0代表不叫|1代表1分|2代表2分|3代表3分:\n"); *k=rand()%3;; printf("\n"); if(*k==0)//随机选到玩家x最先叫分的情况 { printf("最先叫分的是玩家x;\n"); j=callcent6(&x,0); //玩家x最先叫分 output_x(x); if(j==0)//0代表地主是玩家x { return0; } j=callcent2(x,&y);//电脑玩家y叫分 output_y(y); if(j==1)//1代表地主是电脑玩家y { return1; } maxdata=callcent3(x,y);//前两个玩家叫分的最大值 j=callcent4(maxdata,&z);//最后一个电脑玩家z的叫分值 output_z(z); if(j==2)//2代表地主电脑玩家z { return2; } j=callcent5(x,y,z);//比较三个玩家的叫分情况 returnj; } elseif(*k==1)//随机选到电脑玩家y最先叫分的情况 { printf("最先叫分的是玩家y;\n"); j=callcent1(&x);//电脑玩家y最先随机叫分 output_y(x); if(j==0) { return0;//0代表地主是电脑玩家y } j=callcent2(x,&y);//电脑玩家z随机叫分 output_z(y); if(j==1) { return1;//1代表地主是电脑玩家z } maxdata=callcent3(x,y);//前两个玩家叫分的最大值 j=callcent6(&z,maxdata);//最后一个玩家x的叫分值 output_x(z); if(j==0) { j=2;//2代表地主是玩家x return2; } j=callcent5(x,y,z);//比较三个玩家的叫分情况 returnj; } else//随机选到电脑玩家z最先叫分的情况 { printf("最先叫分的是玩家z;\n"); j=callcent1(&x);//电脑玩家y最先随机叫分 output_z(x); if(j==0) { return0;//0代表地主是电脑玩家z } j=callcent6(&y,x);//电脑玩家x叫分 output_x(y); if(j==0) { j=1;//1代表地主是玩家x return1; } maxdata=callcent3(x,y);//前两个玩家叫分的最大值 j=callcent2(maxdata,&z);//最后一个玩家y的叫分值 output_y(z); if(j==1) { j=2;//2代表地主是电脑玩家y return2; } j=callcent5(x,y,z);//比较三个玩家的叫分情况 returnj; }}voidoptbloom(int*fig,inti)/*将数值转换为花形*/{ switch(fig[i]) { case0: fig[i]=fig[i]+4;//转换为方片 break; case1: fig[i]=fig[i]+4;//转换为梅花 break; case2: fig[i]=fig[i]+1;//转换为红桃 break; case3: fig[i]=fig[i]+3;//转换为黑桃 break; }}voidoutplate(int*plates,int*fig,int*plate,intk)/*将数值转变为牌的形式*/{ inti,j; for(i=0;i { fig[i]=plates[i]%4;//转换成花形所需的数值 optbloom(fig,i);//调用转换花形 if(plates[i]==64) { plate[i]=17;//代表小王 continue; } elseif(plates[i]==65) { plate[i]=18;//代表大王 continue; } else { j=(plates[i]/4)+1;//转换成牌值 plate[i]=j;//赋给记录牌的数组 } }}voidlorddeal1(intbrand[],list*enjoy,int*platex,int*platey,int*platez,intj)/*给地主发剩余牌*/{ inti,k=0; for(i=17;i<20;++i) { platex[i]=brand[17*3+(k++)];//地主发牌 platey[i]=-3; platez[i]=-3
if(plate[i]>1&&plate[i]<11)
printf("%c%d",fig[i],plate[i]);//输出1--10
switch(plate[i])
case11:
printf("%c%c",fig[i],74);//输出j
break;
case12:
printf("%c%c",fig[i],81);//输出Q
case13:
printf("%c%c",fig[i],107);//输出k
case14:
printf("%c%c",fig[i],65);//输出A
case16:
printf("%c%d",fig[i],2);//输出2
case17:
printf("%c",1);//输出小王
case18:
printf("%c",2);//输出大王
voidoutput2(list*enjoy)/*调用输出三个玩家牌的函数*/
printf("玩家x方的牌是:
");
output1(enjoy->platex,enjoy->figx,enjoy->openx);//调用玩家x的数据
printf("电脑玩家y方的牌是:
output1(enjoy->platey,enjoy->figy,enjoy->openy); //调用电脑玩家y的数据
printf("电脑玩家z方的牌是:
output1(enjoy->platez,enjoy->figz,enjoy->openz);//调用电脑玩家z的数据
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张
enjoy->openx=17,enjoy->openy=17,enjoy->openz=20; //电脑玩家z多输出3张
output2(enjoy);
voidriffle(intbrand[])/*洗牌*/
inti,j,k=0;
intcommute;
while(k<100)//交换100次
i=rand()%54;//随机分配交换牌的坐标
j=rand()%54; //随机分配交换牌的坐标
commute=brand[i];//牌坐标相互交换
brand[i]=brand[j];
brand[j]=commute;
++k;
voiddeal(intbrand[],list*enjoy)/*发牌*/
for(i=0;i<17;++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(low { while(low { --high;//高位-1 } address[low]=address[high];//小于中心点数值的数赋给低位没用的空位 while(low=work)//小于中心点数值 { ++low;//低位+1 } address[high]=address[low];//大于中心点数值的数赋给高位没用的空位 } address[low]=work;//中心点数值填补剩余的一个空位 returnlow;//返回中心点坐标}voidtaxis(int*address,intlow,inthigh)/*快速排序递归*/{ intwork; if(low { 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)/*比较三个数的大小*/{ if(x>y) { if(x>z) { return0;//返回0代表玩家x叫的数最大 } else { return2;//返回2代表玩家z叫的数最大 } } else { if(y>z) { 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(不叫)的分数 { *y=(*y)+x;//剩余可选个数的随机数加上玩家x所选的分数不会大于3并且不小于x } if(*y==3)//如果y等于3y玩家是地主 { return1;//返回1代表y玩家是地主 } else { return-1; }}intcallcent3(intx,inty)/*找地主之3找最大叫分值*/{ intmaxdata; if(x>y)//比较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; }}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(*x<0||*x>3-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;//剩余可选个数的随机数加上其它玩家所选的最大分数不会大于3并且不小于最大数 } if(*x==3)//如果x等于3x玩家是地主 { return0;//返回0代表x玩家是地主 } else { return-1; }}intcallcent7(intj,int*k)/*输出哪个玩家是地主*/{ *k=(j+(*k))%3;//0是玩家x,1是电脑玩家y,2是电脑玩家z switch(*k) { case0: printf("最终地主是玩家x:\n"); return0; case1: printf("最终地主是玩家y:\n"); return1; case2: printf("最终地主是玩家z:\n"); return2; } return-1;}intlaird(int*k)/*找地主过程*/{ intj,x=-1,y; intmaxdata,z=-1; printf("0代表不叫|1代表1分|2代表2分|3代表3分:\n"); *k=rand()%3;; printf("\n"); if(*k==0)//随机选到玩家x最先叫分的情况 { printf("最先叫分的是玩家x;\n"); j=callcent6(&x,0); //玩家x最先叫分 output_x(x); if(j==0)//0代表地主是玩家x { return0; } j=callcent2(x,&y);//电脑玩家y叫分 output_y(y); if(j==1)//1代表地主是电脑玩家y { return1; } maxdata=callcent3(x,y);//前两个玩家叫分的最大值 j=callcent4(maxdata,&z);//最后一个电脑玩家z的叫分值 output_z(z); if(j==2)//2代表地主电脑玩家z { return2; } j=callcent5(x,y,z);//比较三个玩家的叫分情况 returnj; } elseif(*k==1)//随机选到电脑玩家y最先叫分的情况 { printf("最先叫分的是玩家y;\n"); j=callcent1(&x);//电脑玩家y最先随机叫分 output_y(x); if(j==0) { return0;//0代表地主是电脑玩家y } j=callcent2(x,&y);//电脑玩家z随机叫分 output_z(y); if(j==1) { return1;//1代表地主是电脑玩家z } maxdata=callcent3(x,y);//前两个玩家叫分的最大值 j=callcent6(&z,maxdata);//最后一个玩家x的叫分值 output_x(z); if(j==0) { j=2;//2代表地主是玩家x return2; } j=callcent5(x,y,z);//比较三个玩家的叫分情况 returnj; } else//随机选到电脑玩家z最先叫分的情况 { printf("最先叫分的是玩家z;\n"); j=callcent1(&x);//电脑玩家y最先随机叫分 output_z(x); if(j==0) { return0;//0代表地主是电脑玩家z } j=callcent6(&y,x);//电脑玩家x叫分 output_x(y); if(j==0) { j=1;//1代表地主是玩家x return1; } maxdata=callcent3(x,y);//前两个玩家叫分的最大值 j=callcent2(maxdata,&z);//最后一个玩家y的叫分值 output_y(z); if(j==1) { j=2;//2代表地主是电脑玩家y return2; } j=callcent5(x,y,z);//比较三个玩家的叫分情况 returnj; }}voidoptbloom(int*fig,inti)/*将数值转换为花形*/{ switch(fig[i]) { case0: fig[i]=fig[i]+4;//转换为方片 break; case1: fig[i]=fig[i]+4;//转换为梅花 break; case2: fig[i]=fig[i]+1;//转换为红桃 break; case3: fig[i]=fig[i]+3;//转换为黑桃 break; }}voidoutplate(int*plates,int*fig,int*plate,intk)/*将数值转变为牌的形式*/{ inti,j; for(i=0;i { fig[i]=plates[i]%4;//转换成花形所需的数值 optbloom(fig,i);//调用转换花形 if(plates[i]==64) { plate[i]=17;//代表小王 continue; } elseif(plates[i]==65) { plate[i]=18;//代表大王 continue; } else { j=(plates[i]/4)+1;//转换成牌值 plate[i]=j;//赋给记录牌的数组 } }}voidlorddeal1(intbrand[],list*enjoy,int*platex,int*platey,int*platez,intj)/*给地主发剩余牌*/{ inti,k=0; for(i=17;i<20;++i) { platex[i]=brand[17*3+(k++)];//地主发牌 platey[i]=-3; platez[i]=-3
while(low { --high;//高位-1 } address[low]=address[high];//小于中心点数值的数赋给低位没用的空位 while(low=work)//小于中心点数值 { ++low;//低位+1 } address[high]=address[low];//大于中心点数值的数赋给高位没用的空位 } address[low]=work;//中心点数值填补剩余的一个空位 returnlow;//返回中心点坐标}voidtaxis(int*address,intlow,inthigh)/*快速排序递归*/{ intwork; if(low { 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)/*比较三个数的大小*/{ if(x>y) { if(x>z) { return0;//返回0代表玩家x叫的数最大 } else { return2;//返回2代表玩家z叫的数最大 } } else { if(y>z) { 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(不叫)的分数 { *y=(*y)+x;//剩余可选个数的随机数加上玩家x所选的分数不会大于3并且不小于x } if(*y==3)//如果y等于3y玩家是地主 { return1;//返回1代表y玩家是地主 } else { return-1; }}intcallcent3(intx,inty)/*找地主之3找最大叫分值*/{ intmaxdata; if(x>y)//比较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; }}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(*x<0||*x>3-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;//剩余可选个数的随机数加上其它玩家所选的最大分数不会大于3并且不小于最大数 } if(*x==3)//如果x等于3x玩家是地主 { return0;//返回0代表x玩家是地主 } else { return-1; }}intcallcent7(intj,int*k)/*输出哪个玩家是地主*/{ *k=(j+(*k))%3;//0是玩家x,1是电脑玩家y,2是电脑玩家z switch(*k) { case0: printf("最终地主是玩家x:\n"); return0; case1: printf("最终地主是玩家y:\n"); return1; case2: printf("最终地主是玩家z:\n"); return2; } return-1;}intlaird(int*k)/*找地主过程*/{ intj,x=-1,y; intmaxdata,z=-1; printf("0代表不叫|1代表1分|2代表2分|3代表3分:\n"); *k=rand()%3;; printf("\n"); if(*k==0)//随机选到玩家x最先叫分的情况 { printf("最先叫分的是玩家x;\n"); j=callcent6(&x,0); //玩家x最先叫分 output_x(x); if(j==0)//0代表地主是玩家x { return0; } j=callcent2(x,&y);//电脑玩家y叫分 output_y(y); if(j==1)//1代表地主是电脑玩家y { return1; } maxdata=callcent3(x,y);//前两个玩家叫分的最大值 j=callcent4(maxdata,&z);//最后一个电脑玩家z的叫分值 output_z(z); if(j==2)//2代表地主电脑玩家z { return2; } j=callcent5(x,y,z);//比较三个玩家的叫分情况 returnj; } elseif(*k==1)//随机选到电脑玩家y最先叫分的情况 { printf("最先叫分的是玩家y;\n"); j=callcent1(&x);//电脑玩家y最先随机叫分 output_y(x); if(j==0) { return0;//0代表地主是电脑玩家y } j=callcent2(x,&y);//电脑玩家z随机叫分 output_z(y); if(j==1) { return1;//1代表地主是电脑玩家z } maxdata=callcent3(x,y);//前两个玩家叫分的最大值 j=callcent6(&z,maxdata);//最后一个玩家x的叫分值 output_x(z); if(j==0) { j=2;//2代表地主是玩家x return2; } j=callcent5(x,y,z);//比较三个玩家的叫分情况 returnj; } else//随机选到电脑玩家z最先叫分的情况 { printf("最先叫分的是玩家z;\n"); j=callcent1(&x);//电脑玩家y最先随机叫分 output_z(x); if(j==0) { return0;//0代表地主是电脑玩家z } j=callcent6(&y,x);//电脑玩家x叫分 output_x(y); if(j==0) { j=1;//1代表地主是玩家x return1; } maxdata=callcent3(x,y);//前两个玩家叫分的最大值 j=callcent2(maxdata,&z);//最后一个玩家y的叫分值 output_y(z); if(j==1) { j=2;//2代表地主是电脑玩家y return2; } j=callcent5(x,y,z);//比较三个玩家的叫分情况 returnj; }}voidoptbloom(int*fig,inti)/*将数值转换为花形*/{ switch(fig[i]) { case0: fig[i]=fig[i]+4;//转换为方片 break; case1: fig[i]=fig[i]+4;//转换为梅花 break; case2: fig[i]=fig[i]+1;//转换为红桃 break; case3: fig[i]=fig[i]+3;//转换为黑桃 break; }}voidoutplate(int*plates,int*fig,int*plate,intk)/*将数值转变为牌的形式*/{ inti,j; for(i=0;i { fig[i]=plates[i]%4;//转换成花形所需的数值 optbloom(fig,i);//调用转换花形 if(plates[i]==64) { plate[i]=17;//代表小王 continue; } elseif(plates[i]==65) { plate[i]=18;//代表大王 continue; } else { j=(plates[i]/4)+1;//转换成牌值 plate[i]=j;//赋给记录牌的数组 } }}voidlorddeal1(intbrand[],list*enjoy,int*platex,int*platey,int*platez,intj)/*给地主发剩余牌*/{ inti,k=0; for(i=17;i<20;++i) { platex[i]=brand[17*3+(k++)];//地主发牌 platey[i]=-3; platez[i]=-3
--high;//高位-1
address[low]=address[high];//小于中心点数值的数赋给低位没用的空位
while(low=work)//小于中心点数值
++low;//低位+1
address[high]=address[low];//大于中心点数值的数赋给高位没用的空位
address[low]=work;//中心点数值填补剩余的一个空位
returnlow;//返回中心点坐标
voidtaxis(int*address,intlow,inthigh)/*快速排序递归*/
if(low { 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)/*比较三个数的大小*/{ if(x>y) { if(x>z) { return0;//返回0代表玩家x叫的数最大 } else { return2;//返回2代表玩家z叫的数最大 } } else { if(y>z) { 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(不叫)的分数 { *y=(*y)+x;//剩余可选个数的随机数加上玩家x所选的分数不会大于3并且不小于x } if(*y==3)//如果y等于3y玩家是地主 { return1;//返回1代表y玩家是地主 } else { return-1; }}intcallcent3(intx,inty)/*找地主之3找最大叫分值*/{ intmaxdata; if(x>y)//比较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; }}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(*x<0||*x>3-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;//剩余可选个数的随机数加上其它玩家所选的最大分数不会大于3并且不小于最大数 } if(*x==3)//如果x等于3x玩家是地主 { return0;//返回0代表x玩家是地主 } else { return-1; }}intcallcent7(intj,int*k)/*输出哪个玩家是地主*/{ *k=(j+(*k))%3;//0是玩家x,1是电脑玩家y,2是电脑玩家z switch(*k) { case0: printf("最终地主是玩家x:\n"); return0; case1: printf("最终地主是玩家y:\n"); return1; case2: printf("最终地主是玩家z:\n"); return2; } return-1;}intlaird(int*k)/*找地主过程*/{ intj,x=-1,y; intmaxdata,z=-1; printf("0代表不叫|1代表1分|2代表2分|3代表3分:\n"); *k=rand()%3;; printf("\n"); if(*k==0)//随机选到玩家x最先叫分的情况 { printf("最先叫分的是玩家x;\n"); j=callcent6(&x,0); //玩家x最先叫分 output_x(x); if(j==0)//0代表地主是玩家x { return0; } j=callcent2(x,&y);//电脑玩家y叫分 output_y(y); if(j==1)//1代表地主是电脑玩家y { return1; } maxdata=callcent3(x,y);//前两个玩家叫分的最大值 j=callcent4(maxdata,&z);//最后一个电脑玩家z的叫分值 output_z(z); if(j==2)//2代表地主电脑玩家z { return2; } j=callcent5(x,y,z);//比较三个玩家的叫分情况 returnj; } elseif(*k==1)//随机选到电脑玩家y最先叫分的情况 { printf("最先叫分的是玩家y;\n"); j=callcent1(&x);//电脑玩家y最先随机叫分 output_y(x); if(j==0) { return0;//0代表地主是电脑玩家y } j=callcent2(x,&y);//电脑玩家z随机叫分 output_z(y); if(j==1) { return1;//1代表地主是电脑玩家z } maxdata=callcent3(x,y);//前两个玩家叫分的最大值 j=callcent6(&z,maxdata);//最后一个玩家x的叫分值 output_x(z); if(j==0) { j=2;//2代表地主是玩家x return2; } j=callcent5(x,y,z);//比较三个玩家的叫分情况 returnj; } else//随机选到电脑玩家z最先叫分的情况 { printf("最先叫分的是玩家z;\n"); j=callcent1(&x);//电脑玩家y最先随机叫分 output_z(x); if(j==0) { return0;//0代表地主是电脑玩家z } j=callcent6(&y,x);//电脑玩家x叫分 output_x(y); if(j==0) { j=1;//1代表地主是玩家x return1; } maxdata=callcent3(x,y);//前两个玩家叫分的最大值 j=callcent2(maxdata,&z);//最后一个玩家y的叫分值 output_y(z); if(j==1) { j=2;//2代表地主是电脑玩家y return2; } j=callcent5(x,y,z);//比较三个玩家的叫分情况 returnj; }}voidoptbloom(int*fig,inti)/*将数值转换为花形*/{ switch(fig[i]) { case0: fig[i]=fig[i]+4;//转换为方片 break; case1: fig[i]=fig[i]+4;//转换为梅花 break; case2: fig[i]=fig[i]+1;//转换为红桃 break; case3: fig[i]=fig[i]+3;//转换为黑桃 break; }}voidoutplate(int*plates,int*fig,int*plate,intk)/*将数值转变为牌的形式*/{ inti,j; for(i=0;i { fig[i]=plates[i]%4;//转换成花形所需的数值 optbloom(fig,i);//调用转换花形 if(plates[i]==64) { plate[i]=17;//代表小王 continue; } elseif(plates[i]==65) { plate[i]=18;//代表大王 continue; } else { j=(plates[i]/4)+1;//转换成牌值 plate[i]=j;//赋给记录牌的数组 } }}voidlorddeal1(intbrand[],list*enjoy,int*platex,int*platey,int*platez,intj)/*给地主发剩余牌*/{ inti,k=0; for(i=17;i<20;++i) { platex[i]=brand[17*3+(k++)];//地主发牌 platey[i]=-3; platez[i]=-3
work=taxis1(address,low,high);//排序主体函数调用
taxis(address,low,work-1);//左半部分排序
taxis(address,work+1,high); //右半部分排序
voidoutput_x(intx)/*输出x*/
printf("x==%d",x);
voidoutput_y(inty)/*输出y*/
printf("y==%d",y);
voidoutput_z(intz)/*输出z*/
printf("z==%d",z);
intcompare(intx,inty,intz)/*比较三个数的大小*/
if(x>y)
if(x>z)
return0;//返回0代表玩家x叫的数最大
return2;//返回2代表玩家z叫的数最大
if(y>z)
return1;//返回1代表玩家y叫的数最大
intcallcent1(int*x)/*找地主之1电脑玩家最先叫分*/
*x=rand()%4;//随机选取(0)不叫,或者大于玩家x的数值4-x剩余可选数的个数
if(*x==3)//如果x等于3x玩家是地主
return0;//返回0代表x玩家是地主
return-1;
intcallcent2(intx,int*y)/*找地主之2电脑玩家随机叫分*/
*y=rand()%(4-x);//随机选取(0)不叫,或者大于玩家x的数值4-x剩余可选数的个数
if(*y!
=0)//如果玩家x选择了不是0(不叫)的分数
*y=(*y)+x;//剩余可选个数的随机数加上玩家x所选的分数不会大于3并且不小于x
if(*y==3)//如果y等于3y玩家是地主
return1;//返回1代表y玩家是地主
intcallcent3(intx,inty)/*找地主之3找最大叫分值*/
intmaxdata;
if(x>y)//比较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!
*z=(*z)+maxdata;//剩余可选个数的随机数加上玩家z所选的分数不会大于3并且不小于x
if(*z==3)//如果z等于3z玩家是地主
return2;//返回2代表z玩家是地主
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");
returncompare(x,y,z);//选择最大数的玩家做为地主
intcallcent6(int*x,intmaxdata)/*找地主之6玩家x叫分*/
while(*x<0||*x>3-maxdata)//控制数字在[0,3-data]之间
printf("请输入大于0,并且小于3-maxdata的分数:
scanf_s("%d",x);//超出[0,3-data]重新输入
if(*x!
=maxdata)//这里是为了方便习惯性输入3和0
=0)
*x=*x-maxdata;//将其减小到出循环的情况
*x=*x+maxdata;//剩余可选个数的随机数加上其它玩家所选的最大分数不会大于3并且不小于最大数
intcallcent7(intj,int*k)/*输出哪个玩家是地主*/
*k=(j+(*k))%3;//0是玩家x,1是电脑玩家y,2是电脑玩家z
switch(*k)
printf("最终地主是玩家x:
printf("最终地主是玩家y:
case2:
printf("最终地主是玩家z:
return2;
intlaird(int*k)/*找地主过程*/
intj,x=-1,y;
intmaxdata,z=-1;
printf("0代表不叫|1代表1分|2代表2分|3代表3分:
*k=rand()%3;;
if(*k==0)//随机选到玩家x最先叫分的情况
printf("最先叫分的是玩家x;\n");
j=callcent6(&x,0); //玩家x最先叫分
output_x(x);
if(j==0)//0代表地主是玩家x
j=callcent2(x,&y);//电脑玩家y叫分
output_y(y);
if(j==1)//1代表地主是电脑玩家y
maxdata=callcent3(x,y);//前两个玩家叫分的最大值
j=callcent4(maxdata,&z);//最后一个电脑玩家z的叫分值
output_z(z);
if(j==2)//2代表地主电脑玩家z
j=callcent5(x,y,z);//比较三个玩家的叫分情况
returnj;
elseif(*k==1)//随机选到电脑玩家y最先叫分的情况
printf("最先叫分的是玩家y;\n");
j=callcent1(&x);//电脑玩家y最先随机叫分
output_y(x);
return0;//0代表地主是电脑玩家y
j=callcent2(x,&y);//电脑玩家z随机叫分
output_z(y);
if(j==1)
return1;//1代表地主是电脑玩家z
j=callcent6(&z,maxdata);//最后一个玩家x的叫分值
output_x(z);
j=2;//2代表地主是玩家x
else//随机选到电脑玩家z最先叫分的情况
printf("最先叫分的是玩家z;\n");
output_z(x);
return0;//0代表地主是电脑玩家z
j=callcent6(&y,x);//电脑玩家x叫分
output_x(y);
j=1;//1代表地主是玩家x
j=callcent2(maxdata,&z);//最后一个玩家y的叫分值
output_y(z);
j=2;//2代表地主是电脑玩家y
voidoptbloom(int*fig,inti)/*将数值转换为花形*/
switch(fig[i])
fig[i]=fig[i]+4;//转换为方片
fig[i]=fig[i]+4;//转换为梅花
fig[i]=fig[i]+1;//转换为红桃
case3:
fig[i]=fig[i]+3;//转换为黑桃
voidoutplate(int*plates,int*fig,int*plate,intk)/*将数值转变为牌的形式*/
inti,j;
for(i=0;i { fig[i]=plates[i]%4;//转换成花形所需的数值 optbloom(fig,i);//调用转换花形 if(plates[i]==64) { plate[i]=17;//代表小王 continue; } elseif(plates[i]==65) { plate[i]=18;//代表大王 continue; } else { j=(plates[i]/4)+1;//转换成牌值 plate[i]=j;//赋给记录牌的数组 } }}voidlorddeal1(intbrand[],list*enjoy,int*platex,int*platey,int*platez,intj)/*给地主发剩余牌*/{ inti,k=0; for(i=17;i<20;++i) { platex[i]=brand[17*3+(k++)];//地主发牌 platey[i]=-3; platez[i]=-3
fig[i]=plates[i]%4;//转换成花形所需的数值
optbloom(fig,i);//调用转换花形
if(plates[i]==64)
plate[i]=17;//代表小王
continue;
elseif(plates[i]==65)
plate[i]=18;//代表大王
j=(plates[i]/4)+1;//转换成牌值
plate[i]=j;//赋给记录牌的数组
voidlorddeal1(intbrand[],list*enjoy,int*platex,int*platey,int*platez,intj)/*给地主发剩余牌*/
inti,k=0;
for(i=17;i<20;++i)
platex[i]=brand[17*3+(k++)];//地主发牌
platey[i]=-3;
platez[i]=-3
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2