| @@ -2,4 +2,4 @@ | |||
| ## 简介 | |||
| 通信组件与选手接口 | |||
| 通信组件与选手接口。开发文档和规范参见 `cpp` 和 `python` 内的 `README.md` | |||
| @@ -93,6 +93,7 @@ | |||
| <AdditionalIncludeDirectories>..\spdlog\include;..\tclap\include;..\grpc\include;..\proto;include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions> | |||
| <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> | |||
| <MultiProcessorCompilation>true</MultiProcessorCompilation> | |||
| </ClCompile> | |||
| <Link> | |||
| <SubSystem>Console</SubSystem> | |||
| @@ -114,6 +115,7 @@ | |||
| <AdditionalIncludeDirectories>..\spdlog\include;..\tclap\include;..\grpc\include;..\proto;include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions> | |||
| <RuntimeLibrary>MultiThreaded</RuntimeLibrary> | |||
| <MultiProcessorCompilation>true</MultiProcessorCompilation> | |||
| </ClCompile> | |||
| <Link> | |||
| <SubSystem>Console</SubSystem> | |||
| @@ -135,6 +137,7 @@ | |||
| <AdditionalIncludeDirectories>..\spdlog\include;..\tclap\include;..\grpc\include;..\proto;include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions> | |||
| <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> | |||
| <MultiProcessorCompilation>true</MultiProcessorCompilation> | |||
| </ClCompile> | |||
| <Link> | |||
| <SubSystem>Console</SubSystem> | |||
| @@ -156,6 +159,7 @@ | |||
| <AdditionalIncludeDirectories>..\spdlog\include;..\tclap\include;..\grpc\include;..\proto;include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
| <AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions> | |||
| <RuntimeLibrary>MultiThreaded</RuntimeLibrary> | |||
| <MultiProcessorCompilation>true</MultiProcessorCompilation> | |||
| </ClCompile> | |||
| <Link> | |||
| <SubSystem>Console</SubSystem> | |||
| @@ -166,9 +166,9 @@ namespace Constants | |||
| struct Robot | |||
| { | |||
| SCCI int moveSpeed = basicStudentSpeed * 9 / 10; | |||
| SCCI int maxHp = basicHp * 0.3; | |||
| SCCI int maxHp = basicHp * 3 / 10; | |||
| SCCI int maxAddiction = basicMaxGamingAddiction * 0; | |||
| SCCI int fixSpeed = (int)(basicFixSpeed * 0.7); | |||
| SCCI int fixSpeed = basicFixSpeed * 7 / 10; | |||
| SCCI int encourageSpeed = 0; | |||
| SCCI double concealment = 0.8; | |||
| SCCI int alertnessRadius = 0; | |||
| @@ -472,9 +472,9 @@ namespace THUAI62Proto | |||
| { | |||
| protobuf::SendMsg sendMsg; | |||
| if (binary) | |||
| sendMsg.set_binary_message(msg); | |||
| sendMsg.set_binary_message(std::move(msg)); | |||
| else | |||
| sendMsg.set_text_message(msg); | |||
| sendMsg.set_text_message(std::move(msg)); | |||
| sendMsg.set_to_player_id(toID); | |||
| sendMsg.set_player_id(id); | |||
| return sendMsg; | |||
| @@ -192,26 +192,26 @@ std::future<bool> TrickerAPI::EndAllAction() | |||
| std::future<bool> StudentAPI::SendTextMessage(int64_t toID, std::string message) | |||
| { | |||
| return std::async(std::launch::async, [=]() | |||
| { return logic.SendMessage(toID, message, false); }); | |||
| return std::async(std::launch::async, [=, message = std::move(message)]() | |||
| { return logic.SendMessage(toID, std::move(message), false); }); | |||
| } | |||
| std::future<bool> TrickerAPI::SendTextMessage(int64_t toID, std::string message) | |||
| { | |||
| return std::async(std::launch::async, [=]() | |||
| { return logic.SendMessage(toID, message, false); }); | |||
| return std::async(std::launch::async, [=, message = std::move(message)]() | |||
| { return logic.SendMessage(toID, std::move(message), false); }); | |||
| } | |||
| std::future<bool> StudentAPI::SendBinaryMessage(int64_t toID, std::string message) | |||
| { | |||
| return std::async(std::launch::async, [=]() | |||
| { return logic.SendMessage(toID, message, false); }); | |||
| return std::async(std::launch::async, [=, message = std::move(message)]() | |||
| { return logic.SendMessage(toID, std::move(message), false); }); | |||
| } | |||
| std::future<bool> TrickerAPI::SendBinaryMessage(int64_t toID, std::string message) | |||
| { | |||
| return std::async(std::launch::async, [=]() | |||
| { return logic.SendMessage(toID, message, false); }); | |||
| return std::async(std::launch::async, [=, message = std::move(message)]() | |||
| { return logic.SendMessage(toID, std::move(message), false); }); | |||
| } | |||
| bool StudentAPI::HaveMessage() | |||
| @@ -119,7 +119,7 @@ bool Communication::SendMessage(int64_t toID, std::string message, bool binary, | |||
| } | |||
| protobuf::BoolRes sendMessageResult; | |||
| ClientContext context; | |||
| auto request = THUAI62Proto::THUAI62ProtobufSend(message, toID, binary, playerID); | |||
| auto request = THUAI62Proto::THUAI62ProtobufSend(std::move(message), toID, binary, playerID); | |||
| auto status = THUAI6Stub->SendMessage(&context, request, &sendMessageResult); | |||
| if (status.ok()) | |||
| return sendMessageResult.act_success(); | |||
| @@ -355,8 +355,8 @@ std::future<bool> TrickerDebugAPI::EndAllAction() | |||
| std::future<bool> StudentDebugAPI::SendTextMessage(int64_t toID, std::string message) | |||
| { | |||
| logger->info("SendTextMessage: toID = {}, message = {}, called at {}ms", toID, message, Time::TimeSinceStart(startPoint)); | |||
| return std::async(std::launch::async, [=]() | |||
| { auto result = logic.SendMessage(toID, message, false); | |||
| return std::async(std::launch::async, [=, message = std::move(message)]() | |||
| { auto result = logic.SendMessage(toID, std::move(message), false); | |||
| if (!result) | |||
| logger->warn("SendTextMessage: failed at {}ms", Time::TimeSinceStart(startPoint)); | |||
| return result; }); | |||
| @@ -365,8 +365,8 @@ std::future<bool> StudentDebugAPI::SendTextMessage(int64_t toID, std::string mes | |||
| std::future<bool> TrickerDebugAPI::SendTextMessage(int64_t toID, std::string message) | |||
| { | |||
| logger->info("SendTextMessage: toID = {}, message = {}, called at {}ms", toID, message, Time::TimeSinceStart(startPoint)); | |||
| return std::async(std::launch::async, [=]() | |||
| { auto result = logic.SendMessage(toID, message, false); | |||
| return std::async(std::launch::async, [=, message = std::move(message)]() | |||
| { auto result = logic.SendMessage(toID, std::move(message), false); | |||
| if (!result) | |||
| logger->warn("SendTextMessage: failed at {}ms", Time::TimeSinceStart(startPoint)); | |||
| return result; }); | |||
| @@ -375,8 +375,8 @@ std::future<bool> TrickerDebugAPI::SendTextMessage(int64_t toID, std::string mes | |||
| std::future<bool> StudentDebugAPI::SendBinaryMessage(int64_t toID, std::string message) | |||
| { | |||
| logger->info("SendBinaryMessage: toID = {}, message = {}, called at {}ms", toID, message, Time::TimeSinceStart(startPoint)); | |||
| return std::async(std::launch::async, [=]() | |||
| { auto result = logic.SendMessage(toID, message, true); | |||
| return std::async(std::launch::async, [=, message = std::move(message)]() | |||
| { auto result = logic.SendMessage(toID, std::move(message), true); | |||
| if (!result) | |||
| logger->warn("SendBinaryMessage: failed at {}ms", Time::TimeSinceStart(startPoint)); | |||
| return result; }); | |||
| @@ -385,8 +385,8 @@ std::future<bool> StudentDebugAPI::SendBinaryMessage(int64_t toID, std::string m | |||
| std::future<bool> TrickerDebugAPI::SendBinaryMessage(int64_t toID, std::string message) | |||
| { | |||
| logger->info("SendBinaryMessage: toID = {}, message = {}, called at {}ms", toID, message, Time::TimeSinceStart(startPoint)); | |||
| return std::async(std::launch::async, [=]() | |||
| { auto result = logic.SendMessage(toID, message, true); | |||
| return std::async(std::launch::async, [=, message = std::move(message)]() | |||
| { auto result = logic.SendMessage(toID, std::move(message), true); | |||
| if (!result) | |||
| logger->warn("SendBinaryMessage: failed at {}ms", Time::TimeSinceStart(startPoint)); | |||
| return result; }); | |||
| @@ -217,7 +217,7 @@ bool Logic::UseSkill(int32_t skill, int32_t skillParam) | |||
| bool Logic::SendMessage(int64_t toID, std::string message, bool binary) | |||
| { | |||
| logger->debug("Called SendMessage"); | |||
| return pComm->SendMessage(toID, message, binary, playerID); | |||
| return pComm->SendMessage(toID, std::move(message), binary, playerID); | |||
| } | |||
| bool Logic::HaveMessage() | |||
| @@ -74,7 +74,7 @@ C++ 通信组件与选手接口 | |||
| - 将之前提取的 Debug 和 Release 的 `.lib` 分别放在项目中的单独的文件夹里(THUAI6 使用的是 `CAPI\cpp\lib\debug` 和 `CAPI\cpp\lib\release`),并[使用 `.gitignore` 忽略掉](https://github.com/eesast/THUAI6/blob/c8e1fbe299c67a6e101fa02e85bcc971acd0f48b/CAPI/cpp/.gitignore#L502) | |||
| - 在项目属性的“链接器”的首页的“附加库目录”中分别配置 Debug 和 Release 的 [`.lib` 文件的相应路径](https://github.com/eesast/THUAI6/blob/c8e1fbe299c67a6e101fa02e85bcc971acd0f48b/CAPI/cpp/API/API.vcxproj#L166) | |||
| - 在项目属性中的“链接器”的“输入”的“附加依赖库”中分别配置 Debug 和 Release [所需要链接的库的文件名](https://github.com/eesast/THUAI6/blob/c8e1fbe299c67a6e101fa02e85bcc971acd0f48b/CAPI/cpp/API/API.vcxproj#L165)。注意 Debug 和 Release 链接的库可能并不完全相同,建议在 cmd 中使用 `dir /b` 将其自动列举并复制。还需要注意需要手动指定链接一些 Windows 自带的 `lib`,例如 `Ws2_32.lib`、`Crypt32.lib`、`Iphlpapi.lib` 等。如果生成过程中不通过,表示找不到一些函数,则在 Google 中搜索该函数,如果发现是 Windows 系统的 API 函数则会搜到[微软官方文档](https://learn.microsoft.com) 的对应链接的页面,则在页面最下方会表明它所在的 `.lib`(例如 [`CreateProcessA` 的页面](https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa#requirements)),加进去即可 | |||
| - 然后进行生成解决方案。如果感觉编译的速度过慢,可以在项目属性的 `C/C++` 的“所有选项”中搜索并行编译,并开启之(`/Qpar`)。不过由于 THUAI6 的疏忽,忘记开启了并行编译 | |||
| - 然后进行生成解决方案。如果感觉编译的速度过慢,可以在项目属性的 `C/C++` 的“所有选项”中搜索多处理器编译,并[开启(`/MP`)](https://github.com/eesast/THUAI6/blob/ad4db599f97449786e6c910940bf4f69224d5408/CAPI/cpp/API/API.vcxproj#L162) | |||
| - 然后开始运行。如果提示缺少一些 DLL,可以把之前保存的 `.dll` 文件(如果有的话)放在与 `.exe` 相同的目录下。该目录为**与 `.sln` 相同目录的**(不是与 `.vcxproj` 相同目录的)`x64\Debug` 和 `x64\Release` | |||
| - 如果 x64 的 Debug 和 x64 的 Release 均生成成功,那么找一台没配过的电脑再试一次 | |||
| - 随便写点 AI 代码,重新生成解决方案,确认成功后发布选手包 | |||