刽子手游戏
刽子手游戏其实是一款猜单词游戏、游戏规则是这样的:计算机想一个单词让你猜,你每次可以猜一个字母。如果单词里有那个字母,所有该字母会显示出来;
如果没有那个字母,则计算机会在一幅“刽子手”画上填一笔。这幅画一共需要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 }