目录
1. 前期准备
2. DFS 算法生成迷宫
3. 键盘操作
4. 判断游戏胜利
5. 游戏截图
6. 完整游戏代码
本文将用pygame实现迷宫的游戏,因为迷宫的地图需要提前生成,这样每次游戏地图都是一样的。而深度优先搜索(DFS)算法可以自动计算迷宫的最优路径,那么根据这个算法就可以自动生成迷宫小游戏,这样每次打开游戏都会是新的游戏!
1. 前期准备
-
迷宫生成算法:使用深度优先搜索(DFS)算法生成迷宫。迷宫初始化为全墙壁(
1
表示墙壁,0
表示通路),从起点(1, 1)
开始递归打通路径,确保生成的迷宫是连通的。 -
迷宫大小:游戏的复杂程度通过迷宫的大小控制,这里通过MAZE_WIDTH和MAZE_HEIGHT参数控制
-
玩家和出口:玩家出生点固定在
(1, 1)
,出口固定在(MAZE_WIDTH - 2, MAZE_HEIGHT - 2)
。
import pygame
import sys
import random# 初始化pygame
pygame.init()# 设置屏幕大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 800
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)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)# 定义迷宫大小
MAZE_WIDTH = 25 # 迷宫的宽度(必须是奇数)
MAZE_HEIGHT = 25 # 迷宫的高度(必须是奇数)# 定义方块大小
BLOCK_SIZE = SCREEN_WIDTH // MAZE_WIDTH# 定义玩家初始位置
player_x, player_y = 1, 1# 定义出口位置
exit_x, exit_y = MAZE_WIDTH - 2, MAZE_HEIGHT - 2
2. DFS 算法生成迷宫
DFS(深度优先搜索,Depth-First Search)是一种用于遍历或搜索树或图的算法。其核心思想是从一个起始节点开始,沿着一条路径尽可能深入地探索,直到无法继续为止,然后回溯并探索其他路径。
DFS的基本步骤
-
选择起始节点:从图或树中选择一个起始节点。
-
标记已访问:访问当前节点,并将其标记为已访问。
-
递归探索邻居:对于当前节点的每一个未访问的邻居节点,递归地调用DFS。
-
回溯:当没有未访问的邻居节点时,回溯到上一个节点,继续探索其他路径。
# 生成迷宫的DFS算法
def generate_maze(width, height):# 初始化迷宫,全部为墙壁maze = [[1 for _ in range(width)] for _ in range(height)]# DFS生成迷宫def dfs(x, y):maze[y][x] = 0 # 打通当前单元格directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]random.shuffle(directions) # 随机打乱方向for dx, dy in directions:nx, ny = x + dx * 2, y + dy * 2 # 下一个单元格if 0 <= nx < width and 0 <= ny < height and maze[ny][nx] == 1:maze[y + dy][x + dx] = 0 # 打通中间的墙dfs(nx, ny)dfs(1, 1) # 从起点开始生成maze[1][1] = 0 # 起点maze[exit_y][exit_x] = 0 # 终点return maze# 生成迷宫
maze = generate_maze(MAZE_WIDTH, MAZE_HEIGHT)
3. 键盘操作
通过pygame获取键盘的操作,这里用上下左右控制
# 获取键盘输入keys = pygame.key.get_pressed()if keys[pygame.K_UP]:if maze[player_y - 1][player_x] == 0:player_y -= 1if keys[pygame.K_DOWN]:if maze[player_y + 1][player_x] == 0:player_y += 1if keys[pygame.K_LEFT]:if maze[player_y][player_x - 1] == 0:player_x -= 1if keys[pygame.K_RIGHT]:if maze[player_y][player_x + 1] == 0:player_x += 1
4. 判断游戏胜利
游戏胜利很简单,当玩家的位置走到出口的位置就行了
# 检查是否到达出口if player_x == exit_x and player_y == exit_y:font = pygame.font.Font(None, 74)text = font.render('You Win!', True, GREEN)screen.blit(text, (SCREEN_WIDTH // 2 - 100, SCREEN_HEIGHT // 2 - 50))pygame.display.flip()pygame.time.wait(3000)running = False
5. 游戏截图
6. 完整游戏代码
游戏代码:
import pygame
import sys
import random# 初始化pygame
pygame.init()# 设置屏幕大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 800
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)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)# 定义迷宫大小
MAZE_WIDTH = 51 # 迷宫的宽度(必须是奇数)
MAZE_HEIGHT = 51 # 迷宫的高度(必须是奇数)# 定义方块大小
BLOCK_SIZE = SCREEN_WIDTH // MAZE_WIDTH# 定义玩家初始位置
player_x, player_y = 1, 1# 定义出口位置
exit_x, exit_y = MAZE_WIDTH - 2, MAZE_HEIGHT - 2# 生成迷宫的DFS算法
def generate_maze(width, height):# 初始化迷宫,全部为墙壁maze = [[1 for _ in range(width)] for _ in range(height)]# DFS生成迷宫def dfs(x, y):maze[y][x] = 0 # 打通当前单元格directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]random.shuffle(directions) # 随机打乱方向for dx, dy in directions:nx, ny = x + dx * 2, y + dy * 2 # 下一个单元格if 0 <= nx < width and 0 <= ny < height and maze[ny][nx] == 1:maze[y + dy][x + dx] = 0 # 打通中间的墙dfs(nx, ny)dfs(1, 1) # 从起点开始生成maze[1][1] = 0 # 起点maze[exit_y][exit_x] = 0 # 终点return maze# 生成迷宫
maze = generate_maze(MAZE_WIDTH, MAZE_HEIGHT)# 游戏主循环
running = True
while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 获取键盘输入keys = pygame.key.get_pressed()if keys[pygame.K_UP]:if maze[player_y - 1][player_x] == 0:player_y -= 1if keys[pygame.K_DOWN]:if maze[player_y + 1][player_x] == 0:player_y += 1if keys[pygame.K_LEFT]:if maze[player_y][player_x - 1] == 0:player_x -= 1if keys[pygame.K_RIGHT]:if maze[player_y][player_x + 1] == 0:player_x += 1# 清屏screen.fill(WHITE)# 绘制迷宫for y in range(MAZE_HEIGHT):for x in range(MAZE_WIDTH):if maze[y][x] == 1:pygame.draw.rect(screen, BLACK, (x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))elif x == exit_x and y == exit_y:pygame.draw.rect(screen, RED, (x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))elif x == 1 and y == 1:pygame.draw.rect(screen, GREEN, (x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))# 绘制玩家pygame.draw.rect(screen, BLUE, (player_x * BLOCK_SIZE, player_y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))# 检查是否到达出口if player_x == exit_x and player_y == exit_y:font = pygame.font.Font(None, 74)text = font.render('You Win!', True, GREEN)screen.blit(text, (SCREEN_WIDTH // 2 - 100, SCREEN_HEIGHT // 2 - 50))pygame.display.flip()pygame.time.wait(3000)running = False# 更新屏幕pygame.display.flip()# 控制帧率pygame.time.Clock().tick(20)# 退出游戏
pygame.quit()
sys.exit()