天天看點

UVa 489 Hangman Judge 劊子手遊戲

UVa 489 Hangman Judge 劊子手遊戲

UVa Online Judge 題目連結

  • 題目名稱:劊子手遊戲
  • 題目描述:
  • 遊戲規則,計算機想一個單詞讓你猜,你每次可以猜一個字母,如果單詞裡有那個字母,所有該字母都會顯示出來,如果沒有那個字母
  • 則計算機會在一副“劊子手”畫上填一筆,這幅畫一共需要7筆就能完成,是以你最多隻能錯6次。注意猜一個已經猜過的字母也算錯。
  • 在本題中,你的任務是編寫一個“裁判”程式,輸入單詞和玩家的猜測,判斷玩家赢了,(You win.)、輸了(You lose.)、還是放棄了(You chickened out.)
  • 每組包含3行,第一行是遊戲編号(-1為輸入結束标記),第2行是計算機想的單詞,第3行是玩家的猜測。後兩行保證隻含小寫字母

    / 題目分析:**

    • 分析題目需要注意的變量,還需要猜的變量left,初始值為計算機想猜單詞的長度,機會choose,初始值為7,如果left = 0那麼赢了;如果choose為0了,那麼就輸了
    • 首先需要定義兩個字元串,一個是答案,一個玩家猜的字元串;
    • 最後給一個子函數,如果猜對一個單詞,我們left--; 加入猜錯了那麼機會choose則少一次,
    • 這裡還需要注意如果前面猜過的單詞,現在不能繼續猜了,我們可以利用一個小技巧,把拆對的字元變成空格。
    • 寫子函數的時候,我們需要判斷如果猜錯,我們要把機會減去1,但是這個猜錯我們不好寫在循環裡面,因為要将該猜的單詞全部循環一遍,沒有,猜能說猜錯了
    • 是以我們這個時候常見的處理方案是加一個标記flag.

      * 學習筆記

    • ①拿到題目一定要注意有不同輸出的臨界是什麼?這裡赢了,說明需要猜的向量left為0,輸了,說明猜錯了7次了也就是說chance為0了,其他情況則是放棄。
    • ②之後我們要找這些變量的初始狀态是多少? 需要猜的向量初始化應該是字元s1的長度,chance初始大小應該是7
    • ③我們這個時候該考慮猜字元了,一個一個猜,是以外循環應該是猜字元的,之後判斷對不對,内循環應該是需要猜的字元。如果猜錯一個,則chance-1,如果猜對一個
    • 說明我們left-1
    • ④我們這裡還需要注意的是,我們猜錯情況,不好寫在循環裡面時候,我們可以通過加一個标志标量來過渡。
    • ⑤這裡還需要注意的是因為原題中要保證猜過的單詞不能繼續猜,是以我們為了不儲存哪些猜過,哪些沒有猜過,我們直接把猜過的單詞指派空格
    • ⑥這道題要與Example 3-4的猜字遊戲區分開來,那道題要求位置也要一緻,思路,首先我們設定兩個數組,放正确數字和猜測的數字,之後直接如果a[i] = b[i]時我們就把
    • 猜對位置A++,之後統計1-9數字在答案序列和猜測序列各出現的次數,我們取最小值得到B,這個時候我們就可以知道B為猜對位置A,還有兩個序列都出現過,但是位置不對的。

參考代碼:

#include<stdio.h>
#include<string.h>
#define maxn 100
int left, chance;
char s1[maxn], s2[maxn];

void guess(char ch)
{
    int flag = 1;
    for(int i = 0; i < strlen(s1); i++)
    {
        if(s1[i] == ch)
        {
            left--;
            s1[i] = ' ';
            flag = 0;
        }
    }
    if(flag) --chance;
}

int main()
{
    int game;
    while(scanf("%d%s%s",&game, s1, s2) != EOF && game != -1)
    {
        printf("Round %d\n", game);
        left = strlen(s1);
        chance = 7;
        for(int i = 0; i < strlen(s2); i++)
        {
            guess(s2[i]);
        }
        if(!chance)
            printf("You lose.\n");
        else if(!left)
            printf("You win.\n");
        else
            printf("You chickened out.\n");
    }
    return 0;
}