目录
一. 实验准备
迷宫的特点
1.迷宫的起点到终点肯定是存在一条通路的。
2.迷宫存在很多的岔路。
当我们将迷宫的所有路拉直之后,迷宫就会变成一个无向图。所以我们可以将迷宫转换为无向图的两个顶点之间的通路问题,图的遍历。
遍历方法
有很多种遍历方法,例如深度优先遍历和广度优先遍历,或者通过构造最小生成树的方法来实现对迷宫根节点的遍历(通过普利姆算法实现迷宫)
这里我采用的是较为简单的深度优先方法,所以后面的两种方式不多描述。
深度优先遍历(DFS)
DFS的操作步骤如下:
使用深度优先遍历算法,要借助递归思想访问某一结点v,找到v结点附近所有可以到达的邻居结点,随后随机选取一个邻居节点方向一直遍历,如果当前的结点附近的所有邻居结点都被便利过,那么便需要进行回退的操作,直到找到此前遍历过的且存在邻居结点的点,再从此节点开始向下遍历,直到所有点都被遍历完。
例子可以参考:https://blog.csdn.net/qq_38442065/article/details/81634282
当我们遍历完成所有点之后,我们再把所有结点放回图当中,并且打通结点之间的墙,那么便可以生成我们想要的迷宫。
随后我们将所有被打通的路设为通路,将所有没有被打通的障碍物设置为墙,就可以生成一个完整的迷宫。如图:
放上普利姆算法的链接,感兴趣的可以看看:https://www.cnblogs.com/ludashi/p/5944970.html
二. 迷宫的显示
界面弹窗的设置
我使用的是JAVA中的Java swing的JPanel,通过在JPanel种绘图,然后添加至窗口中来显示,我是先设置了一个起始界面,通过点击起始界面的开始游戏按钮,弹出游戏界面弹窗,随后便可以开始游戏。效果如下:
点击了开始游戏按钮之后:
界面设计代码如下:
package 迷宫;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Test {
static JFrame jFrame = new JFrame();
static JButton button1 = new JButton("开始游戏");
static JTextArea jTextArea =new JTextArea(" 欢迎游玩迷宫\n"+"点击按钮开始游戏");
public static void closeThis() {
jFrame.dispose();
}
public static void main(String[] args) {
jFrame.setBounds(400,200,400,300);
jFrame.setVisible(true);
jFrame.setLayout(null);
jTextArea.setEditable(false);
jTextArea.setBounds(20,20,340,100);
jTextArea.setBackground(Color.white);
jTextArea.setFont(new Font("宋体",Font.BOLD,40));
button1.setBounds(40, 150, 300, 100);
button1.setContentAreaFilled(false);
jFrame.add(jTextArea);
jFrame.add(button1);
jFrame.setResizable(false);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
closeThis();
JFrame frame = new JFrame();//新建窗口
int width = Toolkit.getDefaultToolkit().getScreenSize().width;// 取得屏幕宽度
int height = Toolkit.getDefaultToolkit().getScreenSize().height;// 取得屏幕高度
frame.setSize(800, 800);// 设置窗体大小
frame.setLocation((width - 600) / 2, (height - 600) / 2);// 设置窗体出现大小
frame.setResizable(false);// 设置窗体大小不可变
frame.setDefaultClose