当前位置:嗨网首页>书籍在线阅读

09-迷宫的其他函数

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

2.2.2 迷宫的其他函数

若有一个函数可在搜索过程中检查我们是否已抵达目标,将会便利很多。换句话说,我们需要检查搜索已到达的某个 MazeLocation 是否就是目标位置。于是可以为 Maze 添加一个方法。具体代码如代码清单2-14所示。

代码清单2-14 maze.py(续)

def goal_test(self, ml: MazeLocation) -> bool:
    return ml == self.goal

怎样才能在迷宫内移动呢?假设我们每次可以从迷宫的给定单元格开始水平和垂直移动一格。根据此规则, successors() 函数可以从给定的 MazeLocation 找到可能到达的下一个位置。但是,每个 Mazesuccessors() 函数都会有所差别,因为每个 Maze 都有不同的尺寸和路障集。因此,代码清单2-15中把 successors() 函数定义为 Maze 的方法。

代码清单2-15 maze.py(续)

def successors(self, ml: MazeLocation) -> List[MazeLocation]:
    locations: List[MazeLocation] = []
    if ml.row + 1 < self._rows and self._grid[ml.row + 1][ml.column] != Cell.BLOCKED:
        locations.append(MazeLocation(ml.row + 1, ml.column))
    if ml.row - 1 >= 0 and self._grid[ml.row - 1][ml.column] != Cell.BLOCKED:
        locations.append(MazeLocation(ml.row - 1, ml.column))
    if ml.column + 1 < self._columns and self._grid[ml.row][ml.column + 1] != Cell.BLOCKED:
        locations.append(MazeLocation(ml.row, ml.column + 1))
    if ml.column - 1 >= 0 and self._grid[ml.row][ml.column - 1] != Cell.BLOCKED:
        locations.append(MazeLocation(ml.row, ml.column - 1))
    return locations

successors() 只是简单地检查 MazeMazeLocation 的上方、下方、右侧和左侧,查看是否能找到从该位置过去的空白单元格。它还会避开检查 Maze 边缘之外的位置。每个找到的可达 MazeLocation 都会被放入一个列表,该列表将被最终返回给调用者。