一、项目概述与编译环境

本次大作业选题为题目2,即小兔子找胡萝卜的迷宫问题,最终完成开发的游戏名为Caveman and Treasure(穴居人寻宝),游戏整体界面如下:

该项目在windows下编译通过,所需环境为python3,编写GUI所用的库为pygame,在运行作业前,需要配置依赖项,即在main.py的路径下打开cmd,并运行:

pip install–r requirement.txt

配置完依赖项后即可运行游戏:

python main.py

为了方便测试不同搜索算法的效率,编写了脚本test.py进行测试:

python test.py--maze_size10

设置为需要的迷宫大小,建议为5-25,否则可能超过递归上界。

二、问题的数学建模

由于迷宫的实质为一个由0,1构成的矩阵,其中1代表可行走的区域,0代表障碍物。由于穴居人生活区域中存在冰面,因此设置了随机道路中存在冰块,在冰块上穴居人会打滑,导致行走的代价*2。

在本问题中,设置穴居人初始位置处的值为10,宝藏处的值为1,则迷宫求解转化为该矩阵中10处到1处的带权连通路径。

三、算法实现

3.1 迷宫的创建

事实上,本次大作业中的一大难点在于迷宫如何创建,在实现过程中进行了如下尝试:

对每一小格随机添加障碍物

限定障碍物的形状,并在地图中随机放置障碍物,如(L型,H型)

但实际的创建结果均不理想(迷宫的样子不像迷宫:出现大量空白/障碍堆积现象)

最后经过查阅资料,采取递归回溯的算法生成迷宫,算法如下:

每次把新找到的未访问迷宫单元作为优先

寻找其相邻的未访问过的迷宫单元,直到所有的单元都被访问到

通俗的说,就是从起点开始随机走,走不通了就返回上一步,从下一个能走的地方再开始随机走。

在创建完迷宫后,再在迷宫中随机指定人物的初始位置与宝藏,以及随机冰面的位置。该迷宫创建算法可以创建不同长、宽、障碍物、初始\终点位置,具体代码详见:maze.py

3.2 搜索算法描述

本次实验中采取了四种搜索算法进行求解,实现方式均为迭代:

3.2.1 深度优先搜索

利用stack实现,先让起点入栈,之后进行如下迭代:

栈弹出顶点I,并标记I为已访问的

检查I是否为宝藏,若为宝藏,迭代结束

依次检查I的领域,将其中未访问过的顶点入栈

3.2.2 宽度优先搜索

利用queue实现,先让起点入列,之后进行如下迭代:

队列出列顶点I,并标记I为已访问的

检查I是否为宝藏,若为宝藏,迭代结束

依次检查I的领域,将其中未访问过的顶点入队列

3.2.3 一致代价搜索

利用PriorityQueue实现,实现Maze_unit类对顶点进行包装,并重新定义优先级队列的排序方法,在本次实现的一致代价搜索中,h(n)为路径代价之和,g(n)为0。先让起点入列,之后进行如下迭代:

优先级队列出列顶点I,并标记I为已访问的

检查I是否为宝藏,若为宝藏,迭代结束

依次检查I的领域,将其中未访问过的顶点入优先级队列

由于代价为路径长度,因此在本项目中,一致代价搜索的结果与宽度优先搜索基本一致。

3.2.4 A*搜索

利用PriorityQueue实现,实现Maze_unit类对顶点进行包装,并重新定义优先级队列的排序方法,在本次实现的一致代价搜索中,h(n)为路径代价之和,g(n)为顶点距离宝藏的曼哈顿距离乘以相关系数。先让起点入列,之后进行如下迭代:

优先级队列出列顶点I,并标记I为已访问的

检查I是否为宝藏,若为宝藏,迭代结束

依次检查I的领域,将其中未访问过的顶点入优先级队列

搜索算法的代码详见:solution.py。

四、项目架构与GUI设计

4.1 项目架构

本次项目将核心部分与GUI部分分离,各py文件内容如下:

maze:迷宫创建

solution:问题求解

people:GUI中的类:人物

wall:GUI中的类:墙壁

main:主函数,基于pygame的GUI编写

test:测试脚本,直接统计各算法1000次所需的时间与扩展节点数

4.2 GUI设计

为了方便运行与直观观看搜素过程。

在迷宫游戏的右侧有五个按键,利用鼠标点击,可以分别观看不同搜索算法的搜索过程,点击View path可以观看利用A*搜索得到的通向终点的最短路径,此外玩家可以直接使用wsad按键控制上下左右进行游戏。若不想手动控制抵达终点,也可以直接选中skip按钮跳过该关卡。

同时在进行游戏的过程中,该迷宫求解的结果会显示在画面的右侧,包括open表大小,closed表大小与搜索得到的路径的代价之和(正常路为2,冰面为4,终点为1)。

GUI的素材均位于子文件夹images中,其中人物行走过程的上下左右利用数字图像处理的方法进行了不同对待:

同时您也可以在游戏时打开系统的声音,感受bgm带来的不同体验。Bgm:music.ogg。

五、搜索算法效率对比

利用test.py对不同的搜索算法效率进行了对比结果如下:

迷宫大小:7*7

搜索算法

DFS

BFS

UCS

A*

总时间(s)

0.11

0.18

0.21

0.23

平均节点数

10.17

10.39

9.51

6.85

迷宫大小:21*21

搜索算法

DFS

BFS

UCS

A*

总时间(s)

1.24

8.09

5.45

3.14

平均节点数

114.60

118.23

112.92

49.72

迷宫大小:35*35

搜索算法

DFS

BFS

UCS

A*

总时间(s)

5.64

82.20

44.69

9.78

平均节点数

349.26

344.87

335.22

125.99

从时间角度来说,由于python的stack与queue运行效率差距较大,因此实际结果中深度优先搜索的速度高于其余三种。

从扩展节点数的角度来说,对于大型迷宫来说,A*算法扩展节点数相对于其他三种算法来说要小很多,也从某一方面验证了,当代价函数一致时,A*算法是最优的。而对于BFS与DFS,在迷宫大小变大的情况下,节点扩展数较大,并不具有很高的空间效率。

从路径平均代价来看,DFS几乎不能找到路径最优解,而A*搜索与一致代价搜索在合理设置cost的情况下,可以得到最短路径。

六、实验心得与体会

本次大作业工程量较大,不仅复习了不同搜索算法的实现思路,完成了对迷宫问题的建模,还锻炼了代码能力。

由于这是第一次尝试利用pygame库进行游戏的编写,而不是用传统的pyqt,花费的学习时间较长,也感受了真实的游戏制作过程的复杂与艰难,游戏素材图片(字体,音乐)寻找的困难。

此外,在自己观看不同算法的搜索过程中,也对之前略有混淆的概念进行了理解,例如,在第一次小作业中回答错误的下列命题,如:宽度优先搜索是一种特殊的一致代价搜索。从手动实现的角度对概念解进行了复习,收获颇丰。

七、参考文献

python迷宫小游戏代码_课内资源 - 基于python实现的迷宫游戏相关推荐

  1. python+diango写酒店管理系统_课内资源 - 基于Python的Django框架实现的中式快餐厅管理信息系统网站...

    1 初步调研 随着餐饮业的连锁和国外餐饮巨头的进入,餐饮业的竞争将越来越激烈:要想在竞争中处于不败之地,必须在管理.服务等方面提高服务管理意识.面对当前餐饮业普遍的产业化程度低,管理手段.管理技术落后 ...

  2. python编程输出汉字_课内资源 - 基于Python的拼音汉字转换程序

    1.实验内容利用统计语言模型实现拼音汉字转换 输入:拼音串,输出:对应的汉字串 给定10000字的测试语料,测试音字转换的准确率 针对音字转换结果中存在的问题给出具体分析 以图表的形式表示上述结果 2 ...

  3. python电梯题_课内资源 - 基于PyQt5实现的python电梯调度程序

    1. 使用说明 1.1 项目简介 电梯作为人们出行的重要工具之一,在人们日常生活中扮演着重要的角色.而电梯的调度算法是决定电梯运行效率的关键,一个高效的调度算法对电梯能否有效地运行起到重要的作用.因此 ...

  4. java 图形处理_课内资源 - 基于Java实现的几何图形处理系统

    1 综述 针对<计算机图形学>课程开发的几何图形处理系统实现的功能包括:在UI界面中通过鼠标点击拖拽等方式可视化地输入二维图形的功能:编辑最近输入的二维图形的功能:裁剪直线的功能,支持的图 ...

  5. java基本语法借阅_课内资源 - 基于Java和MySql实现的光盘借阅管理系统

    一.需求设计以下几个类:光盘类:用户类:借阅记录类,包括下列模块: 新建.修改.删除光盘信息 新建.修改.删除用户信息 光盘借阅/归还信息记录 查询光盘名称,用户的借阅历史 要求:基于JFrame窗体 ...

  6. jsp mysql问卷调查_课内资源 - 基于JSP的在线调查问卷系统

    一.系统架构图 用户登入功能,由login.jsp页面和LoginServlet.java组成,页面用于填写用户名和密码:Servlet用于验证是否可以登入,如果能够登入,则将用户登入时间记录到数据库 ...

  7. java洗衣店管理课程设计报告_课内资源 - 基于Java的洗衣店管理系统

    摘 要 随着科技的快速发展,人们的需求也是越来越多,为了方便对信息的管理我们小组就设计了一个洗衣店订单的管理系统. 洗衣店管理系统是典型的的信息管理系统,创建了六个类,分别是:Test类:Person ...

  8. jsp mysql在线考试系统源码_课内资源 - 基于JSP和MYSQL数据库实现的在线考试系统...

    1 系统概述 1.1 功能模块 教学部需要考试系统,该考试系统需要完成如下功能: 考试系统只针对于Java课程,题目全部为单项选择,共10题 学生注册.登录 后台管理员功能:题库管理.录入试卷.修改试 ...

  9. 4维俄罗斯方块 java,课内资源 - 基于Easyx插件的俄罗斯方块游戏的设计与实现

    一 需求分析 1.1 设计内容: 设计一个俄罗斯方块游戏,根据实际游戏的规则完成设计. 游戏设计方案: 在一个图形绘制区域的正上方随机产生四种不同方块中的任意一种的初始位置,并使其向下运动 定义键盘, ...

最新文章

  1. Node.js—简介
  2. 本周ASP.NET英文技术文章推荐[02/25 - 03/03]
  3. geometry-api-java 学习笔记(七)拓扑运算之cut
  4. 腾讯发布 Tencent SCF Toolkit VS Code 插件,轻松开发无服务器云函数
  5. 基于金融知识图谱的会计欺诈风险识别方法
  6. 爆料称华为P50系列即将进入量产 或将于下月发布
  7. 一个简单好用的日志框架NLog
  8. 用ps绘制中国银行的标志
  9. 软考数据库考试有题库吗_软考数据库系统工程师考试心得
  10. 桌面美化 | win10高仿mac桌面
  11. 安全测试工具有哪些?
  12. c语言中char的赋值
  13. php7 yar扩展,php扩展之Yar使用
  14. Adobe Illustrator 学习笔记1 跟随Brain Wood的教程
  15. win7-32位系统SqlServer2014版本下载与安装
  16. ESP32-C3——专为物联网应用场景设计
  17. Go入门系列(十七) go并发之基于共享变量的并发
  18. java getmethod 无参数_Java getMethod类型参数
  19. x3+y3+z3=3
  20. 二叉树的前序中序后序遍历图示

热门文章

  1. 【转】关于Eclipse创建Android项目时,会多出一个appcompat_v7的问题
  2. Codeforces 484E Sign on Fence(是持久的段树+二分法)
  3. [Linux] Linux命令之pstree - 以树状图显示进程间的关系
  4. TCP(传输控制协议)简介
  5. rails3高端observer模式
  6. 【论文写作】试验管理系统如何写可行性报告
  7. docker中linux用户名密码,linuxea:尽可能不在docker镜像中嵌入配置或者密码
  8. 排名怎么查_公布考研成绩排名?怎么查?
  9. 目录代码php_php获取某个目录大小的代码
  10. 测视力距离5米还是3米_装B冷知识 | 小孔镜为什么可以提高视力?