|
import pygame
import random
# 初始化 Pygame
pygame.init()
# 屏幕尺寸
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("无边际迷宫小游戏")
# 颜色
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
blue = (0, 0, 255) # 障碍物的颜色
green = (0, 255, 0) # 终点的颜色
# 单元格大小
cell_size = 30
# 视口范围
viewport_width = screen_width // cell_size
viewport_height = screen_height // cell_size
# 迷宫生成函数
def generate_maze_chunk(x_offset, y_offset):
maze_chunk = {}
def is_valid(x, y):
return 0 <= x < viewport_width and 0 <= y < viewport_height
def dfs(x, y):
directions = [(0, 2), (2, 0), (0, -2), (-2, 0)]
random.shuffle(directions)
maze_chunk[(y, x)] = 0
for dx, dy in directions:
nx, ny = x + dx, y + dy
if is_valid(nx, ny) and (ny, nx) not in maze_chunk:
mx, my = x + dx // 2, y + dy // 2
maze_chunk[(my, mx)] = 0
dfs(nx, ny)
def add_obstacles():
for y in range(viewport_height):
for x in range(viewport_width):
if (y, x) in maze_chunk and maze_chunk[(y, x)] == 0:
if random.random() < 0.2: # 20% 的概率生成障碍物
maze_chunk[(y, x)] = 2
def add_endpoint():
valid_endpoints = [(y, x) for (y, x) in maze_chunk if maze_chunk[(y, x)] == 0]
if valid_endpoints:
endpoint = random.choice(valid_endpoints)
maze_chunk[endpoint] = 3 # 用 3 表示终点
return endpoint
return None
dfs(1, 1)
add_obstacles()
endpoint = add_endpoint()
return maze_chunk, endpoint
# 存储已生成的迷宫部分
generated_maze = {}
endpoint = None
# 玩家位置
player_x = 0
player_y = 0
# 游戏主循环
running = True
while running:
screen.fill(black)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
# 向上移动检查
if event.key == pygame.K_UP:
new_y = player_y - 1
if (new_y, player_x) in generated_maze and generated_maze[(new_y, player_x)] == 0:
player_y = new_y
# 向下移动检查
elif event.key == pygame.K_DOWN:
new_y = player_y + 1
if (new_y, player_x) in generated_maze and generated_maze[(new_y, player_x)] == 0:
player_y = new_y
# 向左移动检查
elif event.key == pygame.K_LEFT:
new_x = player_x - 1
if (player_y, new_x) in generated_maze and generated_maze[(player_y, new_x)] == 0:
player_x = new_x
# 向右移动检查
elif event.key == pygame.K_RIGHT:
new_x = player_x + 1
if (player_y, new_x) in generated_maze and generated_maze[(player_y, new_x)] == 0:
player_x = new_x
# 计算视口偏移
x_offset = player_x - viewport_width // 2
y_offset = player_y - viewport_height // 2
# 生成玩家周围的迷宫部分
for y in range(y_offset, y_offset + viewport_height):
for x in range(x_offset, x_offset + viewport_width):
if (y, x) not in generated_maze:
local_chunk, local_endpoint = generate_maze_chunk(x - x_offset, y - y_offset)
for (local_y, local_x), value in local_chunk.items():
generated_maze[(y, x)] = value
if local_endpoint:
endpoint = local_endpoint
# 绘制迷宫
for (y, x), value in generated_maze.items():
if (x_offset <= x < x_offset + viewport_width) and (y_offset <= y < y_offset + viewport_height):
if value == 1:
pygame.draw.rect(screen, white, ((x - x_offset) * cell_size, (y - y_offset) * cell_size, cell_size, cell_size))
elif value == 2: # 绘制障碍物
pygame.draw.rect(screen, blue, ((x - x_offset) * cell_size, (y - y_offset) * cell_size, cell_size, cell_size))
elif value == 3: # 绘制终点
pygame.draw.rect(screen, green, ((x - x_offset) * cell_size, (y - y_offset) * cell_size, cell_size, cell_size))
# 绘制玩家
pygame.draw.rect(screen, red, ((player_x - x_offset) * cell_size, (player_y - y_offset) * cell_size, cell_size, cell_size))
# 检查胜利条件
if (player_y, player_x) == endpoint:
font = pygame.font.Font(None, 36)
text = font.render("You Win!", True, white)
screen.blit(text, (screen_width // 2 - 50, screen_height // 2 - 20))
pygame.display.flip()
pygame.time.wait(3000) # 显示 3 秒
running = False
pygame.display.flip()
# 退出 Pygame
pygame.quit() |
|