如何为C++ if语句添加额外玩家名称判定条件?
解决多玩家名称条件的C++ if语句问题
我明白你的困扰——原本单玩家名称的逻辑正常,但添加多个玩家时就失效,大概率是逻辑运算符优先级或者写法细节出了问题。咱们一步步来修正:
先看你原本的核心条件(正常工作版)
if (this->beginWith("/maxstatsz") && this->GetAdmin() >= 8 && !name.compare("jack")) { // 你的Buff和通知逻辑 }
这个条件的逻辑是:命令匹配 + 管理员等级≥8 + 玩家名严格等于jack,没问题。
错误写法的常见坑
你提到用||或else if失败,最可能的原因是没给多名称判断加括号,因为&&的优先级比||高,直接写会导致逻辑错乱。比如错误写法:
// 错误:逻辑优先级会让this->GetAdmin() >=8只和!name.compare("jack")绑定 if (this->beginWith("/maxstatsz") && this->GetAdmin() >=8 && !name.compare("jack") || !name.compare("hero")) { // ... }
这种写法会被解析成:(命令匹配 && 等级≥8 && 是jack) 或者 (是hero)——这就绕开了管理员等级的限制,显然不是你要的效果。
正确的多名称判断写法
写法1:用括号包裹所有名称判断(最直接)
把多个玩家名称的比较用括号括起来,确保它们和管理员等级条件是且的关系:
string name = reinterpret_cast<const char*>(this->Playerptr + 32); if (this->beginWith("/maxstatsz") && this->GetAdmin() >= 8 && (!name.compare("jack") || !name.compare("hero") || !name.compare("john"))) { this->forward = false; this->Buff(46, (30 * 60), 1000); this->Buff(47, (30 * 60), 1000); this->Buff(48, (30 * 60), 1000); this->Buff(49, (30 * 60), 1000); this->Buff(12, (30 * 60), 1000); Server::CPlayer::Write((void*)this->Playerptr, 60, "ss", "Server", "#Enabled Buffs!"); }
这里的关键是(!name.compare("jack") || !name.compare("hero") || !name.compare("john"))——括号让这一组名称判断作为整体,和前面的&&条件绑定,确保只有管理员等级≥8且名字在列表里的玩家才能触发。
写法2:用集合存储允许的名称(更易维护)
如果以后还要加更多玩家,每次改条件表达式太麻烦,可以用std::unordered_set来存储允许的名字,代码更整洁:
#include <unordered_set> // 需要包含头文件 // 可以把这个集合定义成全局或类成员,避免每次创建 const std::unordered_set<std::string> allowedPlayers = {"jack", "hero", "john"}; string name = reinterpret_cast<const char*>(this->Playerptr + 32); if (this->beginWith("/maxstatsz") && this->GetAdmin() >= 8 && allowedPlayers.find(name) != allowedPlayers.end()) { // 你的Buff和通知逻辑 }
这种方式以后加新玩家,只需要修改allowedPlayers的初始化列表即可,不用动条件判断的逻辑,可读性和可维护性更好。
额外检查点
如果还是失效,可以排查这几点:
- 玩家名称是否有大小写差异?比如实际玩家名是Hero,但你写的是hero,
compare是区分大小写的。如果需要不区分大小写,可以用strcasecmp(C风格)或者自己实现大小写不敏感的比较。 name变量的取值是否正确?可以加个日志输出cout << "Current player name: " << name << endl;,确认获取到的玩家名和你预期的一致。
内容的提问来源于stack exchange,提问作者J. Adam
相关产品推荐
相关产品推荐

