# 战斗邀请响应功能修复 ## 问题描述 当玩家在游戏大厅收到战斗邀请时,输入 `accept 20241111` 或 `reject 20241111` 会被识别为"无效选项",无法正确处理邀请响应。 ### 错误场景 ``` 【20245738】> *** 20241111 邀请你战斗!*** 输入 'accept 20241111' 接受,或 'reject 20241111' 拒绝 【20245738】> accept 20241111 无效选项。请输入1-5。 ❌ 错误提示 ``` ## 原因分析 在 `GameClient::handleLobbyInput()` 函数中,代码只处理数字选项 1-5,没有处理 `accept` 和 `reject` 命令。 ### 修复前的代码 ```cpp void GameClient::handleLobbyInput(const std::string& input) { if (input.empty()) { return; } if (input == "1") { // Chat ... } else if (input == "2") { // List players ... } // ... 其他选项 else { std::cout << "无效选项。请输入1-5。" << std::endl; // ❌ 所有非1-5的输入都报错 } } ``` ## 解决方案 在 `handleLobbyInput()` 函数开头添加邀请响应命令的处理逻辑: ### 修复后的代码 ```cpp void GameClient::handleLobbyInput(const std::string& input) { if (input.empty()) { return; } // ✅ 新增:检查是否是邀请响应命令 if (input.find("accept ") == 0 || input.find("reject ") == 0) { size_t spacePos = input.find(' '); if (spacePos != std::string::npos) { std::string response = input.substr(0, spacePos); // "accept" 或 "reject" std::string inviter = input.substr(spacePos + 1); // 邀请者用户名 bool accept = (response == "accept"); std::string msg = Protocol::buildMessage(Protocol::C2S_INVITE_RSP, {inviter, accept ? "yes" : "no"}); sendMessage(msg); } return; // 处理完毕,直接返回 } // 原有的菜单选项处理 if (input == "1") { ... } ... } ``` ## 功能说明 ### 1. 命令格式解析 - 检测以 `accept ` 或 `reject ` 开头的输入 - 提取命令类型(accept/reject) - 提取邀请者用户名 ### 2. 协议构建 - `accept username` → 发送 `INVITE_RSP|username|yes` - `reject username` → 发送 `INVITE_RSP|username|no` ### 3. 服务器处理 服务器收到邀请响应后,会通过 `ClientHandler::handleInviteResponse()` 处理: - 验证邀请是否有效 - 接受:创建战斗房间,双方进入战斗 - 拒绝:通知邀请者被拒绝 ## 正确使用流程 ### 玩家A(邀请方) ``` 【20241111】> 3 目标玩家用户名:20245738 【服务器】邀请已发送(等待服务器实现此消息) ``` ### 玩家B(被邀请方) ``` 【20245738】> *** 20241111 邀请你战斗!*** 输入 'accept 20241111' 接受,或 'reject 20241111' 拒绝 【20245738】> accept 20241111 ``` ### 接受邀请后 ``` *** 战斗开始!*** 对手:20241111 ... >>> 你的回合 <<< 【战斗】> ``` ### 拒绝邀请 ``` 【20245738】> reject 20241111 【服务器】已拒绝邀请 ``` ## 相关文件 - `src/client/GameClient.cpp` - 客户端输入处理 - `src/server/ClientHandler.cpp` - 服务器邀请响应处理 - `src/server/GameLobby.cpp` - 大厅邀请逻辑 - `include/common/Protocol.h` - 协议定义 ## 编译状态 ✅ 已重新编译 ✅ 客户端:76KB ✅ 服务器:1.7MB ✅ 无编译错误 ## 测试建议 1. 启动服务器 2. 启动两个客户端(玩家A和玩家B) 3. 玩家A邀请玩家B 4. 玩家B输入 `accept 玩家A用户名` 5. 验证双方是否成功进入战斗 ## 后续优化建议 1. 添加邀请发送成功的确认消息 2. 添加邀请超时机制(如30秒自动取消) 3. 支持简化命令:直接输入 `accept` 接受最近的邀请 4. 添加邀请队列,显示所有待处理的邀请