You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

API.h 15 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. #pragma once
  2. #ifndef API_H
  3. #define API_H
  4. #ifdef _MSC_VER
  5. #pragma warning(disable : 4996)
  6. #endif
  7. #include <Message2Server.pb.h>
  8. #include <Message2Clients.pb.h>
  9. #include <MessageType.pb.h>
  10. #include <Message2Server.grpc.pb.h>
  11. #include <Message2Clients.grpc.pb.h>
  12. #include <MessageType.grpc.pb.h>
  13. #include <future>
  14. #include <iostream>
  15. #include <vector>
  16. #include "structures.h"
  17. const constexpr int num_of_grid_per_cell = 1000;
  18. class IAI;
  19. class ILogic
  20. {
  21. // API中依赖Logic的部分
  22. public:
  23. // 获取服务器发来的所有消息,要注意线程安全问题
  24. virtual protobuf::MessageToClient GetFullMessage() = 0;
  25. // 供IAPI使用的操作相关的部分
  26. virtual bool Move(protobuf::MoveMsg) = 0;
  27. virtual bool PickProp(protobuf::PickMsg) = 0;
  28. virtual bool UseProp(protobuf::IDMsg) = 0;
  29. virtual bool UseSkill(protobuf::IDMsg) = 0;
  30. virtual void SendMessage(protobuf::SendMsg) = 0;
  31. virtual bool HaveMessage(protobuf::IDMsg) = 0;
  32. virtual protobuf::MsgRes GetMessage(protobuf::IDMsg) = 0;
  33. virtual bool Escape(protobuf::IDMsg) = 0;
  34. // 说明:双向stream由三个函数共同实现,两个记录开始和结束,结果由Logic里的私有的成员变量记录,获得返回值则另调函数
  35. virtual bool StartFixMachine(protobuf::IDMsg) = 0;
  36. virtual bool EndFixMachine(protobuf::IDMsg) = 0;
  37. virtual bool GetFixStatus() = 0;
  38. virtual bool StartSaveHuman(protobuf::IDMsg) = 0;
  39. virtual bool EndSaveHuman(protobuf::IDMsg) = 0;
  40. virtual bool GetSaveStatus() = 0;
  41. virtual bool Attack(protobuf::AttackMsg) = 0;
  42. virtual bool CarryHuman(protobuf::IDMsg) = 0;
  43. virtual bool ReleaseHuman(protobuf::IDMsg) = 0;
  44. virtual bool HangHuman(protobuf::IDMsg) = 0;
  45. virtual bool WaitThread() = 0;
  46. virtual int GetCounter() = 0;
  47. };
  48. class IAPI
  49. {
  50. public:
  51. // 选手可执行的操作,应当保证所有函数的返回值都应当为std::future,例如下面的移动函数:
  52. // 指挥本角色进行移动,`timeInMilliseconds` 为移动时间,单位为毫秒;`angleInRadian` 表示移动的方向,单位是弧度,使用极坐标——竖直向下方向为 x 轴,水平向右方向为 y 轴
  53. virtual std::future<bool> Move(uint32_t timeInMilliseconds, double angleInRadian) = 0;
  54. // 向特定方向移动
  55. virtual std::future<bool> MoveRight(uint32_t timeInMilliseconds) = 0;
  56. virtual std::future<bool> MoveUp(uint32_t timeInMilliseconds) = 0;
  57. virtual std::future<bool> MoveLeft(uint32_t timeInMilliseconds) = 0;
  58. virtual std::future<bool> MoveDown(uint32_t timeInMilliseconds) = 0;
  59. // 捡道具、使用技能
  60. virtual std::future<bool> PickProp() = 0;
  61. virtual std::future<bool> UseProp() = 0;
  62. virtual std::future<bool> UseSkill() = 0;
  63. // 发送信息、接受信息
  64. virtual std::future<bool> SendMessage(int, std::string) = 0;
  65. [[nodiscard]] virtual std::future<bool> HaveMessage() = 0;
  66. [[nodiscard]] virtual std::future<std::pair<int, std::string>> GetMessage() = 0;
  67. // 等待下一帧
  68. virtual std::future<bool> Wait() = 0;
  69. // 获取视野内可见的人类/屠夫的信息
  70. [[nodiscard]] virtual std::vector<std::shared_ptr<const THUAI6::Human>> GetHuman() const = 0;
  71. [[nodiscard]] virtual std::vector<std::shared_ptr<const THUAI6::Butcher>> GetButcher() const = 0;
  72. // 获取视野内可见的道具信息
  73. [[nodiscard]] virtual std::vector<std::shared_ptr<const THUAI6::Prop>> GetProps() const = 0;
  74. // 获取地图信息,视野外的地图统一为Land
  75. [[nodiscard]] virtual std::array<std::array<THUAI6::PlaceType, 50>, 50> GetFullMap() const = 0;
  76. [[nodiscard]] virtual THUAI6::PlaceType GetPlaceType(int32_t CellX, int32_t CellY) const = 0;
  77. // 获取所有玩家的GUID
  78. [[nodiscard]] virtual const std::vector<int64_t> GetPlayerGUIDs() const = 0;
  79. // 获取游戏目前所进行的帧数
  80. [[nodiscard]] virtual int GetFrameCount() const = 0;
  81. /*****选手可能用的辅助函数*****/
  82. // 获取指定格子中心的坐标
  83. [[nodiscard]] static inline int CellToGrid(int cell) noexcept
  84. {
  85. return cell * num_of_grid_per_cell + num_of_grid_per_cell / 2;
  86. }
  87. // 获取指定坐标点所位于的格子的 X 序号
  88. [[nodiscard]] static inline int GridToCell(int grid) noexcept
  89. {
  90. return grid / num_of_grid_per_cell;
  91. }
  92. };
  93. class IHumanAPI : public IAPI
  94. {
  95. public:
  96. /*****人类阵营的特定函数*****/
  97. virtual std::future<bool> StartFixMachine() = 0;
  98. virtual std::future<bool> EndFixMachine() = 0;
  99. virtual std::future<bool> GetFixStatus() = 0;
  100. virtual std::future<bool> StartSaveHuman() = 0;
  101. virtual std::future<bool> EndSaveHuman() = 0;
  102. virtual std::future<bool> GetSaveStatus() = 0;
  103. virtual std::future<bool> Escape() = 0;
  104. [[nodiscard]] virtual std::shared_ptr<const THUAI6::Human> GetSelfInfo() const = 0;
  105. };
  106. class IButcherAPI : public IAPI
  107. {
  108. public:
  109. /*****屠夫阵营的特定函数*****/
  110. virtual std::future<bool> Attack(double angleInRadian) = 0;
  111. virtual std::future<bool> CarryHuman() = 0;
  112. virtual std::future<bool> ReleaseHuman() = 0;
  113. virtual std::future<bool> HangHuman() = 0;
  114. [[nodiscard]] virtual std::shared_ptr<const THUAI6::Butcher> GetSelfInfo() const = 0;
  115. };
  116. class IGameTimer
  117. {
  118. public:
  119. virtual void StartTimer() = 0;
  120. virtual void EndTimer() = 0;
  121. virtual void Play(IAI& ai) = 0;
  122. };
  123. class HumanAPI : public IHumanAPI, public IGameTimer
  124. {
  125. public:
  126. HumanAPI(ILogic& logic) :
  127. logic(logic)
  128. {
  129. }
  130. void StartTimer() override
  131. {
  132. }
  133. void EndTimer() override
  134. {
  135. }
  136. void Play(IAI& ai) override;
  137. std::future<bool> Move(uint32_t timeInMilliseconds, double angleInRadian) override
  138. {
  139. }
  140. [[nodiscard]] int GetFrameCount() const override
  141. {
  142. }
  143. std::future<bool> MoveRight(uint32_t timeInMilliseconds) override
  144. {
  145. }
  146. std::future<bool> MoveUp(uint32_t timeInMilliseconds) override
  147. {
  148. }
  149. std::future<bool> MoveLeft(uint32_t timeInMilliseconds) override
  150. {
  151. }
  152. std::future<bool> MoveDown(uint32_t timeInMilliseconds) override
  153. {
  154. }
  155. std::future<bool> PickProp() override
  156. {
  157. }
  158. std::future<bool> UseProp() override
  159. {
  160. }
  161. std::future<bool> UseSkill() override
  162. {
  163. }
  164. std::future<bool> SendMessage(int, std::string) override
  165. {
  166. }
  167. [[nodiscard]] std::future<bool> HaveMessage() override
  168. {
  169. }
  170. [[nodiscard]] std::future<std::pair<int, std::string>> GetMessage() override
  171. {
  172. }
  173. std::future<bool> Wait() override
  174. {
  175. }
  176. [[nodiscard]] std::vector<std::shared_ptr<const THUAI6::Human>> GetHuman() const override
  177. {
  178. }
  179. [[nodiscard]] std::vector<std::shared_ptr<const THUAI6::Butcher>> GetButcher() const override
  180. {
  181. }
  182. [[nodiscard]] std::vector<std::shared_ptr<const THUAI6::Prop>> GetProps() const override
  183. {
  184. }
  185. [[nodiscard]] std::array<std::array<THUAI6::PlaceType, 50>, 50> GetFullMap() const override
  186. {
  187. }
  188. [[nodiscard]] THUAI6::PlaceType GetPlaceType(int32_t CellX, int32_t CellY) const override
  189. {
  190. }
  191. [[nodiscard]] const std::vector<int64_t> GetPlayerGUIDs() const override
  192. {
  193. }
  194. std::future<bool> StartFixMachine() override
  195. {
  196. }
  197. std::future<bool> EndFixMachine() override
  198. {
  199. }
  200. std::future<bool> GetFixStatus() override
  201. {
  202. }
  203. std::future<bool> StartSaveHuman() override
  204. {
  205. }
  206. std::future<bool> EndSaveHuman() override
  207. {
  208. }
  209. std::future<bool> GetSaveStatus() override
  210. {
  211. }
  212. std::future<bool> Escape() override
  213. {
  214. }
  215. [[nodiscard]] virtual std::shared_ptr<const THUAI6::Human> GetSelfInfo() const override
  216. {
  217. }
  218. private:
  219. ILogic& logic;
  220. };
  221. class ButcherAPI : public IButcherAPI, public IGameTimer
  222. {
  223. public:
  224. ButcherAPI(ILogic& logic) :
  225. logic(logic)
  226. {
  227. }
  228. void StartTimer() override
  229. {
  230. }
  231. void EndTimer() override
  232. {
  233. }
  234. void Play(IAI& ai) override;
  235. std::future<bool> Move(uint32_t timeInMilliseconds, double angleInRadian) override
  236. {
  237. }
  238. [[nodiscard]] int GetFrameCount() const override
  239. {
  240. }
  241. std::future<bool> MoveRight(uint32_t timeInMilliseconds) override
  242. {
  243. }
  244. std::future<bool> MoveUp(uint32_t timeInMilliseconds) override
  245. {
  246. }
  247. std::future<bool> MoveLeft(uint32_t timeInMilliseconds) override
  248. {
  249. }
  250. std::future<bool> MoveDown(uint32_t timeInMilliseconds) override
  251. {
  252. }
  253. std::future<bool> PickProp() override
  254. {
  255. }
  256. std::future<bool> UseProp() override
  257. {
  258. }
  259. std::future<bool> UseSkill() override
  260. {
  261. }
  262. std::future<bool> SendMessage(int, std::string) override
  263. {
  264. }
  265. [[nodiscard]] std::future<bool> HaveMessage() override
  266. {
  267. }
  268. [[nodiscard]] std::future<std::pair<int, std::string>> GetMessage() override
  269. {
  270. }
  271. std::future<bool> Wait() override
  272. {
  273. }
  274. [[nodiscard]] std::vector<std::shared_ptr<const THUAI6::Human>> GetHuman() const override
  275. {
  276. }
  277. [[nodiscard]] std::vector<std::shared_ptr<const THUAI6::Butcher>> GetButcher() const override
  278. {
  279. }
  280. [[nodiscard]] std::vector<std::shared_ptr<const THUAI6::Prop>> GetProps() const override
  281. {
  282. }
  283. [[nodiscard]] std::array<std::array<THUAI6::PlaceType, 50>, 50> GetFullMap() const override
  284. {
  285. }
  286. [[nodiscard]] THUAI6::PlaceType GetPlaceType(int32_t CellX, int32_t CellY) const override
  287. {
  288. }
  289. [[nodiscard]] const std::vector<int64_t> GetPlayerGUIDs() const override
  290. {
  291. }
  292. std::future<bool> Attack(double angleInRadian) override
  293. {
  294. }
  295. std::future<bool> CarryHuman() override
  296. {
  297. }
  298. std::future<bool> ReleaseHuman() override
  299. {
  300. }
  301. std::future<bool> HangHuman() override
  302. {
  303. }
  304. [[nodiscard]] std::shared_ptr<const THUAI6::Butcher> GetSelfInfo() const override
  305. {
  306. }
  307. private:
  308. ILogic& logic;
  309. };
  310. class HumanDebugAPI : public IHumanAPI, public IGameTimer
  311. {
  312. public:
  313. HumanDebugAPI(ILogic& logic) :
  314. logic(logic)
  315. {
  316. }
  317. void StartTimer() override
  318. {
  319. }
  320. void EndTimer() override
  321. {
  322. }
  323. void Play(IAI& ai) override;
  324. std::future<bool> Move(uint32_t timeInMilliseconds, double angleInRadian) override
  325. {
  326. }
  327. [[nodiscard]] int GetFrameCount() const override
  328. {
  329. }
  330. std::future<bool> MoveRight(uint32_t timeInMilliseconds) override
  331. {
  332. }
  333. std::future<bool> MoveUp(uint32_t timeInMilliseconds) override
  334. {
  335. }
  336. std::future<bool> MoveLeft(uint32_t timeInMilliseconds) override
  337. {
  338. }
  339. std::future<bool> MoveDown(uint32_t timeInMilliseconds) override
  340. {
  341. }
  342. std::future<bool> PickProp() override
  343. {
  344. }
  345. std::future<bool> UseProp() override
  346. {
  347. }
  348. std::future<bool> UseSkill() override
  349. {
  350. }
  351. std::future<bool> SendMessage(int, std::string) override
  352. {
  353. }
  354. [[nodiscard]] std::future<bool> HaveMessage() override
  355. {
  356. }
  357. [[nodiscard]] std::future<std::pair<int, std::string>> GetMessage() override
  358. {
  359. }
  360. std::future<bool> Wait() override
  361. {
  362. }
  363. [[nodiscard]] std::vector<std::shared_ptr<const THUAI6::Human>> GetHuman() const override
  364. {
  365. }
  366. [[nodiscard]] std::vector<std::shared_ptr<const THUAI6::Butcher>> GetButcher() const override
  367. {
  368. }
  369. [[nodiscard]] std::vector<std::shared_ptr<const THUAI6::Prop>> GetProps() const override
  370. {
  371. }
  372. [[nodiscard]] std::array<std::array<THUAI6::PlaceType, 50>, 50> GetFullMap() const override
  373. {
  374. }
  375. [[nodiscard]] THUAI6::PlaceType GetPlaceType(int32_t CellX, int32_t CellY) const override
  376. {
  377. }
  378. [[nodiscard]] const std::vector<int64_t> GetPlayerGUIDs() const override
  379. {
  380. }
  381. std::future<bool> StartFixMachine() override
  382. {
  383. }
  384. std::future<bool> EndFixMachine() override
  385. {
  386. }
  387. std::future<bool> GetFixStatus() override
  388. {
  389. }
  390. std::future<bool> StartSaveHuman() override
  391. {
  392. }
  393. std::future<bool> EndSaveHuman() override
  394. {
  395. }
  396. std::future<bool> GetSaveStatus() override
  397. {
  398. }
  399. std::future<bool> Escape() override
  400. {
  401. }
  402. [[nodiscard]] virtual std::shared_ptr<const THUAI6::Human> GetSelfInfo() const override
  403. {
  404. }
  405. private:
  406. ILogic& logic;
  407. };
  408. class ButcherDebugAPI : public IButcherAPI, public IGameTimer
  409. {
  410. public:
  411. ButcherDebugAPI(ILogic& logic) :
  412. logic(logic)
  413. {
  414. }
  415. void StartTimer() override
  416. {
  417. }
  418. void EndTimer() override
  419. {
  420. }
  421. void Play(IAI& ai) override;
  422. std::future<bool> Move(uint32_t timeInMilliseconds, double angleInRadian) override
  423. {
  424. }
  425. [[nodiscard]] int GetFrameCount() const override
  426. {
  427. }
  428. std::future<bool> MoveRight(uint32_t timeInMilliseconds) override
  429. {
  430. }
  431. std::future<bool> MoveUp(uint32_t timeInMilliseconds) override
  432. {
  433. }
  434. std::future<bool> MoveLeft(uint32_t timeInMilliseconds) override
  435. {
  436. }
  437. std::future<bool> MoveDown(uint32_t timeInMilliseconds) override
  438. {
  439. }
  440. std::future<bool> PickProp() override
  441. {
  442. }
  443. std::future<bool> UseProp() override
  444. {
  445. }
  446. std::future<bool> UseSkill() override
  447. {
  448. }
  449. std::future<bool> SendMessage(int, std::string) override
  450. {
  451. }
  452. [[nodiscard]] std::future<bool> HaveMessage() override
  453. {
  454. }
  455. [[nodiscard]] std::future<std::pair<int, std::string>> GetMessage() override
  456. {
  457. }
  458. std::future<bool> Wait() override
  459. {
  460. }
  461. [[nodiscard]] std::vector<std::shared_ptr<const THUAI6::Human>> GetHuman() const override
  462. {
  463. }
  464. [[nodiscard]] std::vector<std::shared_ptr<const THUAI6::Butcher>> GetButcher() const override
  465. {
  466. }
  467. [[nodiscard]] std::vector<std::shared_ptr<const THUAI6::Prop>> GetProps() const override
  468. {
  469. }
  470. [[nodiscard]] std::array<std::array<THUAI6::PlaceType, 50>, 50> GetFullMap() const override
  471. {
  472. }
  473. [[nodiscard]] THUAI6::PlaceType GetPlaceType(int32_t CellX, int32_t CellY) const override
  474. {
  475. }
  476. [[nodiscard]] const std::vector<int64_t> GetPlayerGUIDs() const override
  477. {
  478. }
  479. std::future<bool> Attack(double angleInRadian) override
  480. {
  481. }
  482. std::future<bool> CarryHuman() override
  483. {
  484. }
  485. std::future<bool> ReleaseHuman() override
  486. {
  487. }
  488. std::future<bool> HangHuman() override
  489. {
  490. }
  491. [[nodiscard]] std::shared_ptr<const THUAI6::Butcher> GetSelfInfo() const override
  492. {
  493. }
  494. private:
  495. ILogic& logic;
  496. };
  497. #endif