刽子手游戏(Hangman judge,Uva489)

刽子手游戏(Hangman judge,Uva489)
游戏规则,计算机想一个单词让你猜,你每次可以猜一个字母,如果单词里有那个字母,所有该字母都会显示出来,如果没有那个字母
则计算机会在一副“刽子手”画上填一笔,这幅画一共需要7笔就能完成,因此你最多只能错6次。注意猜一个已经猜过的字母也算错。

在本题中,你的任务是编写一个“裁判”程序,输入单词和玩家的猜测,判断玩家赢了,(You win.)、输了(You lose.)、还是放弃了(You give up.)

每组包含3行,第一行是游戏编号(-1为输入结束标记),第2行是计算机想的单词,第3行是玩家的猜测。后两行保证只含小写字母

错误版本(未符合当出现查询重复字样显示查找错误)

#include<stdio.h>
#include<string.h>
#define maxn 100
char s[maxn],s2[maxn];      //全局变量可减少参数传递的麻烦,但应当少用
int left,chance;
int win,lose;

void guss(char ch){    
    int bad=1;
    for(int i=0;i<strlen(s);i++) 
    {
       if(s[i]==ch)  //可能存在出现相同字母解决方法是 判断如果匹配后就覆盖掉
        {
          left--;  
          s[i]=' ';   
          bad=0;  
        }
        if(bad) chance--;   //当匹配失败, chance -1 
        if(!chance) lose=1;   //当 chance为0 判定失败 
        if(!left) win=1;     // 当s 字符串匹配完毕,判定成功 
    }
}
int main (){
    int rand;
    while(scanf("%d%s%s",&rand,s,s2)==3&&rand!=-1)  //一边输入一边处理数据 ,rand=-1 结束程序 
    {
        printf("round %d\n",rand);
        win=lose=0;                     //每次循环都要重置 
        left=strlen(s);
        chance=7;                        //每次循环都要重置 
        for(int i=0;i<strlen(s2);i++)     //s2 字符串逐一判断 
        {
            guss(s2[i]);
            if(lose||win) break;
        }
    
    if(win)printf("you win");
    else if(lose)printf("you are lose");
    else printf("you chickened");
    
}
    return 0;
} 
修改版本
#include<stdio.h>
#include<string.h>
#define maxn 100
char s[maxn],s2[maxn];      //全局变量可减少参数传递的麻烦,但应当少用
int left,chance;
int win,lose;
int flag=1;
void guss(char ch){    
    int bad=1;
    for(int i=0;i<strlen(s);i++) 
    {
       if(s[i]==ch)  //可能存在出现相同字母解决方法是 判断如果匹配后就覆盖掉
        {
          left--;  
          s[i]=' ';   
          bad=0;  
        }
        if(bad) chance--;   //当匹配失败, chance -1 
        if(!chance) lose=1;   //当 chance为0 判定失败 
        if(!left) win=1;     // 当s 字符串匹配完毕,判定成功 
    }
}
int main (){
    int rand;
    while(scanf("%d%s%s",&rand,s,s2)==3&&rand!=-1)  //一边输入一边处理数据 ,rand=-1 结束程序 
    {
        printf("round %d\n",rand);
        win=lose=0;                     //每次循环都要重置 
        left=strlen(s);
        chance=7;       //每次循环都要重置 
      int len2=strlen(s2);
     
        int cnt=0;
        while(cnt<len2)    //判断是否存在重复字样
        {
            for(int i=cnt+1;i<len2;i++) 
            {
                if(s2[cnt]==s2[i])
                {
                lose=1;
                flag=0;
                }
            }
        cnt++;
      }
      if(flag==1)
        for(int i=0;i<strlen(s2);i++)     //s2 字符串逐一判断 
        {
            guss(s2[i]);
            if(lose||win) break;
        }
    
    if(win)printf("you win");
    else if(lose)printf("you are lose");
    else printf("you chickened");
    
}
    return 0;
} 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值