斗地主c语言

版图:

代码板块:

#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;
}    
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值