maze/maze/__init__.py

85 lines
2.3 KiB
Python
Raw Permalink Normal View History

import copy
2012-10-25 22:14:49 -07:00
from random import randint
2012-10-25 21:33:35 -07:00
2012-10-31 21:36:52 -07:00
WALL = 0
EMPTY = 1
PATH = 2
2012-10-31 21:47:48 -07:00
DEAD = 3
2012-10-31 21:36:52 -07:00
2012-10-25 21:33:35 -07:00
class CS235Maze(object):
2012-10-30 23:23:24 -07:00
def __init__(self, data):
self._data = data
self._size = len(data)
2012-10-31 23:12:27 -07:00
def _solve(self, x, y, z, path):
2012-10-31 21:36:52 -07:00
if x < 0 or y < 0 or z < 0 or \
x >= self._size or y >= self._size or z >= self._size:
return False
elif self._data[x][y][z] != EMPTY:
return False
elif x == self._size - 1 and y == self._size - 1 \
2012-10-31 21:44:29 -07:00
and z == self._size - 1:
2012-10-31 21:36:52 -07:00
self._data[x][y][z] = PATH
2012-10-31 22:03:37 -07:00
path.append((x, y, z))
2012-10-30 23:23:24 -07:00
return True
2012-10-31 21:36:52 -07:00
else:
self._data[x][y][z] = PATH
2012-10-31 22:03:37 -07:00
if self._solve(x - 1, y, z, path) or \
self._solve(x + 1, y, z, path) or \
self._solve(x, y - 1, z, path) or \
self._solve(x, y + 1, z, path) or \
self._solve(x, y, z - 1, path) or \
self._solve(x, y, z + 1, path):
path.append((x, y, z))
2012-10-31 21:36:52 -07:00
return True
else:
2012-10-31 21:47:48 -07:00
self._data[x][y][z] = DEAD
2012-10-31 21:36:52 -07:00
return False
def solve(self):
2012-10-31 22:03:37 -07:00
path = []
success = self._solve(0, 0, 0, path)
path.reverse()
return success, path
def __str__(self):
2012-10-31 22:33:50 -07:00
r = derp_transpose(self._data, self._size)
rs = ''
2012-10-31 21:36:52 -07:00
for i in xrange(self._size):
for j in xrange(self._size):
for k in xrange(self._size):
rs += '{} '.format(r[i][j][k])
rs += '\n'
rs += '\n'
return rs
2012-10-25 21:33:35 -07:00
def make_maze(size=8):
2012-10-25 22:14:49 -07:00
r = []
2012-10-25 21:33:35 -07:00
for i in xrange(size):
2012-10-25 22:14:49 -07:00
r.append([])
2012-10-25 21:33:35 -07:00
for j in xrange(size):
2012-10-25 22:14:49 -07:00
r[i].append([randint(0, 1) for k in xrange(size)])
2012-10-25 21:33:35 -07:00
r[0][0][0] = 1
2012-10-30 23:23:24 -07:00
r[size - 1][size - 1][size - 1] = 1
2012-10-31 21:36:52 -07:00
return CS235Maze(r)
2012-10-25 21:33:35 -07:00
2012-10-25 22:32:44 -07:00
def parse_maze(maze):
2012-10-31 22:03:45 -07:00
maze = maze.replace('\r', '')
soilded = [[[int(i) for i in j.split()]
2012-10-31 21:44:29 -07:00
for j in k.split('\n')]
for k in maze.split('\n\n') if k]
2012-10-30 23:23:24 -07:00
cleaned = derp_transpose(soilded, size=len(soilded))
return CS235Maze(cleaned)
def derp_transpose(s, size=8):
r = copy.deepcopy(s)
for i in xrange(size):
for j in xrange(size):
for k in xrange(size):
r[i][j][k] = s[k][j][i]
return r