主要内容

1.迷宫游戏是非常经典的游戏,在该题中要求随机生成一个迷宫,并求解迷宫。

2.要求查找并理解迷宫生成的算法,并尝试用两种不同的算法来生成随机的迷宫。

3.要求迷宫游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘方向键控制,并在行走路径上留下痕迹;系统提示迷宫路径要求基于A*算法实现,输出玩家当前位置到迷宫出口的最优路径。设计交互友好的游戏图形界面。

需解决的问题

迷宫图形界面的显示

随机迷宫生成

“玩家”的移动

迷宫自动寻路

相关知识和方法

1.prime最小生成树算法生成随机型迷宫

1.1  连通图
在图论中,连通图基于连通的概念。在一个无向图 G 中,若从顶点i到顶点j有路径相连(当然从j到i也一定有路径),则称i和j是连通的。如果 G 是有向图,那么连接i和j的路径中所有的边都必须同向。如果图中任意两点都是连通的,那么图被称作连通图。如果此图是有向图,则称为强连通图(注意:需要双向都有路径)。图的连通性是图的基本性质。

1.2 (最小)生成树
基本释义:
首先定义一个无向连同带权图
G=(V,E,W) w(e)∈W是边e的权 (其中V表示顶点集合,E表示边集,W表示权)
G的一颗生成树T是包含G的所有顶点的树,树中各边的权之和W(T)称为树的权,具有最小权的生成树称为G的最小生成树
实例
G=(V,E,W) ,V={1,2,3,4,5,6}
E={{1,2},{1,3},{1,4},{2,3},{2,5},{3,4},{3,5},{3,6},{4,6},{5,6}} 如下图所示

最小生成树(权值最小)下图所示

生成树的性质:
设G是n阶的连通图
T是G的生成树当且仅当T无圈且有n-1条边(无圈:没有回路) 如下图

如果T是G的生成树,e∈T,那么T∪{e}含一个圈c   如下图

去掉c的任意一条边,就得到G的另外一棵树T'   如下图

1.3   prime算法

普里姆算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在树中的(假设为 A 类),剩下的是另一类(假设为 B 类)。
对于给定的连通网,起始状态全部顶点都归为 B 类。在找最小生成树时,选定任意一个顶点作为起始点,并将之从 B 类移至 A 类;然后找出 B 类中到 A 类中的顶点之间权值最小的顶点,将之从 B 类移至 A 类,如此重复,直到 B 类中没有顶点为止。所走过的顶点和边就是该连通图的最小生成树。

例如,通过普里姆算法查找上图的最小生成树的步骤为:
假如从顶点A出发,顶点 B、C、D 到顶点 A 的权值分别为 2、4、2,所以,对于顶点 A 来说,顶点 B 和顶点 D 到 A 的权值最小,假设先找到的顶点 B:

继续分析顶点 C 和 D,顶点 C 到 B 的权值为 3,到 A 的权值为 4;顶点 D 到 A 的权值为 2,到 B 的权值为无穷大(如果之间没有直接通路,设定权值为无穷大)。所以顶点 D 到 A 的权值最小:

最后,只剩下顶点 C,到 A 的权值为 4,到 B 的权值和到 D 的权值一样大,为 3。所以该连通图有两个最小生成树:

2.A*算法

2.1  广度(宽度)优先搜索算法(BFS)

广度(宽度)优先搜索算法(BFS)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

2.2   A*算法

项目的关键是基于A算法生成迷宫路径,所以我们先要搞懂什么是A算法已经怎样来实现A算法。
与广度优先遍历不一样的是,A算法在每一轮循环的时候,不会去探索所有的边界方块,而会去选择当前"代价最小"的方块进行探索,这就具有了方向性。这里的"代价"我们分为:预估代价和当前代价。
当前代价(F-cost)**从起点A移动到终点B的移动代价,沿着到达该方格而生成的路径。
预估代价(G-cost):从起点A移动到终点B的估算成本。这个通常被称为试探法,有点让人混淆。为什么这么叫呢,因为这是个猜测。直到我们找到了路径我们才会知道真正的距离,因为途中有各种各样的东西(比如墙壁,水等)。最常用到的预估代价有欧拉距离跟曼哈顿距离,为了效率,我们通常使用曼哈顿距离。
总代价:总代价=当前代价+预估代价

A*算法流程

1. 把起点加入 open list 。

2.  重复如下过程:

a. 遍历 open list ,查找 F 值最小的节点,把它作为当前要处理的节点。

b. 把这个节点移到 close list 。

c. 对当前方格的 8 个相邻方格的每一个方格:

◆ 如果它是不可抵达的或者它在 close list 中,忽略它。否则,做如下操作。

◆ 如果它不在 open list 中,把它加入 open list ,并且把当前方格设置为它的父亲,记录该方格的 F,G 和 H 值。

◆ 如果它已经在 open list 中,检查这条路径 ( 即经由当前方格到达它那里 ) 是否更好,用 G 值作参考。更小的 G 值表示这是更好的路径。如果是这样,把它的父亲设置为当前方格,并重新计算它的 G 和 F 值。如果你的 open list 是按 F 值排序的话,改变后你可能需要重新排序。

d. 停止,当你:

◆ 把终点加入到了 open list 中,此时路径已经找到了,或者

◆ 查找终点失败,并且 open list 是空的,此时没有路径。

3. 保存路径。从终点开始,每个方格沿着父节点移动直至起点,这就是你的路径。

参考资料

普里姆算法(Prim算法)求最小生成树
http://data.biancheng.net/view/40.html

A星算法详解
https://blog.csdn.net/hitwhylz/article/details/23089415

生成树
https://blog.csdn.net/qq_39248122/article/details/91873840

计算机软件技术实习 迷宫游戏(一)相关推荐

  1. 计算机软件技术实习项目二(一) 贪吃蛇项目准备

    计算机软件技术实习项目二(一) 贪吃蛇项目准备 文章目录 计算机软件技术实习项目二(一) 贪吃蛇项目准备 一.贪吃蛇介绍 二.开发工具 三.实现原理 1.消息与消息队列 2.消息映射 3.设备环境 4 ...

  2. 计算机软件技术实习02

    计算机软件技术实习 第二周学习记录 实验1--支持算术表达式求解的计算器 前言 上周说到,我选择用MFC来完成本次实验.那么,现在我来总结一下本周的学习成果. 退格功能的实现 由于我设置的文本框是通过 ...

  3. 计算机软件技术实习预习日志

    计算机软件技术实习预习日志 目录 计算机软件技术实习预习日志 文章目录 实验项目 一.实验要求 二.开发工具 三.实验原理 1.后缀表达式计算法 前缀表达式 中缀表达式 后缀表达式 中缀表达式转换为后 ...

  4. 计算机软件技术实习 项目一 简单计算器的实现(实验准备)1-(1)

    目录 一.需求分析 二.重难点 三.编程语言 四.开发工具/平台 一.需求分析 1. 能通过设计的按钮控件输入并实现算术表达式,表达式在文本框中显示,运算结果输出显示: 2.保存和浏览历史运算记录: ...

  5. 计算机软件技术实习01

    计算机软件技术实习 第一周学习记录 实验1--支持算术表达式求解的计算器 前言 这是我第一次真正接触到计算机软件技术的实战内容,说实话我觉得这次的实习任务对我来说非常具有挑战性,有很多知识都是我目前还 ...

  6. 22-23学年计算机软件技术实习1——计算器

    目录 学习目标 1.1准备工作 1.1.1搭建QT开发环境 1.2用户界面UI设计 1.2.1显示模块 1.2.2按键模块 1.3功能实现 1.3.1输入输出反馈 1.3.2退格与清除功能 1.3.3 ...

  7. 计算机软件技术实习实验一

    实验内容: (1) 学习图形界面的设计,创建基于对话框的应用程序,添加按钮.编辑框等控件: (2) 能通过设计的按钮控件输入并实现简单算术运算,要求表达式在编辑框中显示, 能将运算结果,输出在编辑框内 ...

  8. 计算机软件技术实习:计算器(1)

    1.1 所用知识点 Java Swing 界面编程 计算器逻辑运算实现 1.2 基本思路 (1)设置计算器显示窗口 (2)数学运算基本法则:先乘除后加减 (a)正确处理输入字符串判断后进行一一计算 ( ...

  9. 计算机软件实习日志(三)基于 A*搜索算法迷宫游戏开发

    文章目录 界面展示 前言 一.实验要求? 二.实验准备 三.设计思路 1.A*算法的理解 算法描述 简化搜索区域 简化地图 概述算法步骤 进一步解释 具体寻路过程 F值计算方式: 2.开发思路 使用Q ...

最新文章

  1. ubuntu lamp配置多域名服务器
  2. 证券一哥炼成记——郭树清
  3. linux fedora kde桌面设置全局显示字体大小
  4. coding pages绑定freenom.com域名
  5. 把经典的ABAP webdynpro应用配置到SAP Fiori Launchpad里
  6. 前端学习(2140):webpack的安装
  7. linux C语言调用Intel处理器CPUID指令的实例
  8. 无法安装操作系统,An unexpected error(0) occurred at line 1768 in f:\nt2\base\boot\setup\arcdisp.c....
  9. 各地的磁倾角_中国各地磁偏角
  10. win10下 你需要来自trustedinstaller的权限 修改权限
  11. Eclipse启动出错误:An error has occurred.See the log file。。。。
  12. 计算机及数码产品营销课后题,职业教育课程改革创新系列教材:计算机及数码产品营销...
  13. Makefile与前缀后缀相关函数suffix、basename、addsuffix、addprefix
  14. 自然语言处理--加载使用facebook的预训练 fastText 模型wiki-news-300d-1M.vec
  15. Html读取本地文件夹下图片并显示的示例代码
  16. 英语语法 定冠词与专有名词
  17. android os 1.5 下载地址,技德Remix OS 1.5发布 适配Android 5.0
  18. 改版后的PMP值得考吗?
  19. RET RETF IRET IRETD 指令的不同
  20. 制造业MES生产管理系统程序代码 MES源码

热门文章

  1. 《移动微技(Mobile Widget)应用开发权威指南》正式出版
  2. JavaScript之类操作:HTML5 canvas多分屏示例
  3. matlab乘号前加点,matlab使用经验小结
  4. java基础-14-连接数据库
  5. 专属IE浏览器的WEB自动化测试工具
  6. 小程序自建平台开发票保存到微信卡包
  7. springboot 处理视频截图
  8. 网桥、交换机和路由器
  9. 电影里感动你我的对白(不断收集更新中)
  10. 系统未正确安装新的设备驱动程序后 开机总是出现“欢迎使用找到新硬件向导”...