1. 程式人生 > >Hangman Judge

Hangman Judge


題目大意:

有一個“劊子手遊戲”,想好一個單詞後讓人猜字母,如果猜對就會顯示字母的位置,如果猜錯就會在圖畫上加一筆(注意已經猜過的字母即便是正確的,再猜也算錯),直到畫出一個絞刑架上的人為止(需要7筆畫完,最多猜錯6次)。寫一個裁判程式,根據猜測結果判斷輸贏或者放棄。多組輸入,第一行是回合數,回合數為-1時結束,第二行是需要猜的單詞,第三行是猜測的過程。

程式碼:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int main()
{
    int kase;    //回合數
    string ans;    //結果字串
    string guess;    //猜測字母序列
    int a[27];    //儲存ans中每個字母的出現情況,0是沒有,1是出現過
    while(cin >> kase && kase != -1)
    {
        memset(a,0,sizeof(a));
        cin >> ans >> guess;
        int change = 7;    //猜測機會的次數
        int cnt = 0;    //ans中包含的字母種類數
        int len1 = ans.length();
        int len2 = guess.length();
        for(int i=0; i<len1; i++)
        {
            if(a[ans[i]-'a'] == 0)
            {
                a[ans[i]-'a']++;
                cnt++;
            }
        }
        for(int i=0; i<len2; i++)
        {
            if(a[guess[i]-'a'] > 0)
            {
                cnt--;    //猜對,需要猜的字母種類減少
                a[guess[i]-'a']--;    //猜過的字母不能再猜
            }
            else
                change--;    //猜錯,機會減少
            if(change == 0 || cnt == 0)    //機會耗盡或者已經猜出單詞
                break;
        }
        cout << "Round " << kase << endl;
        if(cnt == 0)
            cout << "You win." << endl;
        else if(change == 0)
            cout << "You lose." << endl;
        else
            cout << "You chickened out." << endl;
    }
    return 0;
}

反思:

有趣的字串練習題。用一個a陣列儲存ans中字母的種類,cnt記錄需要猜的字母種類,猜對一個就去掉一個,如果全部猜出就贏了,如果沒有全猜出來並且機會用盡就輸了,如果還有機會並沒有猜完就結束就放棄了。