path (寻路)

path(start, end, method='bfs', extra_obstacles=None, player_id=0)

计算得到图中从起点(start)到终点(end)的一条路线。更换 method 可以切换不同的寻路算法。目前支持 bfs, dfs, dijkstra, greedy, a*, d*lite, jps 算法。

因每种算法独有的寻路方式,它们返回的路线不一定相同。请判断当前情况下最适合的算法。

注:此算法是高级算法,仅在对战中可用

参数
  • start (int, int) – 线路起始行列坐标,以数组传入

  • end (int, int) – 线路预计的终点行列坐标,以数组传入

  • 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,那么所有玩家都会被视为可穿透的。

返回

线路中每个节点的行列坐标

返回类型

list[tuple[int, int]]

../_images/check_path.png

实际案例

>>> 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 不是整数类型,触发此报错