实验日志三.预习过程+实验方案+源码

程序功能:

1,随机生成迷宫地图:游戏中需要随机生成迷宫地图,地图大小更改可操作,地图路径的求解,引入java.util.Random类,利用Random类提供的生成随机数方法,随机生成障碍物、通路等状态。迷宫地图采用二维数组进行表示与存储。

2,判断玩家闯关是否成功:根据玩家的当前位置是否位于地图的出口点来判断玩家闯关是否成功。如果成功则根据游戏步数修改本次游戏积分。

3,游戏主控模块:游戏的主控模块是一个基于用户输入的键位控制模块。输入“←↑↓→”则根据是否能进行移动来更新游戏界面和当前位置,前提条件是游戏未结束。输入W/S则相应增加/减小迷宫的大小;输入"Y"则显示迷宫路径,输入“X”则刷新迷宫;若游戏结束,则退出游戏主控模块,输出玩家的输赢状态;否则,主控模块根据用户输入的方向键,不断修改地图状态及更新玩家积分。

程序设计思路:

1,prim算法生成随机迷宫

2,A*算法求解迷宫

3,迷宫游戏窗口与面板初始化和设计

其中:0表示障碍物,1表示通路,2表示当前位置。

游戏默认迷宫四周由障碍物围绕,入口点位于地图的左上角点,出口点位于地图右下角点。

用户在控制台输入方向键“←↑↓→”控制移动;输入“x”字符,表示提前退出游戏。

1,Maze类(随机Prim方法)

具体步骤

1.让迷宫全是墙.

2.选一个单元格作为迷宫的通路,然后把它的邻墙放入列表

3.当列表里还有墙时

1.从列表里随机选一个墙,如果这面墙分隔的两个单元格只有一个单元格被访问过

1.那就从列表里移除这面墙,即把墙打通,让未访问的单元格成为迷宫的通路

2.把这个格子的墙加入列表

2.如果墙两面的单元格都已经被访问过,那就从列表里移除这面墙

2,AStar类(A*算法)

A*算法是人工智能中的一种搜索算法,是一种启发式搜索算法,它不需遍历所有节点,只是利用包含问题启发式信息的评价函数对节点进行排序,使搜索方向朝着最有可能找到目标并产生最优解的方向。它的独特之处是检查最短路径中每个可能的节点时引入了全局信息,对当前节点距终点的距离做出估计,并作为评价节点处于最短路线上的可能性的度量。

A*算法中引入了评估函数,评估函数为:f(n)=g(n)+h(n) 其中:n是搜索中遇到的任意状态。g(n)是从起始状态到n的代价。

h(n)是对n到目标状态代价的启发式估计。即评估函数f ( n) 是从初始节点到达节点n 处已经付出的代价与节点n 到达目标节点的接近程度估价值的总和。

这里我们定义n点到目标点的最小实际距离为h(n)*,A*算法要满足的条件为:h(n)<=h(n)*

迷宫走的时候只能往上下左右走,每走一步,代价为1,这里我们采用的估价函数为当前节点到目标节点的曼哈顿距离,即:h(n)=|end.x – n.x|+ |end.y – n.y|。这里end表示迷宫的目标点,n表示当前点,很明显这里h(n)<=h(n)*。g(n)容易表示,即每走一步的代价是1,所以利用f(n)=g(n)+h(n)这种策略,我们可以不断地逼近目标点,从而找到问题的解。

时间复杂度:m行n列的迷宫矩阵实现算法的时间复杂度为O(m*n).

————————————————

算法步骤:

把起始格添加到 "开启列表"

do

{

寻找开启列表中F值最低的格子, 我们称它为当前格.

把它切换到关闭列表.

对当前格相邻的8格中的每一个

if (它不可通过 || 已经在 "关闭列表" 中)

{

什么也不做.

}

if (它不在开启列表中)

{

把它添加进 "开启列表", 把当前格作为这一格的父节点, 计算这一格的 FGH

}

if (它已经在开启列表中)

{

if (用G值为参考检查新的路径是否更好, 更低的G值意味着更好的路径)

{

把这一格的父节点改成当前格, 并且重新计算这一格的 GF 值.

}

}

目标格已经在 "开启列表", 这时候路径被找到跳出循环;

} while(开启列表不为空)

如果开启列表已经空了,目标格没找到 说明路径不存在.

最后从目标格开始, 沿着每一格的父节点移动直到回到起始格, 这就是路径.

3,MazePanel类:

(1)Diffcult(int level):根据选择的难度设置迷宫的长度和宽度,初始大小为10(因为prim只能生成奇数大小,实际为21),level+1,大小+2(实际生成为4);

(2)MapRandom():生成随机迷宫,设置迷宫的入口,并可用于刷新迷宫;

(3)paintComponent(Graphics g) :初始化游戏界面设计,用填充的方法画出迷宫,添加游戏中的字符提升,游戏提醒

(4)ans():用AStar类(A*算法)对生成的迷宫求解,得到的解是当前位置到终点的路径;

(5)isSuccess:游戏结束判断;

(6)keyPressed(KeyEvent e):键盘监听,通过监听键盘输入进行对应的操作

4,Main类

package report4.maze;
 
import java.util.Random;
 
publ
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值