-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMaze.py
62 lines (51 loc) · 2.1 KB
/
Maze.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import random as rnd
class Maze():
def __init__(self, width, height):
self.width = width
self.height = height
self.nodes = []
for x in range(0, width):
yRow = []
for y in range(0, height):
yRow.append(Node(x,y))
self.nodes.append(yRow)
self.startX = rnd.randint(0, self.width-1)
self.startY = rnd.randint(0, self.height-1)
self.currentNode = self.nodes[self.startX][self.startY]
self.nodeStack = []
self.started = False
def generate(self):
while self.started == False or len(self.nodeStack) > 0:
self.generateNextStep()
def generateNextStep(self):
if self.started == True and len(self.nodeStack) == 0:
return None, None
self.started = True
self.currentNode.visited = True
neighbours = list(self.getNonVisitedNeighbourNodes(self.currentNode))
if(len(neighbours) == 0):
lastNode = self.currentNode
self.currentNode = self.nodeStack.pop()
return lastNode, True
nextRandom = rnd.randint(0, len(neighbours)-1)
nextNode = neighbours[nextRandom]
self.currentNode.nodes.append(nextNode)
nextNode.nodes.append(self.currentNode)
self.nodeStack.append(self.currentNode)
self.currentNode = nextNode
return self.nodeStack[len(self.nodeStack)-1], False
def getNonVisitedNeighbourNodes(self, node):
if node.x > 0 and self.nodes[node.x-1][node.y].visited == False:
yield self.nodes[node.x-1][node.y]
if node.x+1 < self.width and self.nodes[node.x+1][node.y].visited == False:
yield self.nodes[node.x+1][node.y]
if node.y > 0 and self.nodes[node.x][node.y-1].visited == False:
yield self.nodes[node.x][node.y-1]
if node.y+1 < self.height and self.nodes[node.x][node.y+1].visited == False:
yield self.nodes[node.x][node.y+1]
class Node():
def __init__(self, x, y):
self.x = x
self.y = y
self.visited = False
self.nodes = []