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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
import random from maze import * from draw_maze import *
def aldous_broder_maze_demo(levels, rows, cols): if 0 == levels % 2: levels+=1 if 0 == rows % 2: rows+=1 if 0 == cols % 2: cols+=1 maze_map = maze_init_draw(levels, rows, cols) notusegrids = [] for tz in range(0, levels): for tx in range(0, cols): for ty in range(0, rows): if maze_map[tx][ty][tz]==CELL_NO_VISIT: notusegrids.append((tx, ty, tz)) elif maze_map[tx][ty][tz] == WALL_NO_VISIT: maze_map[tx][ty][tz] = WALL_VISIT nowx,nowy,nowz = random.choice(notusegrids) maze_map[nowx][nowy][nowz]=CELL_VISIT notusegrids.remove((nowx,nowy,nowz)) posx,posy=None,None while True: for event in pygame.event.get(): if event.type == pygame.QUIT: return if notusegrids: directions = [] if nowy > 1: directions.append('f') if nowx > 1: directions.append('l') if nowy < rows-2: directions.append('b') if nowx < cols-2: directions.append('r') if nowz < levels-1: directions.append('u') if nowz > 0: directions.append('d') if len(directions): move = random.choice(directions) if move == 'f': newy = nowy-2 newx = nowx newz = nowz opwall=(nowx,nowy-1,nowz) if move == 'l': newy = nowy newx = nowx-2 newz = nowz opwall=(nowx-1,nowy,nowz) if move == 'b': newy = nowy+2 newx = nowx newz = nowz opwall=(nowx,nowy+1,nowz) if move == 'r': newy = nowy newx = nowx+2 newz = nowz opwall=(nowx+1,nowy,nowz) if move == 'u': newy = nowy newx = nowx newz = nowz+2 opwall=(nowx,nowy,nowz+1) if move == 'd': newy = nowy newx = nowx newz = nowz-2 opwall=(nowx,nowy,nowz-1) if maze_map[newx][newy][newz] == CELL_NO_VISIT: if opwall: maze_map[opwall[0]][opwall[1]][opwall[2]] = NOWALL if move == 'd': if maze_map[nowx][nowy][nowz] == STAIRS_U: maze_map[nowx][nowy][nowz]=STAIRS_UD else: maze_map[nowx][nowy][nowz]=STAIRS_D maze_map[newx][newy][newz]=STAIRS_U elif move == 'u': if maze_map[nowx][nowy][nowz] == STAIRS_D: maze_map[nowx][nowy][nowz]=STAIRS_UD else: maze_map[nowx][nowy][nowz]=STAIRS_U maze_map[newx][newy][newz]=STAIRS_D else: maze_map[newx][newy][newz]=CELL_VISIT nowx=newx nowy=newy nowz=newz notusegrids.remove((newx,newy,newz)) else: nowx=newx nowy=newy nowz=newz draw_maze(maze_map, levels, rows, cols, (nowx, nowy, nowz), not notusegrids) time_passed = clock.tick(30) pygame.display.update() return
if __name__ == "__main__": '''main''' aldous_broder_maze_demo(4, 11, 15)
|