刽子手游戏

刽子手游戏其实是一款猜单词游戏、游戏规则是这样的:计算机想一个单词让你猜,你每次可以猜一个字母。如果单词里有那个字母,所有该字母会显示出来;

如果没有那个字母,则计算机会在一幅“刽子手”画上填一笔。这幅画一共需要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 }

 

posted @ 2018-06-28 12:57  底层码农  阅读(1970)  评论(0编辑  收藏  举报