代码如下
文章目录
一、实验内容
二、深度优先算法生成迷宫
三、A*算法走迷宫
四、结果测试
五、源代码
一、实验内容
1、要求:
1)迷宫随机生成
2)系统用A*算法寻路,输出路径
3) 实现基本游戏界面
2、解决问题:
1)如何显示迷宫的图形界面
2)如何生成随机的迷宫
3)怎样移动游戏中走迷宫的“玩家”
4)用A*算法求解迷宫
二、深度优先算法生成迷宫
1、整体思路
1)利用深度遍历的思想。访问到一个节点时,搜索这个节点没有被访问过的相邻节点,选择一个继续做同样的操作,直到没有邻节点为止再回溯到上一个访问的节点,并选择另外的邻节点。
2)这种方案生成的迷宫会有一条明显的主路,这条主路特别长,贯穿大部分区域的路线,同时,迷宫的路线一般比较扭曲。这种采用深度优先算法(递归回溯算法)生成的迷宫称之为“主路扭曲型”迷宫。
三、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)。
四、结果测试
2、完整源代码
(1)Test类
package Maze;
import java.awt.Toolkit;
import javax.swing.JFrame;
class Test {
public static void main(String[] args) {
JFrame frame = new JFrame();//新建窗口
int width = Toolkit.getDefaultToolkit().getScreenSize().width;// 取得屏幕宽度
int height = Toolkit.getDefaultToolkit().getScreenSize().height;// 取得屏幕高度
frame.setSize(600, 600);// 设置窗体大小
frame.setLocation((width - 600) / 2, (height - 600) / 2);// 设置窗体出现大小
frame.setResizable(false);// 设置窗体大小不可变
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗体关闭方式
frame.add(new Panel());
frame.setFocusable(true);//为屏幕添加焦点
frame.setVisible(true);// 设置窗体可视
frame.requestFocus();
}
}
(2)Panel类
package Maze;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JPanel;
public class Panel extends JPanel implements MouseListener, KeyListener{
Maez M = new Maez();//定义一个Maez类对象,生成地图
AStart A = new AStart();//定义一个AStart类,画出迷宫路径
private JPanel jp = new JPanel();
private JButton answer = new JButton("显示路径");
private JButton hide = new JButton("隐藏路径");
private JButton reset = new JButton("重置地图");
private JButton exit = new JButton("退出游戏");
private JButton start = new JButton("开始游戏");
BufferedImage wall = null;
BufferedImage bj = null;
BufferedImage victory = null;
BufferedImage my = null;
int myx = 1;// 定义角色横坐标并初始化
int myy = 1;// 定义角色纵坐标
int endx;// 定义终点横纵坐标
int endy;
boolean isStarted = false;
boolean isVictory = false;
boolean ans = false;// 用于显示路径
public Panel() {
this.setName("迷宫");// 设置标题
this.setLayout(null);
answer.setBounds(470, 130, 90, 30);
hide.setBounds(470, 210, 90, 30);
reset.setBounds(470, 290, 90, 30);
exit.setBounds(470, 370, 90, 30);
start.setBounds(470, 450, 90, 30);
answer.addMouseListener(this);
hide.addMouseListener(this);
reset.addMouseListener(this);
exit.addMouseListener(this);
start.addMouseListener(this);
start.addKeyListener(this);
this.add(jp);
this.add(start);
this.add(answer);
this.add(hide);
this.add(reset);
this.add(exit);
try {
bj =