import numpy as np class Traveller(object): @property def x(self): return self.pos[0] @x.setter def x(self, val): self.pos = val, self.pos[1] @property def y(self): return self.pos[1] @y.setter def y(self, val): self.pos = self.pos[0], val def __init__(self, starting_cell): self.pos = starting_cell self.connections = [] self.visited = {self.pos} def random_walk(self, array): if len(self.visited) == array.size: return steps = [] maxx, maxy = array.shape sx,sy = None,None while (sx,sy) == (None,None) or (sx,sy) in self.visited: sx = np.random.random_integers(0,maxx-1) sy = np.random.random_integers(0,maxy-1) steps.append((sx,sy)) while True: dx, dy = 0,0 r = np.random.random() if r < 0.25: # x-1 dx = -1 elif r < 0.5: # x+1 dy = 1 elif r < 0.75: # y-1 dx = 1 else: # y+1 dy = -1 opos = self.pos sx += dx sy += dy if sx < 0: sx = 0 elif sx >= maxx: sx = maxx-1 if sy < 0: sy = 0 elif sy >= maxy: sy = maxy-1 steps.append((sx,sy)) if (sx,sy) in self.visited: met = set() path = [] for x in steps: if x in met: path = path[:path.index(x)+1] met = set(path) else: path.append(x) met.add(x) steps = deloop(path) break self.connections.extend(zip(steps, steps[1:])) self.visited.update(steps) def deloop(path): result = [] idx = 0 while idx < len(path): x = path[idx] result.append(x) try: next_x = path[idx+1:].index(x) idx = next_x + idx+1 except ValueError: idx += 1 return(result) x,y = 49,29 maze = np.array(range(1,x*y+1)) maze.shape = x,y t = Traveller((x/2, y/2))