path (寻路)
- path(start, end, method='bfs', extra_obstacles=None, player_id=0)
计算得到图中从起点(start)到终点(end)的一条路线。更换 method 可以切换不同的寻路算法。目前支持 bfs, dfs, dijkstra, greedy, a*, d*lite, jps 算法。
因每种算法独有的寻路方式,它们返回的路线不一定相同。请判断当前情况下最适合的算法。
注:此算法是高级算法,仅在对战中可用
- 参数
method (str) – 寻路算法名称,目前支持 bfs, dfs, dijkstra, greedy, a*, d*lite, jps 算法。默认 bfs。
extra_obstacles (list[list[int]]) – 额外考虑的障碍物,每个障碍物是一个长度为 2 的数组,表示障碍物的行列坐标。默认 None。这些障碍和墙一样,会被算法考虑在内。
player_id (int) – 如果不是动态地图(所有企鹅都是可穿透的),则此参数无效。如果是动态地图(如对方企鹅被视为障碍), 可指定 player_id,用于将这个
Player
设置为可穿透的。 如果不指定,那么 player_id 将会被设置为默认值 0 即当前控制的角色可穿透,其他角色不可穿透。 如果设置为 1 或其他玩家的 id,那么这个玩家会被视为障碍物,无法穿透。 如果设置为 -1,那么所有玩家都会被视为可穿透的。
- 返回
线路中每个节点的行列坐标
- 返回类型
实际案例
>>> import api >>> # 获取地图信息,地图如上图所示 >>> api.get_context().maze [['WALL', 'WALL', 'WALL', 'WALL', 'WALL'], ['WALL', 'ROAD', 'ROAD', 'ROAD', 'WALL'], ['WALL', 'ROAD', 'ROAD', 'ROAD', 'WALL'], ['WALL', 'ROAD', 'ROAD', 'ROAD', 'WALL'], ['WALL', 'ROAD', 'WALL', 'ROAD', 'WALL']]
>>> import api >>> # 获取从 (1, 1) 到 (3, 1) 的路线 >>> path = api.check.path(start=(1, 1), end=(3, 1)) >>> path [(1, 1), (2, 1), (3, 1)]
>>> # 添加额外的障碍物,障碍物的坐标为 (2, 1),获取从 (1, 1) 到 (3, 1) 的路线 >>> path = api.check.path(start=(1, 1), end=(3, 1), extra_obstacles=[(2, 1)]) # 获取基于额外障碍物的路线信息 >>> path [(1, 1), (1, 2), (2, 2), (3, 2), (3, 1)]
>>> # 如果当前地图为非动态地图,玩家(企鹅)是可穿透的,获取以对方玩家坐标为起点、到指定终点的路线能够正常返回寻路结果 >>> player1 = context.players[1] # 你当前是 context.players[0],对方玩家是 context.players[1] >>> path = api.check.path((player1.row, player1.col), (3, 1)) # 获取以 player1 坐标为起点,终点为 (3, 1) 的寻路结果 >>> path [(1, 3), (1, 2), (1, 1), (2, 1), (3, 1)]
>>> # 如果当前地图为动态地图,对方玩家(企鹅)会被看作是障碍物。获取以对方玩家坐标为起点、到指定终点的路线时会返回[],表示无寻路结果 >>> player1 = context.players[1] # 当前是你的回合,你是 context.players[0],对方玩家是 context.players[1] >>> # 如果不将 api.check.path() 中的参数 player_id 设置为 player1.id,那么 player1 会被当作障碍物,当以player1为寻路起点时无寻路结果 >>> path = api.check.path((player1.row, player1.col), (3, 1)) # 获取以 player1 坐标为起点,终点为 (3, 1) 的寻路结果 >>> path []
>>> # 在 player0 的回合,当模拟 player1 做寻路时,需要设置 player_id = player1.id,表示在调用过程中 player1 不是障碍物 >>> player1 = context.players[1] >>> path = api.check.path((player1.row, player1.col), (3, 1), player_id=player1.id) # 在调用过程中 player0 会被设置为障碍物 >>> path [(1, 3), (1, 2), (2, 2), (2, 1), (3, 1)]
>>> # 设置 player_id=-1,所有玩家(企鹅)都会被视为可穿透的 >>> player1 = context.players[1] >>> path = api.check.path((player1.row, player1.col), (3, 1), player_id=-1) >>> path [(1, 3), (1, 2), (1, 1), (2, 1), (3, 1)]
- 引发
ValueError – 如果 start 或 end 数超出地图范围,触发此报错
TypeError – 如果 start 或 end 不是数组类型,触发此报错
ValueError – 如果 method 不是以下值之一:bfs, dfs, dijkstra, greedy, a*, d*lite, jps,触发此报错
TypeError – 如果 extra_obstacles 不是数组类型,触发此报错
ValueError – 如果 extra_obstacles 中的元素不是长度为 2 的数组,触发此报错
TypeError – 如果 extra_obstacles 中的元素不是数组类型,触发此报错
ValueError – 如果 player_id 不存在,触发此报错
TypeError – 如果 player_id 不是整数类型,触发此报错