Hangman Judge
阿新 • • 發佈:2019-02-13
題目大意:
有一個“劊子手遊戲”,想好一個單詞後讓人猜字母,如果猜對就會顯示字母的位置,如果猜錯就會在圖畫上加一筆(注意已經猜過的字母即便是正確的,再猜也算錯),直到畫出一個絞刑架上的人為止(需要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記錄需要猜的字母種類,猜對一個就去掉一個,如果全部猜出就贏了,如果沒有全猜出來並且機會用盡就輸了,如果還有機會並沒有猜完就結束就放棄了。