斗地主源码.docx
- 文档编号:8107647
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:23
- 大小:51.28KB
斗地主源码.docx
《斗地主源码.docx》由会员分享,可在线阅读,更多相关《斗地主源码.docx(23页珍藏版)》请在冰豆网上搜索。
斗地主源码
斗地主源码
#include"stdafx.h"
#include
#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");
}
}
}
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 { ++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; } taxis(platex,0,19);//排序 switch(j) { case0: outplate(platex,enjoy->figx,enjoy->platex,20);//转换玩家x的牌 break; case1: outplate(platex,enjoy->figy,enjoy->platey,20);//转换电脑玩家y的牌 break; case2: outplate(platex,enjoy->figz,enjoy->platez,20);//转换电脑玩家z的牌 break; } } voidlorddeal(list*enjoy,intbrand[],intj)/*给地主发剩余牌*/ { switch(j) { case0: lorddeal1(brand,enjoy,enjoy->x,enjoy->y,enjoy->z,j);//地主玩家x发牌 break; case1: lorddeal1(brand,enjoy,enjoy->y,enjoy->z,enjoy->x,j);//地主玩家y发牌 break; case2: lorddeal1(brand,enjoy,enjoy->z,enjoy->x,enjoy->y,j);//地主玩家z发牌 } } voidvstaxis1(int*plate,int*fig,int*brandcost,int*bloom,int*full,intj,intk)/*存单张或多张相同的牌和花色到各个数组*/ { inti,mark=0; for(i=0;i { brandcost[*full]=plate[j+mark];//将单张或多张相同的牌分组 bloom[(*full)++]=fig[j+(mark++)];//将单张或多张的花色分组 } } voidvstaxis2(int*plate,int*fig,int*brandcost,int*bloom,int*full,intj)/*将各个数组的牌和花色合并*/ { plate[j]=brandcost[--(*full)];//将存单张或多张相同的牌合并 fig[j]=bloom[*full];//将存单张或多张的花色合并 } voidvstaxis(int*plate,int*fig,intk)/*按单双排序*/ { intj,mark=0;//mark==0代表是单张 intz=0,x=0,c=0,v=0,b=0; for(j=k-1;j>=0;j--)//循环将一样的牌分组 { if(plate[j]<2)//如果不是牌的数值重新循环 { continue; } elseif(plate[j]==17&&plate[j-1]==18||plate[j]==18&&plate[j-1]==17)//如果是双王连着 { brandcost4[b]=plate[j];//存双王 bloom4[b++]=fig[j--]; brandcost4[b]=plate[j]; bloom4[b++]=fig[j--]; } elseif(plate[j]! =plate[j-1])//当前牌不等于前一张 { switch(mark)//是单张还是多张 { case0: vstaxis1(plate,fig,brandcost,bloom,&z,j,1);//存单长牌到数组brandcost break;//z代表存了多少张单牌 case1: vstaxis1(plate,fig,brandcost1,bloom1,&x,j,2);//存两张相同的牌到数组brandcost1 break;//x代表存了多少张两张相同的牌 case2: vstaxis1(plate,fig
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 地主 源码