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

时间:2021-12-03 19:41:55
#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函数里都要用的字符都要全局声明 不然就要用指针(不会