【项目三 基于A*算法的迷宫游戏开发】

一、 实验要求

1、迷宫随机生成
2、玩家走迷宫,留下足迹
3、系统用A*算法寻路,输出路径

二、前期准备

解决迷宫问题要用到两个算法,深度优先遍历(DFS)生成迷宫,A*算法寻路。那么首先要对这两种算法有清晰的了解。

1.深度优先遍历(DFS)
基于深度优先遍历的随机迷宫生成,我自己的理解简而言之可以分为以下几步:
a. 建立一张地图,用二维数组表示,地图上全是障碍物。然后再创建一个用来表示每个格子是否被访问过的二维数组。再创建一个用来表示路径的栈结构。
b.随机选择地图上的一点,为了方便我初始点直接取的是左上角即坐标表示为(0,0)的格子。终点的话因为不涉及到交互就暂时没有。
c.查找当前格子的邻接格(注意,这里的邻接格子都是还未被访问的)。随机选择一个邻接格子为下一 格,当前格移动到下一格,标记当前格为已访问,将当前格压入路径栈中。一直重复第三步操作。
d.在第三步操作中,如果当前格子不存在可访问的邻接格,则将栈顶的元素弹出,即退回上一步操作,如果栈为空,则结束程序,打印结果。
在这里插入图片描述
2.A*算法
公式表示为: f(n)=g(n)+h(n),
其中, f(n) 是从初始状态经由状态n到目标状态的代价估计,
g(n) 是在状态空间中从初始状态到状态n的实际代价,
h(n) 是从状态n到目标状态的最佳路径的估计代价。
(对于路径搜索问题,状态就是图中的节点,代价就是距离)
详见:A*算法详解(讲的一级棒 )

三、程序代码

Test类:

import java.awt.*;
import javax.swing.JFrame;
public 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();
    }
}

Panel类:

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{
   

    Maze M = new Maze();//定义一个Maze类对象,生成地图
    AStart A = new AStart();//定义一个AStart类,画出迷宫路径

    private JPanel jp = new JPanel();
    private JButton start = new JButton("开始游戏");
    private JButton answer = new JButton("画出路径");
    private JButton hide = new JButton("隐藏路径");
    private JButton reset = new JButton("更新地图");
    private JButton exit = 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);
        start.setBounds(470, 130, 90, 30);
        answer.setBounds(470, 210, 90, 30);
        hide.setBounds(470, 290, 90, 30);
        reset.setBounds(470, 370, 90, 30);
        exit.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 = ImageIO.read(new File("images/background.png"));// 放窗口背景图片
            victory=ImageIO.read(new File
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值