Uva-489 - Hangman Judge(刽子手游戏)

  • 游戏规则,计算机想一个单词让你猜,你每次可以猜一个字母,如果单词里有那个字母,所有该字母都会显示出来,如果没有那个字母
  • 则计算机会在一副“刽子手”画上填一笔,这幅画一共需要7笔就能完成,因此你最多只能错6次。注意猜一个已经猜过的字母也算错。
  • 在本题中,你的任务是编写一个“裁判”程序,输入单词和玩家的猜测,判断玩家赢了,(You win.)、输了(You lose.)、还是放弃了(You chickened out.)
  • 每组包含3行,第一行是游戏编号(-1为输入结束标记),第2行是计算机想的单词,第3行是玩家的猜测。后两行保证只含小写字母。

   这题跟着小紫薯刷的,Uva真的有点逗啊..相同的代码第一次WA,第二次WA,第三次改了 MAXN=1000 就AC了,再提交一次没改过的也AC了。。
   刷个小水不容易..还卡我这么久,问苍天问大地,我踏马又哪里错了!!!
   小人需要七笔完成,就等于说你有六次机会,第七次错的时候,小人就 game over 咯。 

核心思想就是一个 Guess 函数,假设电脑给你的字符串长度为 6 ,那么你需要抵消的次数为6。
用户所猜想的字符串存入 guess 数组,做一个从头到尾的循环,将每次从 guess[ ] 中拿到的字母与 ans[ ]的每个元素比较,
如果这个 guess[] 中拿到的元素与 ans[ ] 某一元素相等,则抵消次数减一。
   
第二个样例:
          2
        ans[]:cheese
        guess[]:abcdefg

    1)游戏者猜想的一个字母 guess[0] 为 ‘a’ ,而 ans[ ] 里没有这个元素,机会减一;
    2)直到,guess[2] 为‘ c’ ,与 ans[ 0 ] 的元素抵消,为了体现抵消,将 ans[0] 内存储的元素改为 ‘ ’ (空格),抵消次数减一;
    3)guess[ 4 ] 为 ‘ e ’ 将 ans 中所有的 ‘ e ’ 元素抵消,存储元素改为 ‘ ’ (空格),抵消次数减去三;
    4)此时游戏者猜想的字符串已经全部比较完毕,黑色的字母代表猜错,机会减去五,现在机会为 2 表明还有机会,游戏者却不在出字母猜测,因而输出放弃,“You chickened out. 

0.075s AC 代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
using namespace std;

const int MAXN = 100;
char ans[MAXN],guess[MAXN];
int len,chance;
int win,lose;

void Guess( char ch )
{

    int bad = 1;
    for( int i = 0 ;i <strlen(ans);++i)
        if( ans[i] == ch)
        {
            len--;
            ans[i] = ' ';
            bad = 0;
        }
    if( bad )--chance;
    if( !chance )lose = 1;
    if( !len )win = 1;


}

void Work()
{
     int glen = strlen(guess);

     for( int i = 0; i < glen ; ++i)
            {
                Guess( guess[i] );
                if( win || lose )break;
            }
}

void Output(int &n)
{

    printf("Round %d\n",n);

    if( win )
        puts("You win.");
    else
        if( lose )
        puts("You lose.");
    else
        puts("You chickened out.");
}

int main()
{
  //  freopen("in.txt","r",stdin);

    int n;
    while ( ~scanf("%d%*c",&n) && ( n!=-1))
    {

        gets(ans);
        gets(guess);

        win  = lose = 0;
        len = strlen(ans);
        chance = 7;

        Work();
        Output(n);

    }

    return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值