例题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函数里都要用的字符都要全局声明 不然就要用指针(不会

浙公网安备 33010602011771号