迷宫搜索,没有有关Python中图块的信息

时间:2019-03-17 12:16:02

标签: python search turtle-graphics maze

我正在研究使用Python中的turtle模块生成的迷宫。 我可以通过代理通过5个动作与迷宫互动。 这些动作(方法)是{前进,后退,右,左,IsSuccess},其中4个动作,一个是检查我是否到达迷宫的终点线。

了解范围所需的一些信息。
1:我可以访问他所在的特工的当前位置(x,y)
2:座席始终面对相同的方向,例如,如果命令他向右走,他将沿适当的方向旋转90度并向前移动一组给定的像素,然后转向- 90度再次面对相同的方向。
3:如果使用一种移动方法时他与迷宫中的墙壁相撞,则移动将被撤消,并返回 False 。如果移动有效,则他将保持在新位置并返回 True
4:无需回溯即可获得完成的路径。
5:迷宫以圆形方式构建,玩家从中间开始,目的是摆脱圆形迷宫。检查玩家是否赢得游戏的参数是玩家离中心的距离。例如,玩家可能从一个圆形值50开始,在内外圆之间移动会给该值+25或-25。虽然目标是达到特定值,例如125。

现在,我从一些简单的递归搜索算法开始,但是无论如何进行调整,在迷宫中浏览x步后,都会卡住。这是我到目前为止的内容:

def escape():
    if isSuccess():
        return True

   position = (math.floor(agent.pos()[0]),math.floor(agent.pos()[1])) #Gets current agent position

   if position in visistedPositions:
       print("Already visited here")
       return False
   visistedPositions.append(position) #Adds agents position to visited list

   if(Right(agent)):
       print("Moved right")
       escape()
   else:
       print("Could not move Right")
   if(Backward(agent)):
       print("Moved Back")
       escape()
   else:
       print("Could not move Back")
   if(Left(agent)):
       print("Moved Left")
       escape()
   else:
       print("Could not move Left")
   if(Forward(agent)):
       print("Moved Forward")
       escape()
   else:
       print("Could not move Forward")
   return False

关于如何仅使用给定操作就可以完成此任务的任何建议?我已经研究和探索了不同的算法,例如BFS,DFS和A *,但是我看不到如何使这些算法适合这个问题。欢迎任何建议。

编辑: 为了更清楚地了解代理如何移动,我发布了Right()Backward()方法的摘要。

def Right(agent):
global circle_level
if circle_level < SUCCESS_LEVEL:
    #turtle.home()
    p1 = Point(agent.pos()[0], agent.pos()[1])
    agent.circle(circle_level,-22.5)
    p2 = Point(agent.pos()[0], agent.pos()[1])
    if isBlocked(Line(p1,p2)):
        print('blocked')
        agent.circle(circle_level,22.5)
        return False
return True

def Backward(agent):
global circle_level
if circle_level > 50 and circle_level < SUCCESS_LEVEL:
    circle_level -= 20
    p1 = Point(agent.pos()[0], agent.pos()[1])
    agent.right(90)
    agent.backward(20)
    agent.right(-90)
    p2 = Point(agent.pos()[0], agent.pos()[1])
    if isBlocked(Line(p1,p2)):
        print('blocked')
        circle_level += 20
        agent.right(90)
        agent.forward(20)
        agent.right(-90)
        return False
return True

1 个答案:

答案 0 :(得分:0)

尽管这似乎是一种递归函数,但我会继续尝试。我看到的主要问题是您递归调用escape(),但忽略其返回值。您怎么会知道递归成功了?

以下是我对您的代码的重做,以解决此问题:

def escape():
    if isSuccess():
        return True

    position = (math.floor(agent.xcor()), math.floor(agent.ycor()))  # Get current agent position

    if position in visitedPositions:
        print("Already visited here")
        return False

    visitedPositions.append(position)  # Add agent's position to visited list

    if Right(agent):
        print("Moved right")
        return escape()

    print("Could not move Right")

    if Backward(agent):
        print("Moved Back")
        return escape()

    print("Could not move Back")

    if Left(agent):
        print("Moved Left")
        return escape()

    print("Could not move Left")

    if Forward(agent):
        print("Moved Forward")
        return escape()

    print("Could not move Forward")

    return False

如果将visitedPositions [拼写更改]设为set而不是list,可能会更有效率。