Skip to content

ADK User Guide-Lite

本Lite版指南旨在让选手在较短时间内创作出简单AI,更多ADK的详细使用方法请看进阶版指南。

0. 预备工作

请先前往Saiblo官网下载ADK包,确认内含adk.pysampleAI.py以及main.py

adk.py为你的AI提供的功能有:与Judger进行通讯,发送你的操作、读取对手的操作等;游戏状态维护,提供逻辑维护代码,能为你处理玩家的操作并提供当前局面信息。

sampleAI.py为一个已经实现的简易AI的代码,其中的框架可以沿用至你的AI程序中,或者你也可以直接在其上进行修改。

main.py用于运行你的AI程序。注意,如果你修改了sampleAI.py的文件名或新创建文件编写你的AI,请在main.py中同步修改。

1. 开始!

你需要做的是在sampleAI.py中实现你自己的策略,而当前其中已经有一个简单的策略实现了,即蛇不断朝最近的道具进发,并在长度较长时分裂,原蛇头部分(“主蛇”)继续如上操作,而原蛇尾部分(“副蛇”)进行固化,样例AI的策略实现过程解析可参见代码中的注释。

为了简化编写AI的流程,你只需要修改sampleAI.pyAI类中的judge函数进行对当前蛇的操作,而其余部分代码会帮助你处理你当前的操作、对手的操作等其他流程。judge函数的参数可以自行修改,返回值应为一个int,代表你的操作类型,具体见下表:

操作类型 操作编号
移动-x轴正向 1
移动-y轴正向 2
移动-x轴负向 3
移动-y轴负向 4
融化射线 5
分裂 6

当前judge函数有两个参数:snake以及ctxsnake代表当前操作对应的蛇,ctx则保存了当前局面的详细信息。你可以利用它们来优化你的决策过程。最后一小节中简要介绍了它们的部分使用方法。

2. 样例AI的优化方向

  • closest_food_strategy 寻找最近的道具:是否每次都找最近的道具是最优解?考虑安全性、可能的收益以及寻找的范围
  • active_strategy 主蛇策略:何时分裂更优?考虑分裂时长度以及其它因素;何时使用融化射线?考虑使用后的收益
  • solidify_strategy 固化(副蛇策略):怎样使蛇固化后围成的区域能够较大?在何处、以怎样的路径固化?
  • 更多其他策略,如主动去围对手、从对手处逃跑

3. 可供利用的信息

3.1 参数snake

snake代表当前需进行操作的蛇,其类型为自定义类Snake,在adk.py中实现。可供使用的成员属性及方法有:

  • coor_list: List[Tuple[int, int]] 一个顺序(蛇头 -> 蛇尾)包含所有坐标的列表,列表中元素为包含两个int的元组,第一个为x坐标,第二个为y坐标。
  • item_list: List[Item] 当前蛇所有的道具列表,列表中元素类型为自定义类Item,具体内容见后。
  • id: int 蛇的编号。
  • length_bank: int 长度银行中保存的长度。
  • camp: int 蛇归属于玩家0/1。
  • get_len() -> int 返回当前蛇的长度

更多成员可见adk.py或进阶版指南,它们在编写AI时并不必要。

其中提到的Item道具类包含以下成员:

  • x: int x坐标
  • y: int y坐标
  • id: int 道具编号
  • time: int 道具生成的时间
  • type: int 道具类型,0代表长度道具,2代表融化射线。PS: 长度道具不会被保存,直接存入长度银行。
  • param: int 道具参数,代表融化道具的有效时间(无作用)或长度道具的增长长度。
  • gotten_time: int 道具被蛇获取的时间(若道具仍在地图中未被蛇获取,为-1)。

3.2 参数ctx

ctx中保存了当前游戏的局面信息,类型为自定义类Context,在adk.py中实现。可供使用的成员属性及方法有:

  • snake_list: List[Snake] 包含现存所有蛇,同一个玩家的蛇按照操作顺序排序。
  • game_map: Map 现在的游戏地图,为自定义类Map,具体内容见后。
  • turn: int 当前回合数
  • current_player: int 当前玩家编号
  • get_map() -> Map 返回当前地图
  • get_snake_count(camp: int) -> int 返回当前camp选手蛇的数量
  • get_snake(id: int) -> Snake 返回当前编号为id的蛇
  • get_player_snake(camp: int) -> List[Snake] 返回玩家camp的蛇,按照行动顺序排序
  • player_operations: List[List[int]] 包含双方的历史操作,player_operations[i]为玩家i的历史操作,每个操作为包含三个整数的列表[turn, snake, opt],依次为回合数、蛇编号、操作类型

更多成员可见adk.py或进阶版指南,它们在编写AI时并不必要。

其中提到的Map地图类包含以下成员:

  • wall_map: List[List[int]] -1 / 0 / 1 代表无墙 / 0号选手的墙 / 1号选手的墙
  • snake_map: List[List[int]] -1 / id 代表无 / id号蛇占据
  • item_map: List[List[int]] -1 / id 代表无 / id号道具占据
  • item_list: List[Item]现存所有道具的列表
  • length: int 地图长度
  • width: int 地图宽度
  • get_map_item(id: int) -> Item 返回当前编号为id的道具

其中,各个地图二维数组的第一维代表x坐标,第二维代表y坐标,从0开始。

利用上述信息,相信智慧的你一定能够设计出一个和你一样智慧的AI!如果你想要更详细地了解AI程序处理的流程以及ADK的其他内容,请继续阅读进阶版指南。