Advertisement
Guest User

Untitled

a guest
Feb 17th, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.06 KB | None | 0 0
  1. import pygame
  2. import random
  3. import sys
  4. import random
  5.  
  6. def buildRelationships(nodeList):
  7.     for a in nodeList:
  8.         for b in a:
  9.             for w in b.wallList:
  10.                 if w != None:
  11.                     w.attachedNodes.append(b)
  12.  
  13.  
  14. class Wall:
  15.     def __init__(self, start, end):
  16.         self.start = start
  17.         self.end = end
  18.         self.weight = random.randint(0, 10)
  19.         self.attachedNodes = []
  20.  
  21.     def startFinish(self):
  22.         return (str(self.start) + " -> " + str(self.end))
  23.  
  24.  
  25. class Grid:
  26.     def __init__(self, n):
  27.         self.walls = []
  28.         for y in range(n + 1):
  29.             for x in range(n):
  30.                 self.walls.append(Wall((x, y), (x + 1, y)))
  31.  
  32.             if y < n:
  33.                 for x in range(n + 1):
  34.                     self.walls.append(Wall((x, y), (x, y + 1)))
  35.  
  36.  
  37. class DualWall:
  38.     def __init__(self, weight, ref):
  39.         self.weight = weight
  40.         self.ref = ref
  41.         self.attachedNodes = []
  42.  
  43.  
  44. class DGrid:
  45.     def __init__(self, n, walls):
  46.         self.dWalls = []
  47.         for a in range(n + 1):
  48.             for b in range(n):
  49.                 self.dWalls.append(DualWall(walls[(a * ((2 * (n + 1)) + 1) + (n + 1) + 1 + b)].weight,
  50.                                             walls[(a * ((2 * (n + 1)) + 1) + (n + 1) + 1 + b)]))
  51.             if a < n:
  52.                 for b in range(n + 1):
  53.                     self.dWalls.append(DualWall(walls[((a + 1) * ((2 * (n + 1)) + 1) + b)].weight,
  54.                                                 walls[((a + 1) * ((2 * (n + 1)) + 1) + b)]))
  55.  
  56.  
  57. class Node:
  58.     def __init__(self, top, left, right, bottom):
  59.         self.top = top
  60.         self.left = left
  61.         self.right = right
  62.         self.bottom = bottom
  63.         self.wallList = [self.top, self.left, self.right, self.bottom]
  64.  
  65.  
  66. class NodeList:
  67.     def __init__(self, n, walls):
  68.         self.nodes = []
  69.         for a in range(n):
  70.             self.nodes.append([])
  71.             for b in range(n):
  72.                 if a == 0:
  73.                     top = None
  74.                 else:
  75.                     top = walls[(a - 1) * ((2 * (n - 1)) + 1) + b + (n - 1)]
  76.  
  77.                 if a == n - 1:
  78.                     bottom = None
  79.                 else:
  80.                     bottom = walls[(a * ((2 * (n - 1)) + 1) + b + (n - 1))]
  81.  
  82.                 if b == 0:
  83.                     left = None
  84.                 else:
  85.                     left = walls[(a * ((2 * (n - 1)) + 1) + b - 1)]
  86.  
  87.                 if b == n - 1:
  88.                     right = None
  89.                 else:
  90.                     right = walls[(a * ((2 * (n - 1)) + 1) + b)]
  91.  
  92.                 self.nodes[a].append(Node(top,
  93.                                           left,
  94.                                           right,
  95.                                           bottom))
  96.  
  97. def draw_map(surface,Grid_object,width):
  98.     for wall in Grid_object.walls:
  99.         start = wall.start
  100.         end = wall.end
  101.         pygame.draw.line(surface, (255, 255, 255), (start[0]*width + center, start[1]*width + center), (end[0]*width + center, end[1]*width + center))
  102.  
  103. def remove(surface,wall):
  104.     start = wall.start
  105.     end = wall.end
  106.     pygame.draw.line(surface, (0,0,0) ,(start[0]*width + center, start[1]*width + center), (end[0]*width + center, end[1]*width + center) )
  107.  
  108. class Maze:
  109.     def __init__(self, n):
  110.         self.n = n
  111.         self.mainGrid = Grid(n)
  112.         self.dualGrid = DGrid(n - 1, self.mainGrid.walls)
  113.         self.vertices = NodeList(n, self.dualGrid.dWalls).nodes
  114.         buildRelationships(self.vertices)
  115.         self.mainVert = NodeList(n + 1, self.mainGrid.walls).nodes
  116.         buildRelationships(self.mainVert)
  117.  
  118.  
  119.  
  120.         start_finish_index = random.randint(0, n-1)
  121.         self.mainGrid.walls.pop(start_finish_index)
  122.         self.mainGrid.walls.pop(-(start_finish_index + 1))
  123.    
  124.  
  125.  
  126.  
  127.         availableWalls = []
  128.         visitedNodes = []
  129.         currentNode = random.choice(random.choice(self.vertices))
  130.         while (True):
  131.             for w in currentNode.wallList:
  132.                 if w != None:
  133.                     availableWalls.append(w)
  134.                    
  135.             visitedNodes.append(currentNode)
  136.  
  137.             lowestWall = None
  138.             for x in availableWalls:
  139.                 if lowestWall != None:
  140.                     if x.weight < lowestWall.weight:
  141.                         lowestWall = x
  142.                 else:
  143.                     lowestWall = x
  144.            
  145.             nip = lowestWall.attachedNodes
  146.             for x in nip:
  147.                 if x not in visitedNodes:
  148.                     nextNode = x
  149.            
  150.             print(availableWalls)
  151.             for x in availableWalls:
  152.                 print(x.weight)
  153.             print("LW: " + str(lowestWall.weight))
  154.            
  155.            
  156.             print("AW: " + str(availableWalls))
  157.             print("LW: " + str(lowestWall))
  158.             print("REF: " + str(lowestWall.ref))
  159.             print("LIST: " + str(self.mainGrid.walls))
  160.            
  161.             availableWalls.remove(lowestWall)
  162.             self.mainGrid.walls.remove(lowestWall.ref)
  163.             self.dualGrid.dWalls.remove(lowestWall)
  164.            
  165.            
  166.             print(visitedNodes)
  167.             print("NL: " + str(lowestWall.attachedNodes))
  168.            
  169.             if nextNode == currentNode:
  170.                 break
  171.             nextNode.wallList.remove(lowestWall)
  172.            
  173.             print('----------------')
  174.            
  175.            
  176.             currentNode = nextNode
  177.            
  178.             print(nextNode)
  179.  
  180.  
  181.  
  182. n = 40
  183.  
  184. pygame.init()
  185. sizeX = 1200
  186. sizeY = 1200
  187. grid_size = n
  188. width = 25
  189. running = True  
  190. center = (sizeX - width*grid_size)/2
  191. screen = pygame.display.set_mode((sizeX,sizeY))
  192.  
  193.  
  194. maze = Maze(n)
  195. grid = maze.mainGrid
  196.  
  197. pygame.display.set_caption("Maze")
  198.  
  199. draw_map(screen, grid, width)
  200.  
  201. while running:
  202.     for event in pygame.event.get():
  203.         if event.type == pygame.QUIT:
  204.             running = False
  205.             pygame.display.quit()
  206.             pygame.quit()
  207.             sys.exit()
  208.     pygame.display.update()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement