背景:
拱猪是我在大学期间经常玩的一种扑克牌游戏。即使现在的你不知道它的玩法,你也可以由它的计分方式来了解它的趣味性。 假设在此我们仅考虑四个人的拱猪牌局,本题要求你根据下面的计分规则,在牌局结束时计算四位玩家所得分数。
- 我们分别以S、H、D及C来代表黑桃,红心,方块及梅花,并以数字1至 13来代表A、2、…、Q、K等牌点,例如:H1为红心A,S13为黑桃K。
- 牌局结束时,由各玩家持有的有关计分的牌(计分牌)仅有S12(猪),所有红心牌,D11(羊)及C10(加倍)等16张牌。其它牌均弃置不计。若未持有这16张牌之任一张则以得零分计算。
- 若持有C10的玩家只有该张牌而没有任何其它牌则得+50分,若除了C10 还有其它计分牌,则将其它计分牌所得分数加倍计算。
- 若红心牌不在同一家,则H1至H13等13张牌均以负分计,其数值为-50, -2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40。而且S12与D11分别以-100及+100分计算。
- 若红心牌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");
}
}
}