Java实现可视化迷宫

代码地址如下:
http://www.demodashi.com/demo/14547.html

需求

使用深度优先算法求解迷宫路径,使用Java实现求解过程的可视化,可单步运行,形象直观。

演示效果

红色格子为迷宫终点,迷宫可放大缩小,为了录屏选择了较小的尺寸,有多种不同难度的迷宫可以加载。

  1. 简单迷宫
  2. 复杂迷宫

项目运行

文件中有两个运行脚本,Windows下直接双击win运行.bat即可,linux和Mac运行sh文件中的命令即可,喜欢用IDE的也可自行创建项目。
运行项目后,点击菜单栏左上角的Map加载迷宫地图, 点击右下角的Run开始解迷宫,Step可单步运行,可通过速度进度条调节速度。

项目结构

Maze
├── classes      # 存放编译生成的class文件
├── lib.jar      # 打包好的gui库
├── map          # 迷宫地图文件
│   ├── EasyMaze.txt
│   ├── FinalMaze01.txt
│   ├── FinalMaze02.txt
│   ├── FinalMaze03.txt
│   ├── FinalMaze04.txt
│   └── FinalMaze05.txt
├── src
│   ├── MazeBug.java
│   └── MazeBugRunner.java
├── linux运行.sh     # 运行脚本 
└── win运行.bat     # 运行脚本

原理方法

使用深度优先算法,每个格子下一步都有上下左右4种走法,但是这4种走法并不是都是合法的,比如有些格子有障碍物,有些格式在边界之外,去掉这些剩下的才是合法的走法。

深度优先算法的思想就是:

  1. 找出当前位置A下一步合法的的格子,选择其中一个,往前走一步到达B。
  2. 如果B相邻的有合法格子,重复第1步;如果没有合法的,后退一步回到A,选择A的其他合法格子走;
  3. 重复以上方法,直到找到迷宫终点;

算法优化:上面的方法选择下一步走的方向是随机的,或者按照上下左右的顺序选择。但是很多迷宫都有偏向性,比如如果有右偏向性,那么每次都优先往右走可以更快走出迷宫。所以在实现的时候,记录每个方向走的次数,每往一个方向走一步就加1,如果回退就该方向减1,每次走都优先走次数最多的方向,当迷宫有偏向性时,该方法效率更高。

以项目中的迷宫为例,大部分情况下偏向性所需步数更少。

 普通方法:   534 1175 350 973 1052
 偏向性:       552 761 330 175 420

代码实现

/*
 * 节点:存储方向和该方向所走的次数
 * 往一个方向前进则加1,后退则减1
 */
class Node {
   
	private int dir;   // 方向,角度值
	private int ct;    // 该方向所走次数

	public Node(int initdir, int initct) {
   
		dir = initdir;
		ct = initct;
	}

	public int getDir() {
   
		return dir;
	}

	public int getCt() {
   
		return ct;
	}

	public void setCt(int deta) {
   
		ct += deta;
	}
}

// 深度优先算法解迷宫,并且以小甲虫的形式呈现
public class MazeBug extends Bug {
   
	private Location next;             // 下一步要走的格子
	private Integer stepCount = 0;     // 所走的步数
	private boolean isEnd = false;     // 是否到达迷宫出口
	private boolean hasShown = 
  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值