找回密码
 中文实名注册
查看: 67|回复: 0

迷宫小游戏

[复制链接]

5

主题

7

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2025-1-19 17:33:24 | 显示全部楼层 |阅读模式
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()
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

小黑屋|东台市机器人学会 ( 苏ICP备2021035350号-1;苏ICP备2021035350号-2;苏ICP备2021035350号-3 )

GMT+8, 2025-3-14 20:40 , Processed in 0.039170 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表