[toc] # CAPI接口(python) ## 接口解释 ### 主动指令 - 每帧最多发送 50 条主动指令 - EndAllAction 及 Move 指令调用数总和一帧内不超过 10 次 - 指令执行失败可能会使你返回idle状态,而非简单的无效 #### 移动 - `def Move(self, timeInMilliseconds: int, angle: float) -> Future[bool]`:移动,`timeInMilliseconds` 为移动时间,单位毫秒;`angleInRadian` 表示移动方向,单位弧度,使用极坐标,**竖直向下方向为 x 轴,水平向右方向为 y 轴**因为移动过程中你会受到多种干扰使得移动结果不符合你的预期;因此建议小步移动,边移动边考虑之后的行为。 - 5ms 以内的移动指令会被禁止,你不应当使用过小的移动指令 - `def MoveRight(self, timeInMilliseconds: int) -> Future[bool]` 即向右移动, `MoveLeft`、`MoveDown`、`MoveUp` 同理 #### 使用技能 - `def UseSkill(self, skillID: int) -> Future[bool]`:使用对应序号的主动技能 #### 人物 - `def EndAllAction(self) -> Future[bool]`:可以使不处在不可行动状态中的玩家终止当前行动 - 在指令仍在进行时,重复发出同一类型的交互指令和移动指令是无效的,你需要先发出 EndAllAction 指令终止进行的指令 - EndAllAction 及 Move 指令调用数总和一帧内不超过 10 次 #### 攻击 - `def Attack(self, angle: float) -> Future[bool]`:`angleInRadian` 为攻击方向 #### 学习与毕业 - `def StartLearning(self) -> Future[bool]`:在教室里开始做作业 - `def StartOpenGate(self) -> Future[bool]`:开始开启校门 - `def Graduate(self) -> Future[bool]`:从开启的校门或隐藏校门毕业。 #### 勉励与唤醒 - `def StartEncourageMate(self, mateID: int) -> Future[bool]`:勉励对应玩家 ID 的学生。 - `def StartRouseMate(self, mateID: int) -> Future[bool]`:唤醒对应玩家 ID 的沉迷的学生。 #### 地图互动 - `def OpenDoor(self) -> Future[bool]`:开门 - `def CloseDoor(self) -> Future[bool]`:关门 - `def SkipWindow(self) -> Future[bool]`:翻窗 - `def StartOpenChest(self) -> Future[bool]`:开箱 #### 道具 - `def PickProp(self, propType: THUAI6.PropType) -> Future[bool]`:捡起与自己处于同一个格子(cell)的道具。 - `def UseProp(self, propType: THUAI6.PropType) -> Future[bool]`:使用对应类型的道具 - `def ThrowProp(self, propType: THUAI6.PropType) -> Future[bool]`:将对应类型的道具扔在原地 ### 信息获取 #### 队内信息 - `def SendMessage(self, toID: int, message: Union[str, bytes]) -> Future[bool]`:给同队的队友发送消息,队友在下一帧收到。第一个参数指定发送的对象,第二个参数指定发送的内容,可以是Unicode字符串,也可以是二进制字符串;不得超过 256 字节。 - `def HaveMessage(self) -> bool`:是否有队友发来的尚未接收的信息。 - `def GetMessage(self) -> Tuple[int, Union[str, bytes]]`:按照消息发送顺序获取来自队友的信息,第一个参数为发送该消息的 PlayerID。 > 需要注意,文本消息和二进制消息都会在这里接受,选手可以简单地使用 `isinstance()` 来判断消息类型。 #### 查询可视范围内的信息 - `def GetStudents(self) -> List[THUAI6.Student]`:对于学生,返回所有学生的信息;对于捣蛋鬼,返回可视学生的信息。 - `def GetTrickers(self) -> List[THUAI6.Tricker]`:返回所有可视捣蛋鬼的信息。 - `def GetProps(self) -> List[THUAI6.Prop]`:返回所有可视道具的信息。 - `def GetBullets(self) -> List[THUAI6.Bullet]`:返回所有可视子弹(攻击)的信息。 - `def HaveView(self, gridX: int, gridY: int) -> bool`:判断坐标是否可见 #### 查询特定位置物体的信息 下面的 CellX 和 CellY 指的是地图格数,而非绝对坐标。 - `def GetPlaceType(self, cellX: int, cellY: int) -> THUAI6.PlaceType`:返回某一位置场地种类信息。场地种类详见 structure.h。 - 以下指令,若查询物品当前在视野内,则返回最新进度/状态;若物品当前不在视野内、但曾经出现在视野内,则返回最后一次看到时的进度/状态;若物品从未出现在视野内,或查询位置没有对应的物品,则返回 -1。 - `def GetChestProgress(self, cellX: int, cellY: int) -> int`:查询特定位置箱子开启进度 - `def GetGateProgress(self, cellX: int, cellY: int) -> int`:查询特定位置校门开启进度 - `def GetClassroomProgress(self, cellX: int, cellY: int) -> int`:查询特定位置教室作业完成进度 - `def GetDoorProgress(self, cellX: int, cellY: int) -> int`:查询特定位置门开启状态 - `def IsDoorOpen(self, cellX: int, cellY: int) -> bool`:查询特定位置门是否开启,没有门/不在视野内也返回 false - `def GetHiddenGateState(self, cellX: int, cellY: int) -> THUAI6.HiddenGateState`:查询特定位置隐藏校门状态,没有隐藏校门/不在视野内返回 THUAI6::HiddenGateState::Null #### 其他 - `def GetGameInfo(self) -> THUAI6.GameInfo`:查询当前游戏状态 - `def GetPlayerGUIDs(self) -> List[int]`:获取所有玩家的 GUID - `def GetFrameCount(self) -> int`:获取目前所进行的帧数 - `def GetSelfInfo(self) -> Union[THUAI6.Student, THUAI6.Tricker]`:获取自己的信息 - `def GetFullMap(self) -> List[List[THUAI6.PlaceType]]`:返回整张地图的地形信息。可以写成类似 `self.GetFullMap()[x][y]`,其中 x 为地图自上到下第几行,y 为自左向右第几列,注意从 0 开始 ### 辅助函数 `def CellToGrid(cell: int) -> int`:将地图格数 cell 转换为绝对坐标 grid。 `def GridToCell(grid: int) -> int`:将绝对坐标 grid 转换为地图格数 cell。 下面为用于 DEBUG 的输出函数,选手仅在开启 Debug 模式的情况下可以使用 ~~~python def Print(self, cont: str) -> None: def PrintStudent(self) -> None: def PrintTricker(self) -> None: def PrintProp(self) -> None: def PrintSelfInfo(self) -> None: ~~~ ### 部分属性解释 stuctures.h ~~~python class Player: def __init__(self, **kwargs) -> None: self.prop: List[PropType] = []//大小固定为3,空的位置为NullPropType ~~~ ## 接口一览 ~~~python class IAPI(metaclass=ABCMeta): # 选手可执行的操作 # 指挥本角色进行移动,`timeInMilliseconds` 为移动时间,单位为毫秒;`angleInRadian` 表示移动的方向,单位是弧度,使用极坐标——竖直向下方向为 x 轴,水平向右方向为 y 轴 @abstractmethod def Move(self, timeInMilliseconds: int, angle: float) -> Future[bool]: pass # 向特定方向移动 @abstractmethod def MoveRight(self, timeInMilliseconds: int) -> Future[bool]: pass @abstractmethod def MoveLeft(self, timeInMilliseconds: int) -> Future[bool]: pass @abstractmethod def MoveUp(self, timeInMilliseconds: int) -> Future[bool]: pass @abstractmethod def MoveDown(self, timeInMilliseconds: int) -> Future[bool]: pass # 道具和技能相关 @abstractmethod def PickProp(self, propType: THUAI6.PropType) -> Future[bool]: pass @abstractmethod def UseProp(self, propType: THUAI6.PropType) -> Future[bool]: pass @abstractmethod def ThrowProp(self, propType: THUAI6.PropType) -> Future[bool]: pass @abstractmethod def UseSkill(self, skillID: int) -> Future[bool]: pass @abstractmethod def Attack(self, angle: float) -> Future[bool]: pass @abstractmethod def OpenDoor(self) -> Future[bool]: pass @abstractmethod def CloseDoor(self) -> Future[bool]: pass @abstractmethod def SkipWindow(self) -> Future[bool]: pass @abstractmethod def StartOpenGate(self) -> Future[bool]: pass @abstractmethod def StartOpenChest(self) -> Future[bool]: pass @abstractmethod def EndAllAction(self) -> Future[bool]: pass # 消息相关,接收消息时无消息则返回(-1, '') @abstractmethod def SendMessage(self, toID: int, message: Union[str, bytes]) -> Future[bool]: pass @abstractmethod def HaveMessage(self) -> bool: pass @abstractmethod def GetMessage(self) -> Tuple[int, Union[str, bytes]]: pass # 等待下一帧 @abstractmethod def Wait(self) -> Future[bool]: pass # 获取各类游戏中的消息 @abstractmethod def GetFrameCount(self) -> int: pass @abstractmethod def GetPlayerGUIDs(self) -> List[int]: pass @abstractmethod def GetTrickers(self) -> List[THUAI6.Tricker]: pass @abstractmethod def GetStudents(self) -> List[THUAI6.Student]: pass @abstractmethod def GetProps(self) -> List[THUAI6.Prop]: pass @abstractmethod def GetBullets(self) -> List[THUAI6.Bullet]: pass @abstractmethod def GetSelfInfo(self) -> Union[THUAI6.Student, THUAI6.Tricker]: pass @abstractmethod def GetFullMap(self) -> List[List[THUAI6.PlaceType]]: pass @abstractmethod def GetPlaceType(self, cellX: int, cellY: int) -> THUAI6.PlaceType: pass @abstractmethod def IsDoorOpen(self, cellX: int, cellY: int) -> bool: pass @abstractmethod def GetChestProgress(self, cellX: int, cellY: int) -> int: pass @abstractmethod def GetGateProgress(self, cellX: int, cellY: int) -> int: pass @abstractmethod def GetClassroomProgress(self, cellX: int, cellY: int) -> int: pass @abstractmethod def GetDoorProgress(self, cellX: int, cellY: int) -> int: pass @abstractmethod def GetHiddenGateState(self, cellX: int, cellY: int) -> THUAI6.HiddenGateState: pass @abstractmethod def GetGameInfo(self) -> THUAI6.GameInfo: pass @abstractmethod def HaveView(self, gridX: int, gridY: int) -> bool pass # 用于DEBUG的输出函数,仅在DEBUG模式下有效 @abstractmethod def Print(self, cont: str) -> None: pass @abstractmethod def PrintStudent(self) -> None: pass @abstractmethod def PrintTricker(self) -> None: pass @abstractmethod def PrintProp(self) -> None: pass @abstractmethod def PrintSelfInfo(self) -> None: pass class IStudentAPI(IAPI, metaclass=ABCMeta): # 人类阵营的特殊函数 @abstractmethod def Graduate(self) -> Future[bool]: pass @abstractmethod def StartLearning(self) -> Future[bool]: pass @abstractmethod def StartEncourageMate(self, mateID: int) -> Future[bool]: pass @abstractmethod def StartRouseMate(self, mateID: int) -> Future[bool]: pass @abstractmethod def GetSelfInfo(self) -> THUAI6.Student: pass class ITrickerAPI(IAPI, metaclass=ABCMeta): # 屠夫阵营的特殊函数 @abstractmethod def GetSelfInfo(self) -> THUAI6.Tricker: pass ~~~