斗地主源码.doc

上传人:聆听****声音 文档编号:2037754 上传时间:2023-05-02 格式:DOC 页数:19 大小:128.50KB
下载 相关 举报
斗地主源码.doc_第1页
第1页 / 共19页
斗地主源码.doc_第2页
第2页 / 共19页
斗地主源码.doc_第3页
第3页 / 共19页
斗地主源码.doc_第4页
第4页 / 共19页
斗地主源码.doc_第5页
第5页 / 共19页
斗地主源码.doc_第6页
第6页 / 共19页
斗地主源码.doc_第7页
第7页 / 共19页
斗地主源码.doc_第8页
第8页 / 共19页
斗地主源码.doc_第9页
第9页 / 共19页
斗地主源码.doc_第10页
第10页 / 共19页
斗地主源码.doc_第11页
第11页 / 共19页
斗地主源码.doc_第12页
第12页 / 共19页
斗地主源码.doc_第13页
第13页 / 共19页
斗地主源码.doc_第14页
第14页 / 共19页
斗地主源码.doc_第15页
第15页 / 共19页
斗地主源码.doc_第16页
第16页 / 共19页
斗地主源码.doc_第17页
第17页 / 共19页
斗地主源码.doc_第18页
第18页 / 共19页
斗地主源码.doc_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

斗地主源码.doc

《斗地主源码.doc》由会员分享,可在线阅读,更多相关《斗地主源码.doc(19页珍藏版)》请在冰点文库上搜索。

斗地主源码.doc

#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=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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2