目录
一、实验要求
- 迷宫游戏是非常经典的游戏,在该题中要求随机生成一个迷宫,并求解迷宫;
- 要求查找并理解迷宫生成的算法,并尝试用两种不同的算法来生成随机的迷宫。
- 要求迷宫游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘方向键控制,并在行走路径上留下痕迹;系统提示迷宫路径要求基于A*算法实现,输出玩家当前位置到迷宫出口的最优路径。设计交互友好的游戏图形界面。
二、实验准备
1、了解三大迷宫生成算法:深度优先,随机Prim,递归分割
2、选择其中一种算法生成迷宫,我选择的是Prim
3、学习A*算法,使用其寻找路径
三、程序代码
MiGong 类:主函数
public class MiGong {
public static int n;
public static void main(String[] args) {
String number = JOptionPane.showInputDialog("迷宫游戏大小生成设置 :", "请输入奇数数字");
n = Integer.parseInt(number);
if (n % 2 == 0) {
JOptionPane.showMessageDialog(null, "请输入奇数数字作为迷宫宽度", "错误提示", JOptionPane.INFORMATION_MESSAGE);
System.exit(1);
}
AlgoVisualizer vis = new AlgoVisualizer(n, n);
}
}
AlgoVisualizer 类:主要完成随机迷宫的生成以及通过基于递归的DFS算法将迷宫的解事先求出,用户按下空格则可以实现提示功能,红色表示玩家,键盘上下左右控制四个方向的移动。run()方法实现了所有的动画逻辑。
class AlgoVisualizer {
private static int blockSide;
MazeData data;
private AlgoFrame frame;
private static final int d[][] = {
{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
public AlgoVisualizer(int N, int M) {
if (M < 100) {
blockSide = 7;
}
if (M > 100) {
blockSide = 6;
}
// 初始化数据
data = new MazeData(N, M);
int sceneHeight = data.N() * blockSide;
int sceneWidth = data.M() * blockSide+15;
// 初始化视图
EventQueue.invokeLater(() -> {
frame = new AlgoFrame("迷宫(按空格键显示路线)", sceneWidth, sceneHeight+10);
frame.addKeyListener(new AlgoKeyListener());
frame.setLocationRelativeTo(null);//窗口居中
new Thread(() -> {
run();
}).start();
JMenuBar menubar = new JMenuBar();
frame.setJMenuBar(menubar);
JMenuItem Exit=new JMenuItem("重新生成地图");
menubar.add(Exit);
Exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
Exit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
frame.setVisible(false); //窗体不可见
AlgoVisualizer vis = new AlgoVisualizer(MiGong.n, MiGong.n);
}
});
JMenuItem Exit1=new JMenuItem("返回设置迷宫游戏大小");
menubar.add(Exit1);
Exit1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
Exit1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
frame.setVisible(false); //窗体不可见