拱猪计分

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

我们分别以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 除外),相邻两个整数之间以一个空格分开,符号和数字间不可以有空格。每组输出间不需要有空白行。


测试用例
输入
4 S12 H3 H5 H13↵
3 D11 H8 H9↵
6 C10 H1 H2 H4 H6 H7↵
3 H10 H11 H12↵
13 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13↵
2 S12 C10↵
1 D11↵
0↵
0↵
0↵
0↵
0↵
输出
-148 +83 -138 -60↵
+200 -200 +100 0↵
...全文
522 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bitwwzhang130 2008-12-17
  • 打赏
  • 举报
回复
LZ分析的很仔细
csgdseed 2008-12-15
  • 打赏
  • 举报
回复
分析不错
zhou_zion 2008-12-15
  • 打赏
  • 举报
回复
强,虽然我还没搞清楚怎么回事呢
up
qq675927952 2008-12-13
  • 打赏
  • 举报
回复
up
lq20051610211 2008-12-12
  • 打赏
  • 举报
回复
游戏游戏~
AldisZhan 2008-12-11
  • 打赏
  • 举报
回复
楼主不错
问题分析清楚就好写程序
收藏
建议完善程序
mynameisslim 2008-12-10
  • 打赏
  • 举报
回复
发现确实很简单
mynameisslim 2008-12-10
  • 打赏
  • 举报
回复

#include<stdio.h>
int score(char strlist[])
{
int i,isS=0,isC=0,isD=0,countH=0,Hnum[14],score=0;
int Hlist[14]={0,-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40};
for(i=0;strlist[i]!='\0';i++)
{
if(strlist[i]=='S') isS=1;
else if(strlist[i]=='C') isC=1;
else if(strlist[i]=='D') isD=1;
else if(strlist[i]=='H')
{
countH++;
if(strlist[i+2]==' '||strlist[i+2]=='\0') Hnum[countH]=strlist[i+1]-'0';
else Hnum[countH]=10+strlist[i+2]-'0';
}
}
if(countH==13) //H全在一人手中
{
score=200;
if(isS&&isD) score=500;
else if(isS) score-=100; //分别有S和D的情况
else if(isD) score+=100;
}
else if(0<=countH && countH<13) //H不全在一个人的手中
{
for(i=1;i<=countH;i++) score+=Hlist[Hnum[i]];
if(isS) score-=100;
if(isD) score+=100;
}
if(isC)
{
if(isS==0 && isD==0 && countH==0) score=50; //只有C10的情况
else score*=2; //分数加倍
}
return score;
}
main()
{
char strin[4][100];
int i,j,result[10][4],count=0;
while(1)
{
for(i=0;i<=3;i++) gets(strin[i]);
if(strin[0][0]=='0'&&strin[1][0]=='0'&&strin[2][0]=='0'&&strin[3][0]=='0') break;
for(i=0;i<=3;i++) result[count][i]=score(strin[i]);
count++;
}
for(i=0;i<=count-1;i++)
for(j=0;j<=3;j++)
{
if(j<3) (result[i][j]<=0)?printf("%d ",result[i][j]):printf("+%d ",result[i][j]);
else (result[i][j]<=0)?printf("%d\n",result[i][j]):printf("+%d\n",result[i][j]);
}
}
mynameisslim 2008-12-10
  • 打赏
  • 举报
回复

#include<stdio.h>
int score(char strlist[])
{
int i,isS=0,isC=0,isD=0,countH=0,Hnum[14],score=0;
int Hlist[14]={0,-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40};
for(i=0;strlist[i]!='\0';i++)
{
if(strlist[i]=='S') isS=1;
else if(strlist[i]=='C') isC=1;
else if(strlist[i]=='D') isD=1;
else if(strlist[i]=='H')
{
countH++;
if(strlist[i+2]==' '||strlist[i+2]=='\0') Hnum[countH]=strlist[i+1]-'0';
else Hnum[countH]=10+strlist[i+2]-'0';
}
}
if(countH==13) //H全在一人手中
{
score=200;
if(isS&&isD) score=500;
else if(isS) score-=100; //分别有S和D的情况
else if(isD) score+=100;
}
else if(0<=countH && countH<13) //H不全在一个人的手中
{
for(i=1;i<=countH;i++) score+=Hlist[Hnum[i]];
if(isS) score-=100;
if(isD) score+=100;
}
if(isC)
{
if(isS==0 && isD==0 && countH==0) score=50; //只有C10的情况
else score*=2; //分数加倍
}
return score;
}
main()
{
char strin[4][100];
int i,j,result[10][4],count=0;
while(1)
{
for(i=0;i<=3;i++) gets(strin[i]);
if(strin[0][0]=='0'&&strin[1][0]=='0'&&strin[2][0]=='0'&&strin[3][0]=='0') break;
for(i=0;i<=3;i++) result[count][i]=score(strin[i]);
count++;
}
for(i=0;i<=count-1;i++)
for(j=0;j<=3;j++)
{
if(j<3) (result[i][j]<=0)?printf("%d ",result[i][j]):printf("+%d ",result[i][j]);
else (result[i][j]<=0)?printf("%d\n",result[i][j]):printf("+%d\n",result[i][j]);
}
}
t1397018 2008-12-09
  • 打赏
  • 举报
回复
看起来麻烦,事实上不难

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧