#pragma once #ifndef API_H #define API_H #ifdef _MSC_VER #pragma warning(disable : 4996) #endif #include "Message2Server.pb.h" #include "Message2Clients.pb.h" #include "MessageType.pb.h" #include "Services.grpc.pb.h" #include "Services.pb.h" #include #include #include #include #include #include #include #include "structures.h" const constexpr int numOfGridPerCell = 1000; class IAI; class ILogic { // API中依赖Logic的部分 public: // 获取服务器发来的消息 virtual std::vector> GetTrickers() const = 0; virtual std::vector> GetStudents() const = 0; virtual std::vector> GetProps() const = 0; virtual std::shared_ptr StudentGetSelfInfo() const = 0; virtual std::shared_ptr TrickerGetSelfInfo() const = 0; virtual std::vector> GetFullMap() const = 0; virtual THUAI6::PlaceType GetPlaceType(int32_t cellX, int32_t cellY) const = 0; // 供IAPI使用的操作相关的部分 virtual bool Move(int64_t time, double angle) = 0; virtual bool PickProp(THUAI6::PropType prop) = 0; virtual bool UseProp(THUAI6::PropType prop) = 0; virtual bool UseSkill(int32_t skillID) = 0; virtual bool SendMessage(int64_t toID, std::string message) = 0; virtual bool HaveMessage() = 0; virtual std::optional> GetMessage() = 0; virtual bool WaitThread() = 0; virtual int GetCounter() const = 0; // IStudentAPI使用的部分 virtual bool Graduate() = 0; virtual bool StartLearning() = 0; virtual bool StartTreatMate() = 0; virtual bool StartRescueMate() = 0; virtual bool OpenDoor() = 0; virtual bool CloseDoor() = 0; virtual bool SkipWindow() = 0; virtual bool StartOpenGate() = 0; virtual bool StartOpenChest() = 0; virtual bool EndAllAction() = 0; // ITrickerAPI使用的部分 virtual bool Attack(double angle) = 0; virtual const std::vector GetPlayerGUIDs() const = 0; }; class IAPI { public: // 选手可执行的操作,应当保证所有函数的返回值都应当为std::future,例如下面的移动函数: // 指挥本角色进行移动,`timeInMilliseconds` 为移动时间,单位为毫秒;`angleInRadian` 表示移动的方向,单位是弧度,使用极坐标——竖直向下方向为 x 轴,水平向右方向为 y 轴 virtual std::future Move(int64_t timeInMilliseconds, double angleInRadian) = 0; // 向特定方向移动 virtual std::future MoveRight(int64_t timeInMilliseconds) = 0; virtual std::future MoveUp(int64_t timeInMilliseconds) = 0; virtual std::future MoveLeft(int64_t timeInMilliseconds) = 0; virtual std::future MoveDown(int64_t timeInMilliseconds) = 0; // 捡道具、使用技能 virtual std::future PickProp(THUAI6::PropType prop) = 0; virtual std::future UseProp(THUAI6::PropType prop) = 0; virtual std::future UseSkill(int32_t skillID) = 0; virtual std::future Attack(double angleInRadian) = 0; virtual std::future OpenDoor() = 0; virtual std::future CloseDoor() = 0; virtual std::future SkipWindow() = 0; virtual std::future StartOpenGate() = 0; virtual std::future StartOpenChest() = 0; virtual std::future EndAllAction() = 0; // 发送信息、接受信息,注意收消息时无消息则返回nullopt virtual std::future SendMessage(int64_t, std::string) = 0; [[nodiscard]] virtual std::future HaveMessage() = 0; [[nodiscard]] virtual std::future>> GetMessage() = 0; // 等待下一帧 virtual std::future Wait() = 0; // 获取视野内可见的学生/捣蛋鬼的信息 [[nodiscard]] virtual std::vector> GetStudents() const = 0; [[nodiscard]] virtual std::vector> GetTrickers() const = 0; // 获取视野内可见的道具信息 [[nodiscard]] virtual std::vector> GetProps() const = 0; // 获取地图信息,视野外的地图统一为Land [[nodiscard]] virtual std::vector> GetFullMap() const = 0; [[nodiscard]] virtual THUAI6::PlaceType GetPlaceType(int32_t CellX, int32_t CellY) const = 0; // 获取所有玩家的GUID [[nodiscard]] virtual const std::vector GetPlayerGUIDs() const = 0; // 获取游戏目前所进行的帧数 [[nodiscard]] virtual int GetFrameCount() const = 0; /*****选手可能用的辅助函数*****/ // 获取指定格子中心的坐标 [[nodiscard]] static inline int CellToGrid(int cell) noexcept { return cell * numOfGridPerCell + numOfGridPerCell / 2; } // 获取指定坐标点所位于的格子的 X 序号 [[nodiscard]] static inline int GridToCell(int grid) noexcept { return grid / numOfGridPerCell; } // 用于DEBUG的输出函数,选手仅在开启Debug模式的情况下可以使用 virtual void PrintStudent() const = 0; virtual void PrintTricker() const = 0; virtual void PrintProp() const = 0; virtual void PrintSelfInfo() const = 0; }; class IStudentAPI : public IAPI { public: /*****学生阵营的特定函数*****/ virtual std::future StartLearning() = 0; virtual std::future StartTreatMate() = 0; virtual std::future StartRescueMate() = 0; virtual std::future Graduate() = 0; [[nodiscard]] virtual std::shared_ptr GetSelfInfo() const = 0; }; class ITrickerAPI : public IAPI { public: /*****捣蛋鬼阵营的特定函数*****/ [[nodiscard]] virtual std::shared_ptr GetSelfInfo() const = 0; }; class IGameTimer { public: virtual ~IGameTimer() = default; virtual void StartTimer() = 0; virtual void EndTimer() = 0; virtual void Play(IAI& ai) = 0; }; class StudentAPI : public IStudentAPI, public IGameTimer { public: StudentAPI(ILogic& logic) : logic(logic) { } void StartTimer() override { } void EndTimer() override { } void Play(IAI& ai) override; [[nodiscard]] int GetFrameCount() const override; std::future Move(int64_t timeInMilliseconds, double angleInRadian) override; std::future MoveRight(int64_t timeInMilliseconds) override; std::future MoveUp(int64_t timeInMilliseconds) override; std::future MoveLeft(int64_t timeInMilliseconds) override; std::future MoveDown(int64_t timeInMilliseconds) override; std::future PickProp(THUAI6::PropType prop) override; std::future UseProp(THUAI6::PropType prop) override; std::future UseSkill(int32_t skillID) override; std::future Attack(double angleInRadian) override; std::future OpenDoor() override; std::future CloseDoor() override; std::future SkipWindow() override; std::future StartOpenGate() override; std::future StartOpenChest() override; std::future EndAllAction() override; std::future SendMessage(int64_t, std::string) override; [[nodiscard]] std::future HaveMessage() override; [[nodiscard]] std::future>> GetMessage() override; std::future Wait() override; [[nodiscard]] std::vector> GetStudents() const override; [[nodiscard]] std::vector> GetTrickers() const override; [[nodiscard]] std::vector> GetProps() const override; [[nodiscard]] std::vector> GetFullMap() const override; [[nodiscard]] THUAI6::PlaceType GetPlaceType(int32_t CellX, int32_t CellY) const override; [[nodiscard]] const std::vector GetPlayerGUIDs() const override; std::future StartLearning() override; std::future StartTreatMate() override; std::future StartRescueMate() override; std::future Graduate() override; [[nodiscard]] std::shared_ptr GetSelfInfo() const override; void PrintStudent() const override { } void PrintTricker() const override { } void PrintProp() const override { } void PrintSelfInfo() const override { } private: ILogic& logic; }; class TrickerAPI : public ITrickerAPI, public IGameTimer { public: TrickerAPI(ILogic& logic) : logic(logic) { } void StartTimer() override { } void EndTimer() override { } void Play(IAI& ai) override; [[nodiscard]] int GetFrameCount() const override; std::future Move(int64_t timeInMilliseconds, double angleInRadian) override; std::future MoveRight(int64_t timeInMilliseconds) override; std::future MoveUp(int64_t timeInMilliseconds) override; std::future MoveLeft(int64_t timeInMilliseconds) override; std::future MoveDown(int64_t timeInMilliseconds) override; std::future PickProp(THUAI6::PropType prop) override; std::future UseProp(THUAI6::PropType prop) override; std::future UseSkill(int32_t skillID) override; std::future OpenDoor() override; std::future CloseDoor() override; std::future SkipWindow() override; std::future StartOpenGate() override; std::future StartOpenChest() override; std::future EndAllAction() override; std::future SendMessage(int64_t, std::string) override; [[nodiscard]] std::future HaveMessage() override; [[nodiscard]] std::future>> GetMessage() override; std::future Wait() override; [[nodiscard]] std::vector> GetStudents() const override; [[nodiscard]] std::vector> GetTrickers() const override; [[nodiscard]] std::vector> GetProps() const override; [[nodiscard]] std::vector> GetFullMap() const override; [[nodiscard]] THUAI6::PlaceType GetPlaceType(int32_t CellX, int32_t CellY) const override; [[nodiscard]] const std::vector GetPlayerGUIDs() const override; std::future Attack(double angleInRadian) override; [[nodiscard]] std::shared_ptr GetSelfInfo() const override; void PrintStudent() const override { } void PrintTricker() const override { } void PrintProp() const override { } void PrintSelfInfo() const override { } private: ILogic& logic; }; class StudentDebugAPI : public IStudentAPI, public IGameTimer { public: StudentDebugAPI(ILogic& logic, bool file, bool print, bool warnOnly, int64_t playerID); void StartTimer() override; void EndTimer() override; void Play(IAI& ai) override; [[nodiscard]] int GetFrameCount() const override; std::future Move(int64_t timeInMilliseconds, double angleInRadian) override; std::future MoveRight(int64_t timeInMilliseconds) override; std::future MoveUp(int64_t timeInMilliseconds) override; std::future MoveLeft(int64_t timeInMilliseconds) override; std::future MoveDown(int64_t timeInMilliseconds) override; std::future PickProp(THUAI6::PropType prop) override; std::future UseProp(THUAI6::PropType prop) override; std::future UseSkill(int32_t skillID) override; std::future Attack(double angleInRadian) override; std::future OpenDoor() override; std::future CloseDoor() override; std::future SkipWindow() override; std::future StartOpenGate() override; std::future StartOpenChest() override; std::future EndAllAction() override; std::future SendMessage(int64_t, std::string) override; [[nodiscard]] std::future HaveMessage() override; [[nodiscard]] std::future>> GetMessage() override; std::future Wait() override; [[nodiscard]] std::vector> GetStudents() const override; [[nodiscard]] std::vector> GetTrickers() const override; [[nodiscard]] std::vector> GetProps() const override; [[nodiscard]] std::vector> GetFullMap() const override; [[nodiscard]] THUAI6::PlaceType GetPlaceType(int32_t CellX, int32_t CellY) const override; [[nodiscard]] const std::vector GetPlayerGUIDs() const override; std::future StartLearning() override; std::future StartTreatMate() override; std::future StartRescueMate() override; std::future Graduate() override; [[nodiscard]] virtual std::shared_ptr GetSelfInfo() const override; void PrintStudent() const override; void PrintTricker() const override; void PrintProp() const override; void PrintSelfInfo() const override; private: std::chrono::system_clock::time_point startPoint; std::unique_ptr logger; ILogic& logic; }; class TrickerDebugAPI : public ITrickerAPI, public IGameTimer { public: TrickerDebugAPI(ILogic& logic, bool file, bool print, bool warnOnly, int64_t playerID); void StartTimer() override; void EndTimer() override; void Play(IAI& ai) override; [[nodiscard]] int GetFrameCount() const override; std::future Move(int64_t timeInMilliseconds, double angleInRadian) override; std::future MoveRight(int64_t timeInMilliseconds) override; std::future MoveUp(int64_t timeInMilliseconds) override; std::future MoveLeft(int64_t timeInMilliseconds) override; std::future MoveDown(int64_t timeInMilliseconds) override; std::future PickProp(THUAI6::PropType prop) override; std::future UseProp(THUAI6::PropType prop) override; std::future UseSkill(int32_t skillID) override; std::future OpenDoor() override; std::future CloseDoor() override; std::future SkipWindow() override; std::future StartOpenGate() override; std::future StartOpenChest() override; std::future EndAllAction() override; std::future SendMessage(int64_t, std::string) override; [[nodiscard]] std::future HaveMessage() override; [[nodiscard]] std::future>> GetMessage() override; std::future Wait() override; [[nodiscard]] std::vector> GetStudents() const override; [[nodiscard]] std::vector> GetTrickers() const override; [[nodiscard]] std::vector> GetProps() const override; [[nodiscard]] std::vector> GetFullMap() const override; [[nodiscard]] THUAI6::PlaceType GetPlaceType(int32_t CellX, int32_t CellY) const override; [[nodiscard]] const std::vector GetPlayerGUIDs() const override; std::future Attack(double angleInRadian) override; [[nodiscard]] std::shared_ptr GetSelfInfo() const override; void PrintStudent() const override; void PrintTricker() const override; void PrintProp() const override; void PrintSelfInfo() const override; private: std::chrono::system_clock::time_point startPoint; std::unique_ptr logger; ILogic& logic; }; #endif