ADK User Guide-Lite
本Lite版指南旨在让选手在较短时间内创作出简单AI,更多ADK的详细使用方法请看进阶版指南。
0. 预备工作
请先前往Saiblo官网下载ADK包,确认内含adk.py
、sampleAI.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.py
的AI
类中的judge
函数进行对当前蛇的操作,而其余部分代码会帮助你处理你当前的操作、对手的操作等其他流程。judge
函数的参数可以自行修改,返回值应为一个int
,代表你的操作类型,具体见下表:
操作类型 | 操作编号 |
---|---|
移动-x轴正向 | 1 |
移动-y轴正向 | 2 |
移动-x轴负向 | 3 |
移动-y轴负向 | 4 |
融化射线 | 5 |
分裂 | 6 |
当前judge函数有两个参数:snake
以及ctx
。snake
代表当前操作对应的蛇,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的其他内容,请继续阅读进阶版指南。