当前位置:首页>python>Python实现迷宫小游戏

Python实现迷宫小游戏

  • 2026-10-25 03:58:49
Python实现迷宫小游戏

要用Python实现一个视觉效果丰富的多彩迷宫,通过Pygame库来实现这个需求——Pygame具备便捷的图形绘制和色彩渲染能力,非常适合制作这类可视化项目。下面提供完整的可运行代码,并详细讲解实现原理。

一、完整实现代码

import pygameimport randomimport sys# 1. 初始化配置# 迷宫尺寸参数(建议使用奇数,保证迷宫通路完整性)MAZE_WIDTH = 51# 迷宫横向格子数MAZE_HEIGHT = 31# 迷宫纵向格子数CELL_SIZE = 20# 每个格子的像素大小WINDOW_WIDTH = MAZE_WIDTH * CELL_SIZEWINDOW_HEIGHT = MAZE_HEIGHT * CELL_SIZE# 颜色配置(RGB格式,丰富多彩的配色方案)COLORS = {"bg": (24, 24, 24),                # 窗口背景色(深灰)"wall": (50, 50, 50),              # 迷宫墙壁色(中灰)"path": (255, 255, 255),           # 迷宫通路色(白色)"start": (0, 255, 0),              # 起点色(绿色)"end": (255, 0, 0),                # 终点色(红色)"highlight": [(255, 105, 180),     # 多彩高亮色列表(用于动态渲染)                  (135, 206, 235),                  (152, 251, 152),                  (255, 215, 0),                  (238, 130, 238),                  (255, 165, 0)]}# 2. 初始化Pygamepygame.init()screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))pygame.display.set_caption("多彩迷宫(深度优先搜索生成)")clock = pygame.time.Clock()defcreate_maze(width, height):"""    用深度优先搜索(DFS)算法生成迷宫    :param width: 迷宫横向格子数    :param height: 迷宫纵向格子数    :return: 二维列表表示的迷宫(1=墙壁,0=通路)    """# 初始化迷宫:所有格子先设为墙壁(1),后续挖通通路(0)    maze = [[1for _ in range(width)] for _ in range(height)]# 深度优先搜索的栈结构,存储当前探索的坐标    stack = []# 选择起点(必须是奇数坐标,保证挖通时不会越界)    start_x, start_y = 1, 1    maze[start_y][start_x] = 0# 标记起点为通路    stack.append((start_x, start_y))# 定义四个移动方向(上下左右,每次移动2格,跳过中间墙壁)    directions = [(0, -2), (0, 2), (-2, 0), (2, 0)]while stack:# 获取当前所在位置        current_x, current_y = stack[-1]        unvisited = []# 检查四个方向是否有未访问的格子for dx, dy in directions:            new_x = current_x + dx            new_y = current_y + dy# 边界判断:确保新坐标在迷宫范围内,且未被访问(仍为墙壁)if1 <= new_x < width - 1and1 <= new_y < height - 1and maze[new_y][new_x] == 1:                unvisited.append((dx, dy))if unvisited:# 随机选择一个未访问的方向            dx, dy = random.choice(unvisited)            new_x = current_x + dx            new_y = current_y + dy# 挖通当前格子到新格子的通路(包括中间墙壁)            maze[current_y + dy//2][current_x + dx//2] = 0            maze[new_y][new_x] = 0# 将新格子压入栈,继续探索            stack.append((new_x, new_y))else:# 无未访问方向,回溯(弹出栈顶)            stack.pop()# 标记迷宫的起点和终点(固定在左上角和右下角)    maze[1][1] = 2# 2=起点标记    maze[height-2][width-2] = 3# 3=终点标记return mazedefdraw_maze(maze):"""    绘制多彩迷宫,渲染到Pygame窗口    """    screen.fill(COLORS["bg"])  # 填充背景色for y in range(MAZE_HEIGHT):for x in range(MAZE_WIDTH):# 计算当前格子的像素坐标            rect_x = x * CELL_SIZE            rect_y = y * CELL_SIZE            cell_rect = pygame.Rect(rect_x, rect_y, CELL_SIZE, CELL_SIZE)# 根据迷宫格子类型绘制对应颜色if maze[y][x] == 1:# 墙壁:基础灰色,增加轻微随机亮度提升多彩感                wall_color = (                    min(COLORS["wall"][0] + random.randint(0, 30), 255),                    min(COLORS["wall"][1] + random.randint(0, 30), 255),                    min(COLORS["wall"][2] + random.randint(0, 30), 255)                )                pygame.draw.rect(screen, wall_color, cell_rect)elif maze[y][x] == 0:# 通路:白色,随机选用高亮色列表增加多彩效果                path_color = random.choice([COLORS["path"]] + COLORS["highlight"][:3])                pygame.draw.rect(screen, path_color, cell_rect)elif maze[y][x] == 2:# 起点:绿色,增加渐变高光                start_color = (                    min(COLORS["start"][0] + 20, 255),                    min(COLORS["start"][1] + 20, 255),                    min(COLORS["start"][2] + 20, 255)                )                pygame.draw.rect(screen, start_color, cell_rect)elif maze[y][x] == 3:# 终点:红色,增加渐变高光                end_color = (                    min(COLORS["end"][0] + 20, 255),                    min(COLORS["end"][1] + 20, 255),                    min(COLORS["end"][2] + 20, 255)                )                pygame.draw.rect(screen, end_color, cell_rect)# 更新窗口显示    pygame.display.flip()defmain():"""    主函数:生成迷宫并维持窗口运行    """# 生成迷宫    maze = create_maze(MAZE_WIDTH, MAZE_HEIGHT)# 主循环    running = Truewhile running:# 控制帧率(60帧/秒)        clock.tick(60)# 事件处理(关闭窗口、重新生成迷宫)for event in pygame.event.get():if event.type == pygame.QUIT:                running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_r:# 按下R键重新生成新的多彩迷宫                    maze = create_maze(MAZE_WIDTH, MAZE_HEIGHT)# 绘制迷宫        draw_maze(maze)# 退出Pygame    pygame.quit()    sys.exit()if __name__ == "__main__":    main()

二、实现原理详解

1. 核心依赖与环境准备

  • 依赖库:pygame(图形绘制)、random(随机方向选择、多彩颜色随机)、sys(程序退出处理)
  • 安装命令:pip install pygame

2. 迷宫生成算法:深度优先搜索(DFS)

这是生成迷宫的核心算法,核心思路是「探索-回溯」,步骤如下:

  1. 初始化迷宫为全墙壁(二维列表值为1),确保所有格子都是不可通行的。
  2. 选择起点(奇数坐标,避免越界),标记为通路(值为0),并压入DFS栈中。
  3. 循环处理栈内坐标:
    • 检查当前坐标的上下左右四个方向(每次移动2格),筛选出未访问(仍为墙壁)且在边界内的格子。
    • 若有未访问格子,随机选择一个方向,挖通当前格子与新格子之间的中间墙壁(关键步骤,形成连续通路),将新格子标记为通路并压入栈。
    • 若无未访问格子,弹出栈顶坐标(回溯),继续探索其他分支。
  4. 标记起点(值为2)和终点(值为3),完成迷宫生成。

3. 多彩效果实现

  1. 预设丰富的RGB颜色表,包括背景、墙壁、通路、起点、终点,以及一组高亮渐变色。
  2. 墙壁颜色:在基础灰色上增加随机亮度偏移,避免墙壁单调,形成深浅不一的视觉效果。
  3. 通路颜色:随机从白色和高亮色列表中选取,让通路呈现多彩斑驳的效果。
  4. 起点和终点:增加高光渐变,提升辨识度的同时增强视觉层次感。

4. 交互功能

  • 窗口关闭:响应Pygame的QUIT事件,正常退出程序。
  • 重新生成:按下键盘「R」键,重新调用迷宫生成函数,生成新的随机多彩迷宫。

三、运行效果与使用说明

  1. 运行代码后,会弹出一个标题为「多彩迷宫(深度优先搜索生成)」的窗口,显示随机生成的多彩迷宫。
  2. 迷宫左上角为绿色起点,右下角为红色终点,白色+多彩高亮色为通路,深浅灰色为墙壁。
  3. 按下「R」键可以重新生成新的迷宫,每次生成的迷宫布局都不相同。
  4. 点击窗口右上角的关闭按钮,可退出程序。

四、扩展优化建议

  1. 调整MAZE_WIDTH、MAZE_HEIGHT、CELL_SIZE参数,可以改变迷宫的大小和格子精细度(建议宽度和高度保持奇数)。
  2. 扩充COLORS["highlight"]列表中的颜色,可增加更多样的多彩效果。
  3. 增加迷宫路径查找功能(如A*算法),并将查找路径用特殊颜色标记,增强交互性。
  4. 添加动画效果,在迷宫生成过程中逐步绘制,展示DFS算法的探索过程。

总结

  1. 本项目使用Pygame实现图形绘制,深度优先搜索(DFS)实现迷宫生成,是可视化项目的经典组合。
  2. 多彩效果通过RGB颜色随机偏移和预设高亮色列表随机选取实现,兼顾美观性和可读性。
  3. 代码具备完整的交互功能和良好的扩展性,可直接运行并根据需求调整优化。

要在已有的多彩迷宫中添加可操控的玩家角色,实现玩家在迷宫通路中移动的功能,我会基于之前的Pygame迷宫代码进行扩展,详细讲解添加玩家角色的完整实现方案。

一、扩展后完整代码(含玩家角色)

import pygameimport randomimport sys# 1. 初始化配置MAZE_WIDTH = 51# 迷宫横向格子数(奇数)MAZE_HEIGHT = 31# 迷宫纵向格子数(奇数)CELL_SIZE = 20# 每个格子的像素大小WINDOW_WIDTH = MAZE_WIDTH * CELL_SIZEWINDOW_HEIGHT = MAZE_HEIGHT * CELL_SIZE# 颜色配置(RGB格式)COLORS = {"bg": (24, 24, 24),                # 窗口背景色(深灰)"wall": (50, 50, 50),              # 迷宫墙壁色(中灰)"path": (255, 255, 255),           # 迷宫通路色(白色)"start": (0, 255, 0),              # 起点色(绿色)"end": (255, 0, 0),                # 终点色(红色)"player": (0, 0, 255),             # 玩家角色色(蓝色)"highlight": [(255, 105, 180),     # 多彩高亮色列表                  (135, 206, 235),                  (152, 251, 152),                  (255, 215, 0),                  (238, 130, 238),                  (255, 165, 0)]}# 2. 初始化Pygamepygame.init()screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))pygame.display.set_caption("多彩迷宫(含可操控玩家)")clock = pygame.time.Clock()defcreate_maze(width, height):"""    用深度优先搜索(DFS)算法生成迷宫    :param width: 迷宫横向格子数    :param height: 迷宫纵向格子数    :return: 二维列表表示的迷宫(1=墙壁,0=通路,2=起点,3=终点)    """    maze = [[1for _ in range(width)] for _ in range(height)]    stack = []    start_x, start_y = 1, 1    maze[start_y][start_x] = 0    stack.append((start_x, start_y))    directions = [(0, -2), (0, 2), (-2, 0), (2, 0)]while stack:        current_x, current_y = stack[-1]        unvisited = []for dx, dy in directions:            new_x = current_x + dx            new_y = current_y + dyif1 <= new_x < width - 1and1 <= new_y < height - 1and maze[new_y][new_x] == 1:                unvisited.append((dx, dy))if unvisited:            dx, dy = random.choice(unvisited)            new_x = current_x + dx            new_y = current_y + dy            maze[current_y + dy//2][current_x + dx//2] = 0            maze[new_y][new_x] = 0            stack.append((new_x, new_y))else:            stack.pop()# 标记起点和终点(固定在左上角和右下角)    maze[1][1] = 2# 2=起点    maze[height-2][width-2] = 3# 3=终点return mazedefdraw_maze(maze, player_pos):"""    绘制多彩迷宫和玩家角色    :param maze: 二维列表迷宫数据    :param player_pos: 玩家当前坐标(x, y)    """    screen.fill(COLORS["bg"])  # 填充背景色for y in range(MAZE_HEIGHT):for x in range(MAZE_WIDTH):            rect_x = x * CELL_SIZE            rect_y = y * CELL_SIZE            cell_rect = pygame.Rect(rect_x, rect_y, CELL_SIZE, CELL_SIZE)if maze[y][x] == 1:# 墙壁:随机亮度提升多彩感                wall_color = (                    min(COLORS["wall"][0] + random.randint(0, 30), 255),                    min(COLORS["wall"][1] + random.randint(0, 30), 255),                    min(COLORS["wall"][2] + random.randint(0, 30), 255)                )                pygame.draw.rect(screen, wall_color, cell_rect)elif maze[y][x] == 0:# 通路:随机选用高亮色增加多彩效果                path_color = random.choice([COLORS["path"]] + COLORS["highlight"][:3])                pygame.draw.rect(screen, path_color, cell_rect)elif maze[y][x] == 2:# 起点:绿色高光                start_color = (                    min(COLORS["start"][0] + 20, 255),                    min(COLORS["start"][1] + 20, 255),                    min(COLORS["start"][2] + 20, 255)                )                pygame.draw.rect(screen, start_color, cell_rect)elif maze[y][x] == 3:# 终点:红色高光                end_color = (                    min(COLORS["end"][0] + 20, 255),                    min(COLORS["end"][1] + 20, 255),                    min(COLORS["end"][2] + 20, 255)                )                pygame.draw.rect(screen, end_color, cell_rect)# 绘制玩家角色(核心:在迷宫绘制完成后叠加绘制,保证玩家在顶层)    player_x, player_y = player_pos# 计算玩家像素坐标(与迷宫格子对齐)    player_rect_x = player_x * CELL_SIZE    player_rect_y = player_y * CELL_SIZE    player_rect = pygame.Rect(player_rect_x, player_rect_y, CELL_SIZE, CELL_SIZE)# 绘制蓝色玩家方块(可改为圆形增强辨识度:pygame.draw.circle)    pygame.draw.rect(screen, COLORS["player"], player_rect)# 额外绘制玩家边框,增强视觉效果    pygame.draw.rect(screen, (0, 0, 0), player_rect, 2)# 更新窗口显示    pygame.display.flip()defis_valid_move(maze, x, y):"""    验证玩家移动是否合法(核心:判断目标位置是否为可通行区域)    :param maze: 二维列表迷宫数据    :param x: 目标位置横向坐标    :param y: 目标位置纵向坐标    :return: True=合法可移动,False=非法不可移动    """# 1. 边界校验:确保坐标在迷宫范围内,不越界if x < 0or x >= MAZE_WIDTH or y < 0or y >= MAZE_HEIGHT:returnFalse# 2. 可通行校验:目标位置是通路(0)、起点(2)或终点(3),不是墙壁(1)    cell_value = maze[y][x]return cell_value in [0, 2, 3]defmain():"""    主函数:生成迷宫、初始化玩家、处理移动交互    """# 生成迷宫    maze = create_maze(MAZE_WIDTH, MAZE_HEIGHT)# 初始化玩家位置(核心:固定在迷宫起点(1,1),与迷宫起点标记对应)    player_pos = (1, 1)  # (x, y) 对应迷宫坐标# 主循环    running = Truewhile running:        clock.tick(60)  # 控制帧率(60帧/秒)# 事件处理for event in pygame.event.get():if event.type == pygame.QUIT:                running = Falseelif event.type == pygame.KEYDOWN:# 分解玩家当前坐标                current_x, current_y = player_pos                new_x, new_y = current_x, current_y# 方向键控制玩家移动(上下左右)if event.key == pygame.K_UP:                    new_y -= 1# 向上移动:y坐标减1elif event.key == pygame.K_DOWN:                    new_y += 1# 向下移动:y坐标加1elif event.key == pygame.K_LEFT:                    new_x -= 1# 向左移动:x坐标减1elif event.key == pygame.K_RIGHT:                    new_x += 1# 向右移动:x坐标加1elif event.key == pygame.K_r:# 按下R键重新生成迷宫,并重置玩家到起点                    maze = create_maze(MAZE_WIDTH, MAZE_HEIGHT)                    player_pos = (1, 1)continue# 跳过后续移动判断,直接重新绘制# 验证新位置是否合法,合法则更新玩家位置if is_valid_move(maze, new_x, new_y):                    player_pos = (new_x, new_y)# 额外:判断玩家是否到达终点if maze[new_y][new_x] == 3:                        print("恭喜!你成功到达终点!")# 可选:重置玩家到起点,继续挑战# player_pos = (1, 1)# 绘制迷宫和玩家        draw_maze(maze, player_pos)# 退出Pygame    pygame.quit()    sys.exit()if __name__ == "__main__":    main()

二、核心扩展点详解(玩家角色实现关键)

1. 新增配置与玩家初始化

  • 新增玩家颜色:在COLORS字典中添加"player": (0, 0, 255)(蓝色),方便后续绘制和修改。
  • 玩家初始位置:将player_pos初始化为(1, 1),与迷宫起点(左上角)对齐,保证玩家从合法区域开始,格式为(x, y)(对应迷宫格子坐标)。

2. 玩家绘制:叠加绘制保证顶层显示

  • 核心原则:先绘制迷宫,再绘制玩家角色,这样玩家会叠加在迷宫之上,不会被墙壁、通路遮挡,保证视觉辨识度。
  • 绘制步骤:
  1. 从player_pos中提取玩家迷宫坐标,转换为像素坐标(player_x * CELL_SIZE),与迷宫格子对齐。
  2. 使用pygame.draw.rect()绘制蓝色玩家方块(也可使用pygame.draw.circle()绘制圆形,只需修改绘制函数)。
  3. 额外绘制黑色边框,增强玩家与迷宫的视觉区分度。
  • 绘制函数改造:draw_maze()新增player_pos参数,接收玩家当前位置,实现迷宫与玩家的联动绘制。

3. 合法移动校验:is_valid_move() 函数(关键)

这是防止玩家穿墙、越界的核心函数,实现两层校验:

  1. 边界校验:判断目标坐标(x, y)是否在迷宫范围内(不小于0,不大于MAZE_WIDTH/HEIGHT),防止玩家移出窗口。
  2. 可通行区域校验:判断目标位置的迷宫格子值是否在[0, 2, 3](通路、起点、终点),排除墙壁(值为1),确保玩家只能在可通行区域移动。
  3. 返回值:合法返回True,非法返回False,只有返回True时才更新玩家位置。

4. 键盘交互:方向键控制玩家移动

  • 监听pygame.KEYDOWN事件(键盘按下事件),分别对应上下左右四个方向键(K_UP、K_DOWN、K_LEFT、K_RIGHT)。
  • 移动逻辑:
  1. 先提取玩家当前坐标current_x, current_y,初始化新坐标new_x, new_y与当前坐标一致。
  2. 根据按下的方向键,修改new_x或new_y(向上/向下修改y坐标,向左/向右修改x坐标)。
  3. 调用is_valid_move()校验新坐标,合法则更新player_pos为新坐标,非法则不做任何修改(玩家原地不动)。
  • 联动重置:按下R键重新生成迷宫时,同时将玩家位置重置为(1, 1),保证新迷宫中玩家仍从起点开始。

5. 额外优化:终点判断

当玩家移动到终点(迷宫格子值为3)时,在控制台打印「恭喜!你成功到达终点!」,可扩展为弹窗提示、自动重置游戏等功能。

三、运行与使用说明

  1. 运行代码后,迷宫中会出现一个蓝色带黑框的玩家方块,位于左上角起点。
  2. 使用方向键(上下左右)控制玩家移动,玩家只能在通路中行走,无法穿墙、无法移出窗口。
  3. 控制玩家移动到右下角红色终点,控制台会输出通关提示。
  4. 按下「R」键可重新生成迷宫,玩家自动回到起点,可重复挑战。
  5. 点击窗口右上角关闭按钮,退出程序。

四、扩展优化建议

  1. 优化玩家外观:将玩家从方块改为圆形(pygame.draw.circle(screen, COLORS["player"], (player_rect_x+CELL_SIZE//2, player_rect_y+CELL_SIZE//2), CELL_SIZE//2)),或加载玩家图片(pygame.image.load())。
  2. 增加移动平滑度:添加玩家移动动画,或限制移动间隔,避免快速连按导致玩家「瞬移」。
  3. 通关增强:弹出通关窗口(Pygame文字绘制),添加重新开始按钮,而非仅控制台提示。
  4. 增加玩家状态:如显示剩余步数、绘制玩家移动轨迹等。
  5. 调整玩家颜色:可根据需求修改COLORS["player"]的RGB值,更换玩家外观颜色。

总结

  1. 玩家角色实现的核心是「坐标管理+合法校验+叠加绘制+键盘交互」四大步骤,缺一不可。
  2. is_valid_move()函数是防止玩家穿墙的关键,通过两层校验保证移动合法性。
  3. 先绘迷宫、后绘玩家的叠加绘制逻辑,保证玩家在视觉顶层,不被迷宫元素遮挡。
  4. 扩展后的代码完全兼容原有迷宫功能,同时实现了玩家的完整操控,可直接运行并进一步优化。

你去除多彩效果、并在窗口里绘制上下左右按钮的完整可运行版本。按钮是用 Pygame 直接绘制的,不需要额外图片,简单清晰、可点击、可移动玩家。

下面就是完整代码,你复制即可运行:


完整代码(无多彩 + 有上下左右按钮)

import pygameimport randomimport sys# 1. 配置MAZE_WIDTH = 21MAZE_HEIGHT = 15CELL_SIZE = 30WINDOW_WIDTH = MAZE_WIDTH * CELL_SIZEWINDOW_HEIGHT = MAZE_HEIGHT * CELL_SIZE + 100# 底部留空间放按钮# 颜色(无多彩,简洁风格)COLORS = {"bg": (24, 24, 24),"wall": (50, 50, 50),"path": (255, 255, 255),"start": (0, 255, 0),"end": (255, 0, 0),"player": (0, 0, 255),"button": (100, 100, 100),"button_hover": (150, 150, 150),"button_text": (255, 255, 255)}# 初始化pygame.init()screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))pygame.display.set_caption("迷宫(无多彩 + 按钮控制)")clock = pygame.time.Clock()font = pygame.font.Font(None, 36)# 2. 生成迷宫(DFS)defcreate_maze(width, height):    maze = [[1for _ in range(width)] for _ in range(height)]    stack = []    start_x, start_y = 1, 1    maze[start_y][start_x] = 0    stack.append((start_x, start_y))    directions = [(0, -2), (0, 2), (-2, 0), (2, 0)]while stack:        x, y = stack[-1]        unvisited = []for dx, dy in directions:            nx, ny = x + dx, y + dyif1 <= nx < width - 1and1 <= ny < height - 1and maze[ny][nx] == 1:                unvisited.append((dx, dy))if unvisited:            dx, dy = random.choice(unvisited)            nx, ny = x + dx, y + dy            maze[y + dy//2][x + dx//2] = 0            maze[ny][nx] = 0            stack.append((nx, ny))else:            stack.pop()    maze[1][1] = 2    maze[height-2][width-2] = 3return maze# 3. 绘制迷宫defdraw_maze(maze, player_pos):    screen.fill(COLORS["bg"])for y in range(MAZE_HEIGHT):for x in range(MAZE_WIDTH):            rect = pygame.Rect(x*CELL_SIZE, y*CELL_SIZE, CELL_SIZE, CELL_SIZE)if maze[y][x] == 1:                pygame.draw.rect(screen, COLORS["wall"], rect)elif maze[y][x] == 0:                pygame.draw.rect(screen, COLORS["path"], rect)elif maze[y][x] == 2:                pygame.draw.rect(screen, COLORS["start"], rect)elif maze[y][x] == 3:                pygame.draw.rect(screen, COLORS["end"], rect)# 绘制玩家    px, py = player_pos    player_rect = pygame.Rect(px*CELL_SIZE, py*CELL_SIZE, CELL_SIZE, CELL_SIZE)    pygame.draw.rect(screen, COLORS["player"], player_rect)    pygame.draw.rect(screen, (0,0,0), player_rect, 2)# 4. 按钮类classButton:def__init__(self, x, y, w, h, text):        self.rect = pygame.Rect(x, y, w, h)        self.text = textdefdraw(self):        color = COLORS["button_hover"] if self.rect.collidepoint(pygame.mouse.get_pos()) else COLORS["button"]        pygame.draw.rect(screen, color, self.rect)        pygame.draw.rect(screen, (0,0,0), self.rect, 2)        text_surf = font.render(self.text, True, COLORS["button_text"])        text_rect = text_surf.get_rect(center=self.rect.center)        screen.blit(text_surf, text_rect)defis_clicked(self, event):if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:return self.rect.collidepoint(event.pos)returnFalse# 5. 移动校验defis_valid(maze, x, y):return0 <= x < MAZE_WIDTH and0 <= y < MAZE_HEIGHT and maze[y][x] != 1# 6. 主函数defmain():    maze = create_maze(MAZE_WIDTH, MAZE_HEIGHT)    player_pos = (1, 1)# 创建按钮    btn_w, btn_h = 80, 50    btn_y = MAZE_HEIGHT * CELL_SIZE + 20    btn_up = Button(WINDOW_WIDTH//2 - btn_w//2, btn_y, btn_w, btn_h, "上")    btn_down = Button(WINDOW_WIDTH//2 - btn_w//2, btn_y + 60, btn_w, btn_h, "下")    btn_left = Button(WINDOW_WIDTH//2 - btn_w - 20, btn_y + 60, btn_w, btn_h, "左")    btn_right = Button(WINDOW_WIDTH//2 + 20, btn_y + 60, btn_w, btn_h, "右")    buttons = [btn_up, btn_down, btn_left, btn_right]    running = Truewhile running:        clock.tick(60)for event in pygame.event.get():if event.type == pygame.QUIT:                running = False# 按钮点击if btn_up.is_clicked(event):                x, y = player_posif is_valid(maze, x, y-1):                    player_pos = (x, y-1)if btn_down.is_clicked(event):                x, y = player_posif is_valid(maze, x, y+1):                    player_pos = (x, y+1)if btn_left.is_clicked(event):                x, y = player_posif is_valid(maze, x-1, y):                    player_pos = (x-1, y)if btn_right.is_clicked(event):                x, y = player_posif is_valid(maze, x+1, y):                    player_pos = (x+1, y)# 键盘控制(保留)if event.type == pygame.KEYDOWN:                x, y = player_posif event.key == pygame.K_UP and is_valid(maze, x, y-1):                    player_pos = (x, y-1)if event.key == pygame.K_DOWN and is_valid(maze, x, y+1):                    player_pos = (x, y+1)if event.key == pygame.K_LEFT and is_valid(maze, x-1, y):                    player_pos = (x-1, y)if event.key == pygame.K_RIGHT and is_valid(maze, x+1, y):                    player_pos = (x+1, y)# 绘制        draw_maze(maze, player_pos)for btn in buttons:            btn.draw()        pygame.display.flip()    pygame.quit()    sys.exit()if __name__ == "__main__":    main()

功能说明

  1. 去除了所有多彩效果迷宫现在是简洁的黑白灰风格。

  2. 底部添加了四个按钮

    • 上
    • 下
    • 左
    • 右按钮可点击,鼠标移上去会变色。
  3. 玩家仍可使用方向键控制保留键盘控制,也可以用鼠标点按钮。

  4. 玩家碰到终点会停在终点(可自行加通关提示)


最新文章

随机文章