劊子手游戲其實是一款猜單詞游戲、游戲規則是這樣的:計算機想一個單詞讓你猜,你每次可以猜一個字母。如果單詞里有那個字母,所有該字母會顯示出來;
如果沒有那個字母,則計算機會在一幅“劊子手”畫上填一筆。這幅畫一共需要7筆就能完成,因此你最多只能錯6次。
注意,猜一個已經猜過的字母也算錯。
在本題中,你的任務是編寫一個“裁判”程序,輸入單詞和玩家的猜測,判斷玩家贏了(Youwin.)、輸了(You lose. )還是放棄了(You chickened out.)。
每組數據包含了行,第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.
【代碼如下】
先來看一個稍微麻煩點的
題目要求猜一個已經猜過的字母也算錯,所以我用了一個數組來標記這個單詞是不是第一次出現。
注意我用的全局變量的好處,這樣使得代碼變得簡潔,我不需要把所有的值都傳給函數過去,指針太多的話就會讓人頭暈。(當然喜歡指針的大佬當我沒說......)
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 string s1, s2; 5 int guessFrequency, chance;// 還需要猜guessFrequency次個位置,錯chance次后就會輸 6 int win, lose;//win = 1 表示贏, lose = 1 表示輸 7 bool guessed[256];//題目要求猜重復的元素也是錯誤的 這個數組用於標記出現過的字母 8 void guess(char ch) { 9 if (guessed[ch - 'A'] == true){ 10 --chance; 11 if (!chance) lose = 1; 12 return; 13 } 14 15 int sign = 1; //用於后面的標記 16 for (int i = 0; i < s1.length(); i++) { 17 if (s1[i] == ch) { //相等的話 18 guessFrequency--; //還需要猜的次數減一 19 sign = 0; //標志找到了相同的字母 20 } 21 } 22 guessed[ch - 'A'] = true; 23 if (sign) --chance; //沒有找到的情況下猜的機會減一次 24 if (!chance) lose = 1; //還能猜的機會已經用完了 25 if (!guessFrequency) win = 1; //全猜對了 26 27 } 28 29 int main() 30 { 31 32 int round; //用於輸出次數 33 while ((cin >> round >> s1 >> s2) && round != -1) {// 34 memset(guessed, false, sizeof(guessed));//沒處理一個都需要初始化 35 //if (round == -1) break; 36 cout << "Round " << round << endl; 37 win = lose = 0; //求解沒一組數據之前記得初始化為0 38 guessFrequency = s1.length(); //left初始化為保存待猜單詞的長度 39 chance = 7; //能猜錯的次數 40 for (int i = 0; i < s2.length(); i++) { //對待猜單詞的每個字母進行判斷 41 guess(s2[i]); 42 if (win || lose)break; //退出條件 43 } 44 45 //對退出的情況進行判斷 46 if (win) cout << "You win." << endl; 47 else if (lose)cout << "You lose." << endl; 48 else 49 cout << "You chickende out." << endl; 50 } 51 52 53 54 return 0; 55 }
在仔細想想這個標記數組是不是有必要的呢,好像也可以不用這個數組。
下面來看看這個進階的代碼。
1 #include<iostream>
2 #include<string>
3 using namespace std; 4 string s1, s2; 5 int guessFrequency, chance;// 還需要猜guessFrequency次個位置,錯chance次后就會輸
6 int win, lose;//win = 1 表示贏, lose = 1 表示輸
7
8 void guess(char ch) { 9 int sign = 1; //用於后面的標記
10 for (int i = 0; i < s1.length(); i++) { 11 if (s1[i] == ch) { //相等的話
12 guessFrequency--; //還需要猜的次數減一
13 s1[i] = ' '; //題目要求,猜一個猜過的也算錯。我這里就把猜過的全部置為空
14 sign = 0; //標志找到了相同的字母
15 } 16 } 17 if (sign) --chance; //沒有找到的情況下猜的機會減一次
18 if (!chance) lose = 1; //還能猜的機會已經用完了
19 if (!guessFrequency) win = 1; //全猜對了
20
21 } 22
23 int main() 24 { 25 int round; //用於輸出次數
26 while ((cin >> round >> s1 >> s2)&& round != -1 ) {//
27 //if (round == -1) break;
28 cout << "Round " << round << endl; 29 win = lose = 0; //求解沒一組數據之前記得初始化為0
30 guessFrequency = s1.length(); //left初始化為保存待猜單詞的長度
31 chance = 7; //能猜錯的次數
32 for (int i = 0; i < s2.length(); i++) { //對待猜單詞的每個字母進行判斷
33 guess(s2[i]); 34 if (win || lose)break; //退出條件
35 } 36
37 //對退出的情況進行判斷
38 if (win) cout << "You win." << endl; 39 else if (lose)cout << "You lose." << endl; 40 else
41 cout << "You chickende out." << endl; 42 } 43
44
45
46 return 0; 47 }