版图:
![](https://i-blog.csdnimg.cn/blog_migrate/1ae82c112ec8cc8e18116c0313d87619.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ad44ab7473e4b452795d79c4d0f82663.png)
代码板块:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include<string.h>
struct wanjia{
int pai[20];
int paishu;
int fen;//决定是否可以抢到地主
};
void shuchu(int t[],int n){//输出系统
int a[20],num=0;
for(int x=15;x>0;x--){
for(int y=0;y<n;y++){
if(t[y]==x){
a[num]=x;
num++;
}
}
}//排序
for(int i=0;i<n;i++){
if(a[i]>=1&&a[i]<=8) printf("%d ",a[i]+2);
else if(a[i]==9) printf("J ");
else if(a[i]==10) printf("Q ");
else if(a[i]==11) printf("K ");
else if(a[i]==12) printf("A ");
else if(a[i]==13) printf("2 ");
else if(a[i]==14) printf("小王 ");
else printf("大王 ");
}//输出
printf(" %d张牌",n);
printf("\n");
}
int max(int a,int b,int c){
int max1=a;
if(max1<b) max1=b;
if(max1<c) max1=c;
if(max1==a) return 1;
else if(max1==b) return 2;
else return 3;
}
int min(int a,int b,int c){
int max1=3;
if(max1>a&&a!=0) max1=a;
if(max1>b&&b!=0) max1=b;
if(max1>c&&c!=0) max1=c;
if(max1==a) return 1;
else if(max1==b) return 2;
else return 3;
}
int f(int a,int b,int c){
int sex=0;
if(a!=0) sex++;
if(b!=0) sex++;
if(c!=0) sex++;
return sex;
}
int zhuanhuan(char a){
if(a=='W') return 15;
if(a=='w') return 14;
if(a=='2') return 13;
if(a=='A') return 12;
if(a=='K') return 11;
if(a=='Q') return 10;
if(a=='J') return 9;
if(a=='1') return 8;
if(a=='9') return 7;
if(a=='8') return 6;
if(a=='7') return 5;
if(a=='6') return 4;
if(a=='5') return 3;
if(a=='4') return 2;
if(a=='3') return 1;
if(a=='0') return 0;
}
int main()
{
system("color b");
//PlaySound(TEXT("6.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);
SetConsoleTitle("斗地主");
struct wanjia wj[3]; //定义三个玩家
//int zong[15]={4,4,4,4,4,4,4,4,4,4,4,4,4,1,1};//发牌
srand(time(0));//制作种子
int zong[15];
int dzp[3];//地主牌3个
int dz;//第一个抢地主的玩家
int choose;//选项输入
char card[20];//打出的牌
int card_1=0;//转意后的牌的数字
int card_2[20];//用于输出
int card_3;
for(int m=0;;m++){
printf("----------------------游戏开始------------------------\n");
for(int i=0;i<15;i++){
if(i<13) zong[i]=4;
else zong[i]=1;
}
for(int x=0;x<3;x++){//玩家号数
for(int y=0;y<17;y++){//玩家牌
wj[x].pai[y]=rand()%15+1;//发牌
zong[wj[x].pai[y]-1]--;
if(zong[wj[x].pai[y]-1]<0) y--;
}
for(int y=17;y<20;y++) wj[x].pai[y]=0;//十七张牌后面默认赋值为0
wj[x].paishu=17;//刚开始发牌每个人17张牌
wj[x].fen=0;
shuchu(wj[x].pai,wj[x].paishu); //玩家的输出
}
//发牌阶段
for(int x=0;x<3;x++){//x是地主牌的位置
for(int y=0;y<15;y++){
if(zong[y]>0){
dzp[x]=y+1;
zong[y]--;
break;
}
}
}//进行判断地主牌
//shuchu(dzp,3);
printf("------------------------------------------------------\n");
dz=rand()%3+1;//随机获取第一个抢地主的玩家
for(int x=1;x<=3;dz++,x++){//x是抢地主的次数,i是玩家号
printf("轮到%d号玩家抢地主:\n 选项1:抢地主 选项2:不抢\n",dz%3+1);
scanf("%d",&choose);//做出抢地主的选择
if(x!=4){
if(choose==1){
wj[dz%3].fen=x;//抢地主则fen不为0
printf("抢地主\n\n");
}
else if(choose==2){
printf("不抢\n\n");
}
if(x==3&&f(wj[0].fen,wj[1].fen,wj[2].fen)==0){//都不抢地主的情况
printf("重新洗牌\n");
Sleep(1000);
system("cls");
break;
}
}
}//判断前三者是否抢地主
if(f(wj[0].fen,wj[1].fen,wj[2].fen)==1) printf(" %d号玩家是地主\n",max(wj[0].fen,wj[1].fen,wj[2].fen));//只有一个人叫地主的情况
if(f(wj[0].fen,wj[1].fen,wj[2].fen)>1){
dz=min(wj[0].fen,wj[1].fen,wj[2].fen);//找到最小的fen,判断现在是谁叫地主
printf("轮到%d号玩家抢地主:\n 选项1:抢地主 选项2:不抢\n",dz);
scanf("%d",&choose);
if(choose==1) printf("抢地主\n\n %d号玩家是地主\n",dz);
else{
dz=max(wj[0].fen,wj[1].fen,wj[2].fen);//找到最大的fen,判断不抢时地主给谁
printf(" %d号玩家是地主\n",dz);
}
}
Sleep(1000);
system("cls");//刷新页面进入出牌阶段
printf("--------------------------出牌阶段------------------------\n");
wj[dz-1].paishu=20;
for(int i=0;i<3;i++){
wj[dz-1].pai[i+17]=dzp[i];
}
shuchu(dzp,3);
printf("\n");
for(int i=0;i<3;i++){
if(i==dz-1) printf("地主 ");
else printf(" ") ;
shuchu(wj[i].pai,wj[i].paishu);
}
Sleep(1000);
//scanf("%d",&choose);
for(int x=dz-1,t=0;x<=4;x++,t++){//出牌阶段,玩家x
if(x==4) x=1;
//if(t==0) x--;//调整bug
if(x==dz){
printf("轮到地主出牌:");
}
else if(x!=dz&&t!=0){
printf("轮到%d号玩家出牌:",x);
}
for(int y=0,t1=0;y<20;y++,t1++){//每个玩家的出牌阶段
scanf("%c",&card[y]);//打出的牌(含字符)
if(card[y]=='\n') break;
card_1=zhuanhuan(card[y]);
if(card_1!=0){
printf("%d \n",card_1);//转换成数字
for(int m=0,n=0;m<wj[x-1].paishu;m++,n++){//寻找牌
if(wj[x-1].pai[m]==card_1){
n++;
wj[x-1].paishu--;
}
wj[x-1].pai[m]=wj[x-1].pai[n];
}
}
shuchu(wj[x-1].pai,wj[x-1].paishu);
Sleep(1000);
system("cls");//刷新页面进入第二次出牌阶段
printf("--------------------------出牌阶段------------------------\n");
shuchu(dzp,3);
for(int i=0;i<3;i++){
if(i==dz-1) printf("地主 ");
else printf(" ") ;
shuchu(wj[i].pai,wj[i].paishu);
}
for(int y=0;y<20;y++){
if(card[y]='\n') break;
card_2[y]=zhuanhuan(card[y]);
card_3=y;
}
shuchu(card_2,card_3);
}
printf("\n");
if(wj[x-1].paishu==0){
if(x==dz) printf("地主获胜!");
else printf("农民胜利!");
printf("玩家%d获胜\n\n",x);
break;
}
}//地主是dz号玩家
printf("选项一:继续游戏\n选项二:离开游戏");
scanf("%d",&choose);
if(choose==2) break;
if(choose==1) system("cls");
}
return 0;
}