1 条题解
-
0
说明
这段代码实现了一个名为"LINGO"的文字游戏模拟器。游戏规则是玩家需要猜出一个5个字母的秘密单词,程序会根据玩家的每次猜测给出反馈:
- 大写字母表示字母和位置都正确
- 小写字母表示字母正确但位置错误
- 点号(.)表示字母不存在于秘密单词中
算法标签
- 字符串处理:处理单词猜测和反馈生成
- 游戏逻辑:实现LINGO游戏的核心规则
- 输入验证:检查猜测的有效性
解题思路
- 游戏初始化:读取秘密单词,显示首字母和四个点号
- 猜测处理循环:
- 读取玩家猜测
- 验证猜测是否有效(5个大写字母)
- 检查是否猜中秘密单词
- 生成反馈字符串
- 游戏结束条件:
- 猜中秘密单词
- 达到6次猜测限制
- 特殊处理:当秘密单词为"LINGO"时终止程序
分析
- 输入处理:使用getline读取输入,处理空行和游戏终止条件
- 反馈生成:
- 首先标记完全匹配的字母(大写)
- 然后标记存在但位置不匹配的字母(小写)
- 最后用点号标记不存在的字母
- 边界情况:
- 处理无效猜测(重复上次反馈)
- 处理猜测次数限制
- 处理游戏终止条件
实现步骤
- 读取秘密单词
- 显示初始提示(首字母+四个点)
- 进入猜测循环:
- 读取猜测
- 验证猜测格式
- 检查是否猜中
- 生成反馈
- 更新猜测次数
- 处理游戏结束:
- 猜中时显示全大写秘密单词
- 6次未猜中时显示小写秘密单词
- 处理游戏终止条件
代码解释
- 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
- 上传者