H12【选做▪游戏】拱猪计分【北理工乐学C语言作业】

本文介绍了大学时期流行的扑克牌游戏‘拱猪’的计分规则,并提供了C语言代码实现,包括普通模式和特殊模式下玩家得分的计算。
摘要由CSDN通过智能技术生成

背景:
    
拱猪是我在大学期间经常玩的一种扑克牌游戏。即使现在的你不知道它的玩法,你也可以由它的计分方式来了解它的趣味性。 假设在此我们仅考虑四个人的拱猪牌局,本题要求你根据下面的计分规则,在牌局结束时计算四位玩家所得分数。

  1. 我们分别以S、H、D及C来代表黑桃,红心,方块及梅花,并以数字1至 13来代表A、2、…、Q、K等牌点,例如:H1为红心A,S13为黑桃K。
  2. 牌局结束时,由各玩家持有的有关计分的牌(计分牌)仅有S12(猪),所有红心牌,D11(羊)及C10(加倍)等16张牌。其它牌均弃置不计。若未持有这16张牌之任一张则以得零分计算。
  3. 若持有C10的玩家只有该张牌而没有任何其它牌则得+50分,若除了C10 还有其它计分牌,则将其它计分牌所得分数加倍计算。
  4. 若红心牌不在同一家,则H1至H13等13张牌均以负分计,其数值为-50, -2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40。而且S12与D11分别以-100及+100分计算。
  5. 若红心牌H1至H13均在同一家,有下列情形:
    • 所有红心牌以+200分计算。
    • 若S12、D11皆在吃下所有红心牌之一家,则此玩家得+500分。
    • 而C10还是以前面所述原则计算之。

例一:若各玩家持有计分牌如下: ( 每列代表一玩家所持有之牌 )

S12 H3 H5 H13
D11 H8 H9
C10 H1 H2 H4 H6 H7
H10 H11 H12

则各家之得分依序为: -148 、 +83 、 -138 及 -60 。

例二:若各玩家持有计分牌如下:(第四家未持有任何计分牌)

H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13
S12 C10
D11

则各家之得分依序为: +200 、 -200 、 +100 及 0 。

例三:若有一玩家持有所有 16 张计分牌,则得 +1000 分。其余三家均得零分。

输入:
    
每个输入文件由多组测试数据构成,每组测试数据有四行,每一行第一个数为该玩家所持有计分牌总数,而后列出其所持有之所有计分牌,牌数与各计分牌均以一个以上的空格分开。相邻两组测试数据之间不会有空白行,读到四家持牌数都为 0 表示文件结束。

输出:
    每一行输出一组测试数据对应的结果,依次输出各家所得分数,共四个整数 ( 含正负号,0 除外),相邻两个整数之间以一个空格分开,符号和数字间不可以有空格。每组输出间不需要有空白行。

#include<stdio.h>  
#include<string.h>  
int input(char *in){  
    int i,n,j;  
    char temp[5];  
    for(j=0;j<5;j++){  
        temp[j]='\0';  
    }  
    scanf("%d",&n);  
    for(i=0;i<n;i++){  
        scanf("%s",&temp);  
        strcat(in,temp);  
        in[strlen(in)]=' ';  
    }  
    return n;     
}  
  
//判断是否进入特殊模式   
int mod(char *a,char *b,char *c,char *d){  
    int sign=0;  
    if(decide_mod(a)==13) sign=1;  
    else{  
        if(decide_mod(b)==13) sign=2;  
        else{  
            if(decide_mod(c)==13) sign=3;  
            else{  
                if(decide_mod(d)==13) sign=4;  
            }  
        }  
    }  
    return sign;   
}//不进入返回0,进入返回庄家序号   
  
//计算字符串中拥有几张 H牌   
int decide_mod(char* in){  
    int i=0,cnt=0,sign=0,j;  
    char temp[5];  
    for(j=0;j<5;j++){  
        temp[j]='\0';  
    }  
    //printf("%s %d ",in,strlen(in));  
    for(i=0;i<strlen(in);i++){  
        if(in[i]==' '){  
            if(temp[0]=='H'){  
                sign+=1;  
            }   
            //复位temp   
            for(j=0;j<5;j++){  
                temp[j]='\0';  
            }  
            //复位cnt  
            cnt=0;   
        }  
        //读取一张卡牌到临时库中   
        else {  
            temp[cnt]=in[i];  
            cnt+=1;  
        }  
    }  
    //printf("%d\n",sign);  
    return sign;  
}  
  
//普通模式计算一家的总得分   
int player_score_normal(char* in){  
    int i=0,cnt=0,score=0,sc=0,sign=1,j=0;  
    char temp[5];  
    for(j=0;j<5;j++){  
        temp[j]='\0';  
    }  
    for(i=0;i<strlen(in);i++){  
        if(in[i]==' '){  
            sc=card_score_normal(temp);  
            if(sc==10000){  
                sign=2;  //附加倍率   
            }  
            else{  
                score+=sc;  
            }  
            //复位temp   
            for(j=0;j<5;j++){  
                temp[j]='\0';  
            }  
            //复位cnt  
            cnt=0;   
        }  
        //读取一张卡牌到临时库中   
        else {  
            temp[cnt]=in[i];  
            cnt+=1;  
        }  
    }  
    if(score!=0) return score*sign;  
    else if(score==0&&sign==2) return 50;  
    else return 0;  
}   
  
//普通模式下求出卡牌对应的分数   
int card_score_normal(char *card){  
    char card_bank[17][4]={"H1","H2","H3","H4","H5","H6","H7","H8","H9","H10","H11","H12","H13","D11","S12","C10"};  
    int i=0;  
    for(i=0;i<16;i++){  
        if(strcmp(card,card_bank[i])==0){  
            break;  
        }  
    }  
    i+=1;  
    if(i>=2&&i<=10) return 0-i;  
    else if(i==1) return -50;  
    else if(i==11) return -20;  
    else if(i==12) return -30;  
    else if(i==13) return -40;  
    else if(i==14) return 100;  
    else if(i==15) return -100;  
    else if(i==16) return 10000;  
}  
  
//特殊模式普通玩家得分计算  
int player_score_special(char* in){  
    int i=0,cnt=0,score=0,sc=0,sign=1,j=0;  
    char temp[5];  
    for(j=0;j<5;j++){  
        temp[j]='\0';  
    }  
    for(i=0;i<strlen(in);i++){  
        if(in[i]==' '){  
            sc=card_score_special(temp);  
            if(sc==10000){  
                sign=2;  //附加倍率   
            }  
            else{  
                score+=sc;  
            }  
            //复位temp   
            for(j=0;j<5;j++){  
                temp[j]='\0';  
            }  
            //复位cnt  
            cnt=0;   
        }  
        //读取一张卡牌到临时库中   
        else {  
            temp[cnt]=in[i];  
            cnt+=1;  
        }  
    }  
    if(score!=0) return score*sign;  
    else if(score==0&&sign==2) return 50;  
    else return 0;    
}   
  
//特殊模式特殊玩家得分计算  
int superplayer_score_special(char* in){  
    int i,cnt=0,score=200,sc=0,sign=1,j=0;  
    char temp[5];  
    for(j=0;j<5;j++){  
        temp[j]='\0';  
    }  
    for(i=0;i<strlen(in);i++){  
        if(in[i]==' '){  
            sc=card_score_special(temp);  
            if(sc==10000){  
                sign=2;  //附加倍率   
            }  
            else{  
                score+=sc;  
            }  
            //复位temp   
            for(j=0;j<5;j++){  
                temp[j]='\0';  
            }  
            //复位cnt  
            cnt=0;   
        }  
        //读取一张卡牌到临时库中   
        else {  
            temp[cnt]=in[i];  
            cnt+=1;  
        }  
    }  
    return score*sign;  
}   
  
//特殊模式下求出卡牌对应的分数   
int card_score_special(char *card){  
    char card_bank[17][4]={"H1","H2","H3","H4","H5","H6","H7","H8","H9","H10","H11","H12","H13","D11","S12","C10"};  
    int i=0;  
    for(i=0;i<16;i++){  
        if(strcmp(card,card_bank[i])==0){  
            break;  
        }  
    }  
    i+=1;  
    if(i>=2&&i<=10) return 0;  
    else if(i==1) return 0;  
    else if(i==11) return 0;  
    else if(i==12) return 0;  
    else if(i==13) return 0;  
    else if(i==14) return 100;  
    else if(i==15) return -100;  
    else if(i==16) return 10000;  
}  
  
int main(void){  
    int i=0,n1=0,n2=0,n3=0,n4=0,m=0,na=0,nb=0,nc=0,nd=0,j;  
    char a[1000],b[1000],c[1000],d[1000],all[]="H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 ",temp[5];  
    for(j=0;j<5;j++){  
        temp[j]='\0';  
    }  
  
    while(1){  
        //复位所有字符串   
        for(i=0;i<1000;i++){  
            a[i]='\0';  
            b[i]='\0';  
            c[i]='\0';  
            d[i]='\0';  
        }  
          
        //得分清零  
        n1=0;  
        n2=0;  
        n3=0;  
        n4=0;  
           
          
        //读取所有输入  
        na=input(a);  
        nb=input(b);  
        nc=input(c);  
        nd=input(d);  
          
        if(na==16){  
            printf("+1000 0 0 0\n");  
        }  
        else if(nb==16){  
            printf("0 +1000 0 0\n");  
        }  
        else if(nc==16){  
            printf("0 0 +1000 0\n");  
        }  
        else if(nd==16){  
            printf("0 0 0 +1000\n");  
        }  
          
        else{  
            if(na==0&&nb==0&&nc==0&&nd==0) break;  
              
            //printf("%s %s %s %s\n",a,b,c,d);  
            //普通模式:H不在用一个人手中  
            m=mod(a,b,c,d);  
            if(m==0){  
                n1=player_score_normal(a);  
                n2=player_score_normal(b);  
                n3=player_score_normal(c);  
                n4=player_score_normal(d);  
            }  
              
            //特殊模式:H在m号玩家手中  
            else{  
                //printf("%d",m);  
                if(m==1){  
                    n1=superplayer_score_special(a);  
                    n2=player_score_special(b);  
                    n3=player_score_special(c);  
                    n4=player_score_special(d);  
                }  
                else if(m==2){  
                    n1=player_score_special(a);  
                    n2=superplayer_score_special(b);  
                    n3=player_score_special(c);  
                    n4=player_score_special(d);  
                }  
                else if(m==3){  
                    n1=player_score_special(a);  
                    n2=player_score_special(b);  
                    n3=superplayer_score_special(c);  
                    n4=player_score_special(d);  
                }  
                else{  
                    n1=player_score_special(a);  
                    n2=player_score_special(b);  
                    n3=player_score_special(c);  
                    n4=superplayer_score_special(d);  
                }  
            }  
              
            //输出结果   
            if(n1>0) printf("+%d ",n1);  
            else printf("%d ",n1);  
            if(n2>0) printf("+%d ",n2);  
            else printf("%d ",n2);  
            if(n3>0) printf("+%d ",n3);  
            else printf("%d ",n3);  
            if(n4>0) printf("+%d",n4);  
            else printf("%d",n4);  
            printf("\n");  
        }  
    }  
}  

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值