• 刽子手游戏


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

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

     

  • 相关阅读:
    hdu 1060 Leftmost Digit
    HDU 1081 To The Max 动态规划
    不安装Oracle客户端,透过PL/SQL Developer连接Server DB
    ASP.net:Ftp操作FtpWebRequest
    VS2008:log4net.dll 使用
    社会生活——《哥哥又逃票了》
    VS2008:AjaxPro.2 的应用
    Linq to SQL 根据自己需要更改数据源
    ExtJS Combobox 如何改变下拉列列宽问题
    ExtJs 的Enter特殊键事件处理
  • 原文地址:https://www.cnblogs.com/didiaodidiao/p/9238148.html
Copyright © 2020-2023  润新知