例題4-2 劊子手遊戲(Hangman Judge, UVa 489)
劊子手遊戲其實是一款猜單詞遊戲,如圖所示。遊戲規則是這樣的:計算機想一個單詞 讓你猜,你每次可以猜一個字母。如果單詞裏有 那個字母,所有該字母會顯示出來;如果沒有那 個字母,則計算機會在一幅“劊子手”畫上填一 筆。這幅畫一共需要7筆就能完成,因此你最多 只能錯6次。注意,猜一個已經猜過的字母也算 錯。
在本題中,你的任務是編寫一個“裁判”程 序,輸入單詞和玩家的猜測,判斷玩家贏了 (You win.)、輸了(You lose.)還是放棄了 (You chickened out.)。每組數據包含3行,第1 行是遊戲編號(-1爲輸入結束標記),第2行是 計算機想的單詞,第3行是玩家的猜測。後兩行 保證只含小寫字母。
樣例輸入:
1
cheese
chese
2
cheese
abcdefg
3
cheese
abcdefgij
-1
樣例輸出:
Round 1
You win.
Round 2
You chickened out.
Round 3
You lose.
程序4-11 劊子手遊戲
#include<stdio.h>
#include<string.h>
#define maxn 100
int left, chance; //還需要猜left個位置,錯chance次之後就會輸
char s[maxn], s2[maxn]; //答案是字符串s,玩家猜的字母序列是s2
int win, lose; //win=1表示已經贏了;lose=1表示已經輸了
void guess(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;
if(!chance) lose = 1;
if(!left) win = 1;
}
int main() {
int rnd;
while(scanf("%d%s%s", &rnd, s, s2) == 3 && rnd != -1) {
printf("Round %d\n", rnd);
win = lose = 0;//求解一組新數據之前要初始化
left = strlen(s);
chance = 7;
for(int i = 0; i < strlen(s2); i++) {
guess(s2[i]); //猜一個字母
if(win || lose) break;//檢查狀態
} //根據結果進行輸出
if(win) printf("You win.\n");
else if(lose) printf("You lose.\n");
else printf("You chickened out.\n");
}
return 0;
}
- scanf的返回值:遇到錯誤或遇到end of file,返回值爲-1。爲EOF