实验三 迷宫游戏

目录

一.预习内容:

项目分析

实验目标

二.算法设计

算法一:深度遍历算法生成迷宫路径

1、整体思路

2、设计过程

算法二:A*算法进行迷宫自动寻路

1、算法概述

2、算法流程

3、算法原理

三.游戏界面设计

1.界面组成

2.界面功能:

3.注意事项:

四.成品展示

五.改进措施


一.预习内容:

项目分析

       一个完整的迷宫,需要能够实现产生不同路径供玩家游戏,同时需要能够记录玩家所走过的路,避免由于迷宫的范围太大而导致无法走到最后的结尾。迷宫本身也应该自带友好的交互功能,可以让玩家可以根据提示获得愉快的游戏体验。

实验目标

1.随机生成一个迷宫,并且求解迷宫。
2.要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘方向键控制,并在行走路径上留下痕迹;系统走迷宫路径要求基于A*算法实现,输出走迷宫的最优路径并显示。
3.设计交互友好的游戏图形界面。

二.算法设计

算法一:深度遍历算法生成迷宫路径

1、整体思路

     1)利用深度遍历的思想。访问到一个节点时,搜索这个节点没有被访问过的相邻节点,选择一个继续做同样的操作,直到没有邻节点为止再回溯到上一个访问的节点,并选择另外的邻节点。
     2)这种方案生成的迷宫会有一条明显的主路,这条主路特别长,贯穿大部分区域的路线,同时,迷宫的路线一般比较扭曲。这种采用深度优先算法(递归回溯算法)生成的迷宫称之为“主路扭曲型”迷宫

2、设计过程

(1)把数组地图初始化为如下结构。选择一个靠近边缘的1作为起点,在它的周围随机找另一个黄色的1(这里的“周围”指的是上下左右4个方向)。找到就把他们联通,并且把两个1之间的0(灰色墙)也变成通路,这里用红色来表示。


(2)选择一个靠近边缘的1作为起点,在它的周围随机找另一个黄色的1(这里的“周围”指的是上下左右4个方向)。找到就把他们联通,并且把两个1之间的0(灰色墙)也变成通路,这里用红色来表示。

 

 (3)把上一步”终点”的格子作为新的一个“起点”格子,不断循环第2步的过程……
直到,找不到周围有黄色的1,就回溯,回到之前的位置,看看周围是否有黄色的1,如果有,就按照2步骤,不断将黄色1变联通,接下来就是不停地重复上面的步骤,找到就联通,找不到就往回走。


(4)遍历完所有的点即可生成一个迷宫,然后再选择出口与入口,一个完整的迷宫就形成了。

算法二:A*算法进行迷宫自动寻路

参考资料:(2条消息) A*算法详解(讲的一级棒 )_NL的博客-CSDN博客_a*算法

1、算法概述

在计算机科学中,A*算法作为Dijkstra(迪杰斯特拉)算法的扩展,是一种静态路网中求解最短路径有效的直接搜索方法,因其高效性被广泛应用于寻路及图的遍历中。

搜索区域(The Search Area):搜索区域被划分为简单的二维数组,数组每个元素对应一个结点。

开放列表(Open List):将寻路过程中待检测的结点存放于Open List中,而已检测过的结点则存放于Close List中。

路径排序(Path Sorting):下一步怎么移动由以下公式确定;F(n)=G+H。F(n)为估价函数,G代表的是从初始位置Start沿着已生成的路径到指定待检测结点移动开销。H表示待检测结点到目标节点B的估计移动开销。

启发函数(Heuristics Function): H为启发函数,可以看作是一种试探,由于在找到唯一路径前,不确定在前面会出现什么障碍物,因此用了一种计算H的算法,具体可以根据实际情况决定。为了简化问题,H采用的是传统的曼哈顿距离,也就是横纵向走的距离之和。

2、算法流程

重复以下步骤,直到遍历到终点 End:
1)选取当前 open 列表中评价值 F 最小的节点,将这个节点称为 S;
2)将 S 从 open列表移除,然后添加 S 到 closed 列表中; 3)对于与 S 相邻的每一块可移动的相邻节点 T:

如果 T 在 closed列表中,忽略;
如果 T 不在 open 列表中,添加它然后计算它的 F值;
如果 T 已经在 open 列表中,当我们从 S 到达 T时:检查是否能得到更小的 F 值,
如果是,更新它的 F 值和它的前继(parent = S)。

3、算法原理

(1)两个列表:

open: 一个记录下所有被考虑来寻找最短路径的方块
closed: 一个记录下不会再被考虑的方块

(2) 路径增量 : F(n)=G+H

G:是从开始点A到当前方块的移动量。所以从开始点A到相邻小方块的移动量为1,该 值会随着离开始点越来越远而增大。

H:是从当前方块到目标点(我们把它称为点B,代表小花! )的移动量估算值。这个 常被称为探视,因为我们不确定移动量是多少,只是一-个估算值。
为了让它更简单,我们将使用“曼哈顿距离方法”(也叫“曼哈顿长”或者“城市街区距离”),它只是计算出距离点B,剩下的水平和垂直的方块数量,略去了障碍物或者不同陆地类型的数量。


(3)找到最短路径: 

重复之前的步骤。当目标方块在open列表中,即找到路径,
然后回溯,计算出最终的路径!

三.游戏界面设计

1.界面组成

①按钮设计

②迷宫界面生成

③游戏人物生成

2.界面功能:

基于JTextFiled的GUI图形界面设计,加入鼠标监听器Actionlisten,对鼠标点击按钮进行响应。

当鼠标点击“开始游戏”时,游戏中的人物小人可以被操控进行探路。

当鼠标点击“画出路径”时,游戏根据A*算法算出当前迷宫对应的完整路径并在界面画出。

当鼠标点击“隐藏路径”时,游戏将A*算法得出的路径删除,回到页面最初状态。

当鼠标点击“重置地图”时,游戏根据深度遍历算法产生新的迷宫以及路径。

当鼠标点击“退出游戏”时,游戏将被完全关闭。

3.注意事项:

1.对于自动算出路径后,只有在隐藏路径的情况下,游戏人物才可以被玩家操控,旨在锻炼玩家的独立思考能力。

2.由于对于A*算法的设计是根据矩形来计算游戏正确路径,而当人物走到某一个点,只能计算比它当前位置X、Y值都大的方向的矩形,因此不可以在游戏途中进行剩余部分路径探索。

四.成品展示

 

 

五.改进措施

1.在后期新增游戏人物自动寻路功能,旨在根据A*算法的生成的路径,人物可以自行在画面中移动,从而完成自行完成游戏的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值