我试图以递归方式实现此方法。但是,几秒钟后,我得到一个索引错误语句“无法从空堆栈中弹出”。我怎么能纠正这个?从本质上讲,整个代码(我没有包括)的重点是创建一个迷宫并引导机器人通过它。
空(未探索)细胞
EMPTY = 0
有障碍的细胞
OBSTACLE = 1
路径上的单元格
ON_PATH = 2
已经探索过的细胞,但不在路径上
EXPLORED = 3
机器人所在的单元格
ROBOT = 4
def solve(self, location):
eventType, done = None, False
self.maze[location[0]][location[1]] = ROBOT
if self.mode == GRAPHICAL_FULL:
self.display_init()
self.draw_maze()
elif self.mode == GRAPHICAL_LIMITED:
self.display_init()
self.update_maze()
while eventType != QUIT and not done:
if self.mode == GRAPHICAL_FULL or self.mode == GRAPHICAL_LIMITED:
for event in pygame.event.get():
eventType = event.type
new_location = self.find_next_step()
if new_location is None:
# Mark the current location as a dead end
self.maze[location[0]][location[1]] = EXPLORED
# pop the next cell off the path stack (go back one space)
location = self.path.pop()
self.maze[location[0]][location[1]] = ROBOT
self.solve(location)
else:
self.maze[location[0]][location[1]] = ON_PATH
self.path.push(location)
location = new_location
self.solve(location)
if self.mode == GRAPHICAL_FULL or self.mode == GRAPHICAL_LIMITED:
self.clock.tick(self.framerate)
self.update_maze()
self.screen.blit(self.background, (0,0))
pygame.display.flip()
if (self.maze[0][0] == EXPLORED or
location == (self.dimension['x']-1, self.dimension['y']-1)):
self.path.push(location)
done = True
return self.path
def find_next_step(self):
# Search for a place to go
for direction in SEARCH_ORDER:
new_location = (self.location[0] + direction['x'],
self.location[1] + direction['y'])
if (0 <= new_location[0] < self.dimension['x'] and
0 <= new_location[1] < self.dimension['y'] and
self.maze[new_location[0]][new_location[1]] == EMPTY):
self.maze[new_location[0]][new_location[1]] = ROBOT
return new_location
return None
答案 0 :(得分:1)
由于只在new_location为None时才调用pop,self.find_next_step()返回none。如果没有find_next_step()的代码,很难确定,但我的猜测是机器人遍历了所有路径,回到起点(使用空路径),因此.pop()失败。
无论如何,我建议错误发生在find_next_step()的返回值中。
这不是一个真正的答案,但我还没有代表发表评论,希望这会有所帮助;)
<强>更新强>
好吧,我现在有更多的信息,但我仍然感觉还有很长的路要走。
但是,如果find_next_step
中没有None
的空值,direction
似乎会返回SEARCH_ORDER
。 (虽然我不知道方向是什么样的。SEARCH_ORDER
大概是一个常量?(不是一个大的python用户))。
无论如何,当机器人探索或以其他方式识别find_next_step
所看到的所有细胞时,可能就是这种情况。
答案 1 :(得分:0)
没有足够的应用程序可以确定,但我认为你的问题是在模式的最后。当您移动到最终位置时,再次调用solve()。在这个循环中,你将获得new_location是None并开始向后移动直到你到达第一个位置,并且你得到错误,因为你不能再从你的路径中弹出位置。在所有事情都解开之后,才会调用断开递归循环的检查。
将此类支票的“已完成”检查移动......
location = new_location
if not done:
self.solve(location)