斗地主源码.docx
- 文档编号:9051397
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:29
- 大小:19.95KB
斗地主源码.docx
《斗地主源码.docx》由会员分享,可在线阅读,更多相关《斗地主源码.docx(29页珍藏版)》请在冰豆网上搜索。
斗地主源码
#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");
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[])/*输出整副牌*/
{
inti=0;
for(;i<54;++i)
{
printf("%d",brand[i]);
}
printf("\n");
}
voidoutput1(int*plate,int*fig,intk)/*输出玩家结构数据*/
{
inti;
printf("\n");
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 { ++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,enj
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 地主 源码
![提示](https://static.bdocx.com/images/bang_tan.gif)