使用随机深度优先搜索算法生成多层迷宫2
使用随机深度优先搜索算法生成多层迷宫2
源码
import random
import pygame
pygame.init()
size = width, height = 1024, 768
screen = pygame.display.set_mode(size)
pygame.display.set_caption('火苗999℃')
diamond_color_size = 8
COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_YELLOW, COLOR_BLACK, COLOR_GREY, COLOR_GOLDEN, COLOR_NO_DIAMOND = list(range(
diamond_color_size))
COLOR = {
COLOR_RED: (255, 0, 0),
COLOR_BLUE: (0, 0, 255),
COLOR_GREEN: (0, 255, 0),
COLOR_YELLOW: (255, 255, 0),
COLOR_BLACK: (0, 0, 0),
COLOR_GREY: (250, 240, 230),
COLOR_GOLDEN : (255,215,0),
COLOR_NO_DIAMOND: (160, 160, 160),
}
DIAMOND_LENGTH = 10
DIAMOND_SIZE = (DIAMOND_LENGTH, DIAMOND_LENGTH)
DIAMOND=pygame.surface.Surface(DIAMOND_SIZE).convert()
DIAMOND.fill(COLOR[COLOR_BLUE])
DIAMOND_GREEN=pygame.surface.Surface(DIAMOND_SIZE).convert()
DIAMOND_GREEN.fill(COLOR[COLOR_GREEN])
DIAMOND_RED=pygame.surface.Surface(DIAMOND_SIZE).convert()
DIAMOND_RED.fill(COLOR[COLOR_RED])
DIAMOND_YELLOW=pygame.surface.Surface(DIAMOND_SIZE).convert()
DIAMOND_YELLOW.fill(COLOR[COLOR_YELLOW])
DIAMOND_GRAY=pygame.surface.Surface(DIAMOND_SIZE).convert()
DIAMOND_GRAY.fill(COLOR[COLOR_GREY])
DIAMOND_BLACK=pygame.surface.Surface(DIAMOND_SIZE).convert()
DIAMOND_BLACK.fill(COLOR[COLOR_BLACK])
DIAMOND_BLUE=pygame.surface.Surface(DIAMOND_SIZE).convert()
DIAMOND_BLUE.fill(COLOR[COLOR_BLUE])
DIAMOND_O=pygame.surface.Surface(DIAMOND_SIZE).convert()
DIAMOND_O.fill((255,128,0))
DIAMOND_G=pygame.surface.Surface(DIAMOND_SIZE).convert()
DIAMOND_G.fill((0,102,51))
DIAMOND_R=pygame.surface.Surface(DIAMOND_SIZE).convert()
DIAMOND_R.fill((102,0,0))
use_font = pygame.font.Font("FONT.TTF", 16)
background=pygame.surface.Surface(size).convert()
background.fill(COLOR[COLOR_NO_DIAMOND])
mini_font = pygame.font.Font("FONT.TTF", 8)
DIAMOND_U=pygame.surface.Surface(DIAMOND_SIZE).convert()
DIAMOND_U.fill(COLOR[COLOR_GREEN])
surface_u = mini_font.render("U", True, COLOR[COLOR_BLACK], COLOR[COLOR_GREEN])
DIAMOND_U.blit(surface_u, (0, 0))
DIAMOND_D=pygame.surface.Surface(DIAMOND_SIZE).convert()
DIAMOND_D.fill(COLOR[COLOR_GREEN])
surface_d = mini_font.render("D", True, COLOR[COLOR_BLACK], COLOR[COLOR_GREEN])
DIAMOND_D.blit(surface_d, (0, 0))
DIAMOND_UD=pygame.surface.Surface(DIAMOND_SIZE).convert()
DIAMOND_UD.fill(COLOR[COLOR_GREEN])
surface_ud = mini_font.render("UD", True, COLOR[COLOR_BLACK], COLOR[COLOR_GREEN])
DIAMOND_UD.blit(surface_ud, (0, 0))
clock = pygame.time.Clock()
NOWALL = 0
WALL = 1
STAIRS_U = 2
STAIRS_D = 4
STAIRS_UD = 6
def depth_maze_demo(levels, rows, cols):
if 0 == rows % 2:
rows+=1
if 0 == cols % 2:
cols+=1
wall=[[[ WALL for i in range(cols)]for i in range(rows)]for i in range(levels)]
l=0
r=1
c=1
history = [(l, r, c)]
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
return
if history:
if wall[l][r][c] == WALL:
wall[l][r][c] = NOWALL
check = []
if c > 1 and wall[l][r][c-2] == WALL:
check.append('L')
if r > 1 and wall[l][r-2][c] == WALL:
check.append('F')
if c < cols-2 and wall[l][r][c+2] == WALL:
check.append('R')
if r < rows-2 and wall[l][r+2][c] == WALL:
check.append('B')
if l < levels-1 and wall[l+1][r][c] == WALL:
check.append('U')
if l > 0 and wall[l-1][r][c] == WALL:
check.append('D')
if len(check):
history.append((l, r, c))
move_direction = random.choice(check)
if move_direction == 'L':
wall[l][r][c-1] = NOWALL
wall[l][r][c-2] = NOWALL
c=c-2
if move_direction == 'F':
wall[l][r-1][c] = NOWALL
wall[l][r-2][c] = NOWALL
r=r-2
if move_direction == 'R':
wall[l][r][c+1] = NOWALL
wall[l][r][c+2] = NOWALL
c=c+2
if move_direction == 'B':
wall[l][r+1][c] = NOWALL
wall[l][r+2][c] = NOWALL
r=r+2
if move_direction == 'U':
if wall[l][r][c] == STAIRS_D:
wall[l][r][c] = STAIRS_UD
else:
wall[l][r][c] = STAIRS_U
if wall[l+1][r][c] == STAIRS_U:
wall[l+1][r][c] = STAIRS_UD
else:
wall[l+1][r][c] = STAIRS_D
l=l+1
if move_direction == 'D':
if wall[l][r][c] == STAIRS_U:
wall[l][r][c] = STAIRS_UD
else:
wall[l][r][c] = STAIRS_D
if wall[l-1][r][c] == STAIRS_D:
wall[l-1][r][c] = STAIRS_UD
else:
wall[l-1][r][c] = STAIRS_U
l=l-1
else:
l, r, c = history.pop()
screen.blit(background, (0, 0))
for z in range(levels):
for x in range(cols):
for y in range(rows):
a = z % 2
b = z // 2
px, py = 1 + x * DIAMOND_SIZE[0] + a * (cols*DIAMOND_LENGTH+10), 1 + y * DIAMOND_SIZE[1] + b*(rows*DIAMOND_LENGTH+10)
s = (z)%3
if 0 == s:
color_c = DIAMOND_G
color_u = DIAMOND_O
color_d = DIAMOND_R
color_ud = DIAMOND_BLUE
elif 1 == s:
color_c = DIAMOND_O
color_u = DIAMOND_R
color_d = DIAMOND_G
color_ud = DIAMOND_BLUE
else:
color_c = DIAMOND_R
color_u = DIAMOND_G
color_d = DIAMOND_O
color_ud = DIAMOND_BLUE
if NOWALL == wall[z][y][x]:
screen.blit(color_c, (px, py))
elif WALL == wall[z][y][x]:
screen.blit(DIAMOND_GRAY, (px, py))
elif STAIRS_U == wall[z][y][x]:
screen.blit(color_u, (px, py))
elif STAIRS_D == wall[z][y][x]:
screen.blit(color_d, (px, py))
elif STAIRS_UD == wall[z][y][x]:
screen.blit(color_ud, (px, py))
else:
screen.blit(DIAMOND_YELLOW, (px, py))
if history:
a = l % 2
b = l // 2
px, py = 1 + c * DIAMOND_SIZE[0] + a * (cols*DIAMOND_LENGTH+10), 1 + r * DIAMOND_SIZE[1] + b*(rows*DIAMOND_LENGTH+10)
screen.blit(DIAMOND_RED, (px, py))
if not history:
score_surface = use_font.render("生成完成!", True, COLOR[COLOR_BLACK], COLOR[COLOR_GREY])
screen.blit(score_surface, (20, ((levels+ 1) // 2 )*(rows*DIAMOND_LENGTH+10)))
time_passed = clock.tick(30)
pygame.display.update()
return
if __name__ == "__main__":
'''main'''
depth_maze_demo(3, 21, 31)
生成的多层迷宫
gif演示
随机深度优先搜索算法生成多层迷宫