git.fiddlerwoaroof.com
Raw Blame History
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))