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