劊子手游戲


劊子手游戲其實是一款猜單詞游戲、游戲規則是這樣的:計算機想一個單詞讓你猜,你每次可以猜一個字母。如果單詞里有那個字母,所有該字母會顯示出來;

如果沒有那個字母,則計算機會在一幅“劊子手”畫上填一筆。這幅畫一共需要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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM