侧边栏
首页代码

例题4-2 刽子手游戏(Hangman Judge, UVa 489)

#include<stdio.h>
#include<string.h>
int ok ,no;
int left ,chance;
char s[20] ,s2[20];
void guess(char ch)
{
    int i ,bad = 1;
    for(i = 0;i < strlen(s);i++)
    {
        if(ch == s[i])
        {
            left--;
            bad = 0;
            s[i] = ' ';
        }
    }
    if(bad) chance--;
    if(!left)
    {
        ok = 1;
    }
    else if(!chance)
    {
        no = 1;
    }
}
int main()
{
    int rnd;
    while(scanf("%d" ,&rnd) == 1 && rnd != -1)
    {
        scanf("%s %s" ,s ,s2);
        ok = no = 0;
        left = strlen(s);
        chance = 7;
        printf("Round %d\n" ,rnd);
        int i;
        for(i = 0;i < strlen(s2);i++)
        {
            guess(s2[i]);
            if(ok || no) break;
        }
        if(ok)
        {
            printf("You win.\n");
        }
        else if(no)
        {
            printf("You lose.\n");
        }
        else
        {
            printf("You chickened out.\n");
        }

    }
    return 0;
}

1.大体思路是构思一个guess函数 让每一个猜测的字符和正确的字符串单个一一比较 如果一样的话 就让剩余要猜测的字符数量(left)减一;

不一样的就让猜测机会(chance)减一

但这思路有问题 导致我多次WA     猜错的时候让机会减一就有问题 因为不管每个猜测字符都要与所有正确字符比较 必然会有错误的 这样机会就会多减少很多 所以一开始不管我输入什么数据得出的结果都是You lose  应该设置一个一开始为真的bad 如果在正确字符串中找到一个和猜测字符一样的 就让bad为假 这样只要有一个一样的 bad就是假 没有一样的bad就为真 这样依靠bad来控制chance的加减就很nice

正确时也不能只让left减一 因为猜测字符可以重复(脑残设定)   要让猜对的字符消失 这样防止第二次猜上一次猜对的那个字符时 left多减了一倍

2.自定义函数和main函数里都要用的字符都要全局声明 不然就要用指针(不会

 

posted @ 2020-10-03 13:21  AlexStraightUp  阅读(87)  评论(0)    收藏  举报
页脚HTML代码