1 条题解

  • 0
    @ 2025-4-7 19:34:34

    说明

    这段代码实现了一个名为"LINGO"的文字游戏模拟器。游戏规则是玩家需要猜出一个5个字母的秘密单词,程序会根据玩家的每次猜测给出反馈:

    • 大写字母表示字母和位置都正确
    • 小写字母表示字母正确但位置错误
    • 点号(.)表示字母不存在于秘密单词中

    算法标签

    • 字符串处理:处理单词猜测和反馈生成
    • 游戏逻辑:实现LINGO游戏的核心规则
    • 输入验证:检查猜测的有效性

    解题思路

    1. 游戏初始化:读取秘密单词,显示首字母和四个点号
    2. 猜测处理循环
      • 读取玩家猜测
      • 验证猜测是否有效(5个大写字母)
      • 检查是否猜中秘密单词
      • 生成反馈字符串
    3. 游戏结束条件
      • 猜中秘密单词
      • 达到6次猜测限制
    4. 特殊处理:当秘密单词为"LINGO"时终止程序

    分析

    1. 输入处理:使用getline读取输入,处理空行和游戏终止条件
    2. 反馈生成
      • 首先标记完全匹配的字母(大写)
      • 然后标记存在但位置不匹配的字母(小写)
      • 最后用点号标记不存在的字母
    3. 边界情况
      • 处理无效猜测(重复上次反馈)
      • 处理猜测次数限制
      • 处理游戏终止条件

    实现步骤

    1. 读取秘密单词
    2. 显示初始提示(首字母+四个点)
    3. 进入猜测循环:
      • 读取猜测
      • 验证猜测格式
      • 检查是否猜中
      • 生成反馈
      • 更新猜测次数
    4. 处理游戏结束:
      • 猜中时显示全大写秘密单词
      • 6次未猜中时显示小写秘密单词
    5. 处理游戏终止条件

    代码解释

    • over()函数:处理输入缓冲区中的剩余行
    • 主循环
      • 读取秘密单词,检查终止条件
      • 初始化游戏状态
      • 处理每次猜测:
        • 验证格式
        • 生成反馈
        • 更新游戏状态
    • 反馈生成逻辑
      • 两轮扫描:先找完全匹配,再找位置不匹配
      • 使用临时字符串和标记数组避免重复匹配

    这个实现完整地模拟了LINGO游戏的逻辑,包括输入验证、反馈生成和游戏流程控制,能够正确处理各种边界情况。

    代码

    #include <iostream>
    #include <string>
    #include <cctype>
    using namespace std;
    
    void over() {
        string line;
        while (getline(cin, line)) {
            if (line.empty()) {
                break;
            }
        }
    }
    
    int main() {
        string s;
        while (getline(cin, s)) {
            if (s == "LINGO") {
                break;
            }
            if (s.empty()) {
                continue;
            }
            cout << endl;
            string r = s;
            string last(5, '.');
            last[0] = r[0];
            cout << last << endl;
            int time = 1;
            while (true) {
                if (!getline(cin, s)) { // 处理可能的输入结束
                    break;
                }
                if (s.empty()) { // 内层循环结束
                    if (time <= 6) {
                        string lower_r = r;
                        for (char &c : lower_r) {
                            c = tolower((unsigned char)c);
                        }
                        cout << lower_r << endl;
                    }
                    break;
                }
                // 检查是否有效
                bool valid = (s.length() == 5);
                if (valid) {
                    for (int i = 0; i < 5; ++i) {
                        if (!isupper((unsigned char)s[i])) {
                            valid = false;
                            break;
                        }
                    }
                }
                if (!valid) {
                    cout << last << endl;
                    ++time;
                    continue;
                }
                // 是否正确
                if (s == r) {
                    cout << r << endl;
                    over();
                    break;
                }
                if (time == 6) {
                    string lower_r = r;
                    for (char &c : lower_r) {
                        c = tolower((unsigned char)c);
                    }
                    cout << lower_r << endl;
                    over();
                    break;
                }
                // 处理buff
                string buff(5, '.');
                string temp = r;
                bool used[5] = {false};
                // 检查正确位置
                for (int i = 0; i < 5; ++i) {
                    if (temp[i] == s[i]) {
                        buff[i] = s[i];
                        temp[i] = ' ';
                        used[i] = true;
                    }
                }
                // 检查存在但位置不正确
                for (int i = 0; i < 5; ++i) {
                    if (used[i]) continue;
                    size_t pos = temp.find(s[i]);
                    if (pos != string::npos) {
                        buff[i] = tolower((unsigned char)s[i]);
                        temp[pos] = ' ';
                        used[i] = true;
                    }
                }
                cout << buff << endl;
                last = buff;
                ++time;
            }
        }
        return 0;
    }
    • 1

    信息

    ID
    220
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者