实验三:迷宫的实现

目录

一. 实验准备

迷宫的特点

遍历方法

深度优先遍历(DFS)

二. 迷宫的显示

界面弹窗的设置

定义按钮和界面

设置游戏界面以及游戏按钮监听

图片的读取和使用

设置鼠标监听

设置键盘监听

三. A*算法


一. 实验准备

迷宫的特点

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值