基于A*搜索算法迷宫游戏开发

本文详细介绍了基于A*搜索算法开发的迷宫游戏,包括绘制背景、路径、更新迷宫等功能。游戏提供多种地图生成算法(如kruskal、prim等)和难度选择,支持作弊、保存读取地图,还包含迷雾模式。通过tkinter库实现界面,并使用dfs等算法进行寻路。
摘要由CSDN通过智能技术生成

程序设计分析
迷宫难度:
迷宫长宽:尺寸越大,生成的地图越难
迷宫生成算法:地图难度:kruskai算法>随机深度优先算法>prim算法>递归分割算法

功能

增加状态栏显示状态信息

作弊(查看提示)增加惩罚分数(当前作弊一次惩罚20分)

保存读取地图

菜单栏,可用于设置地图生成算法,地图尺寸等

增加迷雾模式

显示等级以及当前移动步数

随机生成游戏地图

按方向键后自动前进倒退(到分岔路停止)

起点到任意位置辅助路径显示(鼠标左键单击空白地方显示路线) 移动次数计数

到达终点后通关,按任意键进入下一关(目前没有难度设置,难度相同)

一、主要函数说明

迷宫类Maze:
rint_matrix
generate_matrix_dfs
generate_matrix_prim
generate_matrix_kruskal
generate_matrix_split
find_path_dfs
find_path_bfs (TODO)

并查集类 UnionSet:
find
union

可视化:
draw_cell
draw_path
draw_maze
check_reach
eventHandler
paint
reset
update_maze

二、Maze类说明

1.利用tkinter库设计界面

Python 的 GUI 库非常多,之所以选择 Tkinter,一是最为简单,二是自带库,不需下载
安装,随时使用,跨平台兼容性非常好,三则是从需求出发的,Python 在实际应用中极
少用于开发复杂的桌面应用。以下列出一些所需Tkinte控件。
在这里插入图片描述#引入所需要的的库
import tkinter as tk
#弹窗
from tkinter.messagebox import showinfo
#选择文件对话框的格式打开图片
from tkinter import filedialog
#生成任意尺寸的迷宫
from mazeGenerator import Maze
import pandas as pd
import numpy as np
#图片处理
from PIL import Image
import time
import copy
import math
import os

绘制背景(灰色)

def draw_cell(canvas, row, col, color="#F2F2F2"):
x0, y0 = col * cell_width, row * cell_width
x1, y1 = x0 + cell_width, y0 + cell_width
canvas.create_rectangle(x0, y0, x1, y1, fill = color, outline =color, width = 0)

绘制路径

def draw_path(canvas, matrix, row, col, color, line_color):
# 列
if row + 1 < rows and matrix[row - 1][col] >= 1 and matrix[row + 1][col] >= 1:
x0, y0 = col * cell_width + 2 * cell_width / 5, row * cell_width
x1, y1 = x0 + cell_width / 5, y0 + cell_width
# 行
elif col + 1 < cols and matrix[row][col - 1] >= 1 and matrix[row][col + 1] >= 1:
x0, y0 = col * cell_width, row * cell_width + 2 * cell_width / 5
x1, y1 = x0 + cell_width, y0 + cell_width / 5
# 左上角
elif col + 1 < cols and row + 1 < rows and matrix[row][col + 1] >= 1 and matrix[row + 1][col] >= 1:
x0, y0 = col * cell_width + 2 * cell_width / 5, row * cell_width + 2 * cell_width / 5
x1, y1 = x0 + 3 * cell_width / 5, y0 + cell_width / 5
canvas.create_rectangle(x0, y0, x1, y1, fill = color, outline = line_color, width = 0)
x0, y0 = col * cell_width + 2 * cell_width / 5, row * cell_width + 2 * cell_width / 5
x1, y1 = x0 + cell_width / 5, y0 + 3 * cell_width / 5
# 右上角
elif row + 1 < rows and matrix[row][col - 1] >= 1 and matrix[row + 1][col] >= 1:
x0, y0 = col * cell_width, row * cell_width + 2 * cell_width / 5
x1, y1 = x0 + 3 * cell_width / 5, y0 + cell_width / 5
canvas.create_rectangle(x0, y0, x1, y1, fill = color, outline = line_color, width = 0)
x0, y0 = col * cell_width + 2 * cell_width / 5, row * cell_width + 2 * cell_width / 5
x1, y1 = x0 + cell_width / 5, y0 + 3 * cell_width / 5
# 左下角
elif col + 1 < cols and matrix[row - 1][col] >= 1 and matrix[row][col + 1] >= 1:
x0, y0 = col * cell_width + 2 * cell_width / 5, row * cell_width
x1, y1 = x0 + cell_width / 5, y0 + 3 * cell_width / 5
canvas.create_rectangle(x0, y0, x1, y1, fill = color, outline = line_color, width = 0)
x0, y0 = col * cell_width + 2 * cell_width / 5, row * cell_width + 2 * cell_width / 5
x1, y1 = x0 + 3 * cell_width / 5, y0 + cell_width / 5
# 右下角
elif matrix[row - 1][col] >= 1 and matrix[row][col - 1] >= 1:
x0, y0 = col * cell_width, row * cell_width + 2 * cell_width / 5
x1, y1 = x0 + 3 * cell_width / 5, y0 + cell_width / 5
canvas.create_rectangle(x0, y0, x1, y1, fill = color, outline = line_color, width = 0)
x0, y0 = col * cell_width + 2 * cell_width / 5, row * cell_width
x1, y1 = x0 + cell_width / 5, y0 + 3 * cell_width / 5
else:
x0, y0 = col * cell_width + 2 * cell_width / 5, row * cell_width + 2 * cell_width / 5
x1, y1 = x0 + cell_width / 5, y0 + cell_width / 5
canvas.create_rectangle(x0, y0, x1, y1, fill = color, outline = line_color, width = 0)
2.绘制迷宫
def draw_maze(canvas, matrix, path, moves):
“”"
根据matrix中每个位置的值绘图:
-1: 墙壁
0: 空白
1: 参考路径
2: 移动过的位置
“”"
canvas.delete(“all”)
matrix = copy.copy(matrix)
# 参考路径
for p in path:
matrix[p[0]][p[1]] = 1
# 移动过的路径
for move in moves:
matrix[move[0]][move[1]] = 2
# 通过地图大小判断空白和墙壁
for r in range(rows):
for c in range(cols):
if matrix[r][c] == 0:
draw_cell(canvas, r, c)
elif matrix[r][c] == -1:
# 将墙壁设置为蓝色
draw_cell(canvas, r, c, ‘#525288’)
elif matrix[r][c] == 1:
draw_cell(canvas, r, c)
# 将参考路径设置为紫色
draw_path(canvas, matrix, r, c, ‘#bc84a8’, ‘#bc84a8’)
elif matrix[r][c] == 2:
draw_cell(canvas, r, c)
# 将移动过的位置设置为红色
draw_path(canvas, matrix, r, c, ‘#ee3f4d’, ‘#ee3f4d’)
# 窗口标题
windows.title(“Maze Level-{} Steps-{}”.format(level, click_counter))
set_label_text()

更新迷宫

def update_maze(canvas, matrix, path, moves):
windows.title(“Maze Level-{} Steps-{}”.format(level, click_counter))
canvas.delete(“all”)
matrix = copy.copy(matrix)
# 重置参考
for p in path:
matrix[p[0]][p[1]] = 1
# 重置移动路径
for move in moves:
matrix[move[0]][move[1]] = 2
# 初始化颜色
row, col = movement_list[-1]
colors = [’#525288’, ‘#F2F2F2’, ‘#525288’, ‘#F2F2F2’, ‘#5252

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值