4.4 競賽題目選講

例題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;
}
  1. scanf的返回值:遇到錯誤或遇到end of file,返回值爲-1。爲EOF
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章