2016-03-27 14 views
0

Ich schreibe ein Programm, das eine Karte von Symbolen importiert und rekursiv die Karte navigiert. Es ist fertig und es funktioniert fast, aber aus welchen Gründen auch immer springt die Karte immer einen Punkt aus und ich kann nicht warum finden. Es soll den richtigen Pfad mit 'X' markieren und die Teile, die nicht mit einem '+' verwendet werden. Wenn jemand das überprüfen und einen Fehler finden könnte, den ich verpasst habe, wäre es sehr zu schätzen!Erstellen einer Karte mit Rekursion?

Das Gitter Ich versuche zu durchqueren sieht wie folgt aus: enter image description here

Wenn Sie den Code mit dem Netz laufen lässt es auch einige Zeichen unverändert, und egal wo ich Code setzen sie ignoriert sie völlig. Ich habe etwas in wie versucht setzen:

for i in grid: 
    for j in i: 
     if j == "|": 
      j = "+" 
     if j == "#": 
      j = "+" 

Und der Code, den ich es laufen bin auf ist:

grid = [] 

def buildGrid(): 
    with open("Maze.txt" , "r") as f: 
     for line in f: 
      chars = [] 
      for c in line: 
       if c != "\n": 
        chars.append(c) 
      grid.append(chars)  
    freeMouse(0, 0) 

def showPath(): 
    result = "" 
    for i in grid: 
     for j in i: 
      result += " " 
      result += j 
     result += "\n" 
    print(result) 

def freeMouse (x, y): 
    if grid[y][x] == "O": 
     grid[0][0] = "S" 
     showPath() 
    elif grid[y][x] == "X": 
     return False 
    elif grid[y][x] == ("|"): 
     grid[y][x]= "+" 
     return False 
    elif grid[y][x] == ("+"): 
     return False 
     print("false") 
    grid[y][x] = "X" 
    if x != 0: 
     if y != 0: 
      left = freeMouse (x-1, y) 
      up = freeMouse(x, y -1) 
      if len(grid) == y + 1: 
       if len(grid[y]) != x+1: 
        right = freeMouse (x + 1, y) 
        if not right: 
         grid[y][x+1] = "+" 
      else: 
       if len(grid[y]) == x+1: 
        down = freeMouse(x, y+1) 
       else: 
        down = freeMouse(x, y+1) 
        right = freeMouse (x + 1, y) 
        if not right: 
         grid[y][x+1] = "+" 
       if not down: 
        grid[y+1][x] = "+" 
      if not up: 
       grid[y-1][x] = "+" 
      if not left: 
       grid[y][x-1] = "+" 
     else: 
      if len(grid[y])== x + 1: 
       left = freeMouse (x-1, y) 
       down = freeMouse (x, y+1) 
      else: 
       left = freeMouse (x-1, y) 
       down = freeMouse (x, y+1) 
       right = freeMouse (x+1, y) 
       if not right: 
        grid[y][x+1] = "+" 
      if not down: 
       grid[y+1][x] = "+" 
      if not left: 
       grid[y][x-1] = "+" 
    else: 
     if y != 0: 
      if len(grid) == y + 1: 
       up = freeMouse(x,y-1) 
       right = freeMouse (x+1, y) 
      else: 
       up = freeMouse(x, y-1) 
       down = freeMouse(x, y+1) 
       right = freeMouse(x + 1, y) 
       if not down: 
        grid[y+1][x] = "+" 
      if not up: 
       grid[y-1][x] = "+"  
     else: 
      down = freeMouse(x, y+1) 
      right = freeMouse(x+1, y) 
      if not down: 
       grid[y+1][x] = "+" 


buildGrid() 
+1

Bitte geben Sie die von Ihnen verwendete Eingabedatei an, damit das Problem reproduzierbar ist. Veröffentlichen Sie auch das Ergebnis, das Sie erhalten. – albertoql

+2

Ihr Code hat viele Probleme. Die Funktion 'freeMouse' gibt niemals' True' zurück; Die einzigen Rückgabewerte sind 'False' und' None'. Sie haben eine print-Anweisung nach einer return-Anweisung, die nicht erreichbar ist. Sie rufen freeMouse mehrmals nacheinander auf, ohne den Rückgabewert zu überprüfen. Das bedeutet, dass Ihr Programm weiterhin nach Pfaden durch das Labyrinth suchen kann, nachdem es bereits einen gefunden hat. Das erste Code-Snippet, das Sie angeben, führt zu nichts, da Sie die Schleifenvariablen ändern, nicht das Raster. Wenn Sie denken, dass der Code "fast funktioniert", irren Sie sich. –

+0

Ich würde vorschlagen, dass Sie zuerst Teile Ihres Codes in atomaren Funktionen definieren/umgestalten und dann jede Funktion einzeln testen, bevor Sie sie zusammensetzen. Das gibt Ihnen eine Möglichkeit, es Schritt für Schritt auszuarbeiten. – Mai

Antwort

0

ich Ihren Code versucht mit und bekam die folgende Ausgabe

S X + + X X X X X X 
X + + X + X + + + X 
+ X + + + X | # + X 
+ X X X X X # # + X 
+ + + + + | | | + X 
+ + | + X X X X + X 
+ + + X X | + X X X 
+ + + X X # | + + + 
+ + + + X + + X X X 
+ + + + X X X X + O 

Ich sehe ein paar Ersatznummern, die nicht verarbeitet wurden. ich wie das Problem fühlen, ist in der return-Anweisungen - Sie beachten sollten, dass ‚nicht Keine == True‘ Sie dies durch eine Python-Konsole zu öffnen und die Eingabe der

def func(): 
    return 
print not func(); // This returns true 

So folgt testen, kann ich würde empfehlen, die Anweisungen "wenn nicht hoch", "wenn nicht runter" usw. zu entfernen.

if grid[y][x] == "O": 
    grid[0][0] = "S" 
    showPath() 
# To stop from endless recursion -- don't go back to traversed path 
elif grid[y][x] == "X": 
    return False 
# Don't run into wall 
elif grid[y][x] == ("|"): 
    grid[y][x]= "+" 
    return False 
# Don't run into locations already not traversable 
elif grid[y][x] == ("+"): 
    grid[y][x]= "+" 
    return False 
    print("false") 
# Mark path as traversed 
grid[y][x] = "X" 

# If not at left end -- to avoid boundary issues 
if x != 0: 
    # If not at top end 
    if y != 0: 
     left = freeMouse (x-1, y) 
     up = freeMouse(x, y -1) 

     # If at bottom end 
     if len(grid) == y + 1: 
      # If not at right end -- traverse right 
      if len(grid[y]) != x+1: 
       right = freeMouse (x + 1, y) 

     # If not at bottom end 
     else: 
      # If at right end -- traverse down 
      if len(grid[y]) == x+1: 
       down = freeMouse(x, y+1) 
      # If not at right end -- traverse down or right 
      else: 
       down = freeMouse(x, y+1) 
       right = freeMouse (x + 1, y) 
    # If you are at top end 
    else: 
     # If you are at right end 
     if len(grid[y])== x + 1: 
      # Traverse left or down 
      left = freeMouse (x-1, y) 
      down = freeMouse (x, y+1) 
     else: 
      # Traverse left, down, or right 
      left = freeMouse (x-1, y) 
      down = freeMouse (x, y+1) 
      right = freeMouse (x+1, y) 
# If you are at left end 
else: 
    # If you aren't at top end 
    if y != 0: 
     # If you are at right end 
     if len(grid) == y + 1: 
      # Try to traverse right or up 
      up = freeMouse(x,y-1) 
      right = freeMouse (x+1, y) 
     else: 
      # Try to traverse up, down, right 
      up = freeMouse(x, y-1) 
      down = freeMouse(x, y+1) 
      right = freeMouse(x + 1, y) 
    # If you are at top end 
    else: 
     # Try to traverse down or right 
     down = freeMouse(x, y+1) 
     right = freeMouse(x+1, y) 

Wenn die Anforderung ist einfach von Anfang an zu navigieren, obwohl zu Ende, ich fühle mich wie Sie Ihren Code stark

def freeMouse (x, y): 
    if x < 0 or y < 0 or y+1 > len(grid) or x+1 > len(grid[y]): 
     return 
    if grid[y][x] == "O": 
     grid[0][0] = "S" 
     showPath() 
    elif grid[y][x] == "X": 
     return 
    elif grid[y][x] == ("|"): 
     grid[y][x]= "+" 
     return 
    elif grid[y][x] == ("+"): 
     return 

    grid[y][x] = "X" 
    freeMouse(x-1,y) 
    freeMouse(x+1,y) 
    freeMouse(x,y-1) 
    freeMouse(x,y+1) 

    return 

Aber dann wieder

vereinfachen könnten, ich bin Ihre Anforderungen nicht so sicher. Lassen Sie mich wissen, ob die obige Lösung für Sie nicht funktioniert