This commit is contained in:
2025-10-26 20:44:58 +08:00
parent e287aadd3c
commit e73c08abf7
45 changed files with 280774 additions and 0 deletions

View File

@@ -0,0 +1,147 @@
# 战斗邀请响应功能修复
## 问题描述
当玩家在游戏大厅收到战斗邀请时,输入 `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. 添加邀请队列,显示所有待处理的邀请