So, meine Funktion ist rekursiv, und funktioniert.
Vielen Dank an alle für die Hilfe.
Wenn sich jemand das Ding noch zur Optimierung ansehen will:
Code: Alles auswählen
'''
Created on 07.12.2011
@author: Roland-User
'''
import threading
import time
import sys
DIRECTIONS = RIGHT, LEFT, UP, DOWN=[(1,0),(-1,0),(0,-1),(0,1)]
DIRECTION_TO_STR = { RIGHT: 'rechts', LEFT: 'links', UP: 'oben', DOWN: 'unten' }
FINISH_CHAR="F"
FREE_CHAR=" "
VISITED_CHAR="."
def suggest_dir(pos,env):
(x,y)=pos
result=list()
for direction in DIRECTIONS:
(x_new,y_new)=direction
field=env[x+x_new][y+y_new]
if(field==FINISH_CHAR):
return [direction]
if (field==FREE_CHAR):
result.append(direction)
return result
class maze:
maze_Rows=[]
def __init__(self,Input_Filename):
self.Input_File=open(Input_Filename,'r');
self.maze_File=self.Input_File.readlines();
self.read_In()
'Destruktor der Klasse, wird aufgerufen, wenn die Klasse nicht mehr existiert. Hier wird die Labyrinth-Datei wieder geschlossen'
def __del__(self):
self.Input_File.close()
'read_In: Die Funktion bearbeitet die eingelesenen Daten so, dass Zeilenumbrueche wegfallen, und schreibt sie in die Variable maze_Rows'
def read_In(self):
for i in xrange(len(self.maze_File)):
if i+1 < len(self.maze_File):
self.storage=self.maze_File[i]
self.storage=self.storage[:len(self.storage)-1]
self.maze_File[i]=self.storage
for i in xrange(len(self.maze_File)):
storage=[]
for j in xrange(len(self.maze_File[i])):
storage.append(self.maze_File[i][j])
self.maze_Rows.append(storage)
'Nun muss noch x und y vertauscht werden'
maze_Temp=[]
for i in xrange(len(self.maze_Rows[0])):
storage=[]
for j in xrange(len(self.maze_Rows)):
storage.append(self.maze_Rows[j][i])
maze_Temp.append(storage)
self.maze_Rows=maze_Temp
#print self.maze_Rows
'__getitem__ gibt einfach maze_Rows an der Stelle (x,y) aus'
def __getitem__(self,args):
print self.maze_Rows[args[0]][args[1]]
'Die Funktion __setitem__ erlaubt es, bestimmte Zellen innerhalb des Labyrinths mit eigenen Daten zu fuellen'
def __setitem__(self,args,input_args):
self.maze_Rows[args[0]][args[1]]=input_args
return 1
'Diese Funktion ist fuer das korrekte funktionieren des Befehls "print <Klasse>" zustaendig'
def __str__(self):
druck=""
'''
j=len(self.maze_Rows)-1
while j >=0:
i=len(self.maze_Rows[0])-1
while i >=0:
druck=druck+str(self.maze_Rows[j][i])
i=i-1
druck=druck+str('\n')
j=j-1
'''
j=len(self.maze_Rows[0])-1
for i in xrange(len(self.maze_Rows)-1,-1,-1):
for j in xrange(len(self.maze_Rows[i])-1,-1,-1):
druck=druck + str(self.maze_Rows[i][j]) + " "
druck=druck + str('\n')
return druck
'getStart gibt den Ort des Startpunktes zurueck'
def getStart(self):
for i in xrange(len(self.maze_Rows)):
for j in xrange(len(self.maze_Rows[i])):
if(self.maze_Rows[i][j]=='S'):
return i,j
else:
pass
'getFinish gibt den Ort des Zielpunktes zurueck'
def getFinish(self):
for i in xrange(len(self.maze_Rows)):
for j in xrange(len(self.maze_Rows[i])):
if(self.maze_Rows[i][j]=='F'):
return i,j
else:
pass
def solve_maze(self,pos):
(x,y)=pos
suggested_dir=suggest_dir(pos,self.maze_Rows)
print self.__str__()
#print suggest_dir(pos,self.maze_Rows)
if (x, y) == self.getFinish():
print self.__str__()
print 'Finished'
sys.exit()
else:
suggested_dir=suggest_dir(pos,self.maze_Rows)
if(len(suggested_dir)==0):
print "Sackgasse"
print pos
self.maze_Rows[pos[0]][pos[1]]=VISITED_CHAR
return 1
else:
for direction in suggested_dir:
(x_delta,y_delta)=direction
self.maze_Rows[x][y]=VISITED_CHAR
self.solve_maze((x+x_delta,y+y_delta))