迷宫Java带界面方向键控制

迷宫Java带界面方向键控制

第一次写博客,先上程序截图
迷宫Java带界面方向键控制
迷宫Java带界面方向键控制
用户可以自定义迷宫维度,通过键盘方向键进行小人移动。程序通过穷举求解判断迷宫是否有通路并可显示相应路径。

迷宫元素类:
每一个格子即为一个迷宫元素对象

package Maze;

import javax.swing.JLabel;

public class Mazeelem {

JLabel pic;//图片标签
int is,x,y;//is表示是否是障碍,1表示路,0表示障碍;x,y表示坐标
boolean ed=false;//是否走过
int mm,nn;//附近元素的位置

//构造函数
public Mazeelem (int a, int b,int c,JLabel p) {
	this.is=a;
	this.x=b;
	this.y=c;
	this.pic=p;
}
//无参构造函数
public Mazeelem() {
}
//传入参数为迷宫和行走的方向
//1表示右,2表示下,3表示左,4表示上(顺时针)
public Mazeelem site(Mazeelem[][] ma,int n) {
	
	 if(n==1) {//该元素右边元素
		mm=this.x;
		nn=this.y+1;
	}
	else if(n==2) {//该元素下边元素
		mm=this.x+1;
		nn=this.y;
	}
	else if(n==3) {//该元素左边元素
		mm=this.x;
		nn=this.y-1;
	}
	else if(n==4) {//该元素上边元素
			mm=this.x-1;
			nn=this.y;
		}
	 
	return ma[mm][nn];
}

}

判断有无通路时栈的结点类:

package Maze;
import java.util.Stack;

//链栈的结点
public class Node {
	public int p,q;
	public Stack<Integer> ss=new Stack<Integer>();//元素代表可以走的方向位置
}

本程序核心:判断有无通路函数。主要思想为将存在多个分支通路的迷宫元素(岔路口初)压栈,当前方进入死路时出栈,回到最近一个岔路口处换一个方向进行试探,直到到达终点或栈为空而还未到终点。Mazeelem为储存这个迷宫元素的数组。

//判断迷宫有无通路,传入参数为用户选择的样式图和地图维度
	public boolean havepath(Mazeelem[][] maze,int n) {
		Mazeelem news=new Mazeelem();//当前位置结点
		Mazeelem ne=new Mazeelem();//临时结点
		Stack<Node> time = new Stack<Node>();//迷宫结点栈
		time.clear();//清空栈

		Node tt= new Node();//临时结点
		news=maze[1][1];//初始化当前结点(入口)
		int v,u,c;//v,u代表位置,c代表试探方向
		v=u=1;
		while(v!=n-2||u!=n-2) {//未到终点继续循环
			tt.ss.clear();//清空方向栈
			Node ti = new Node();//临时结点
			road.push(news);//压入路径栈
			for(int i=4;i>=1;i--) {//试探4个方向
				if(news.site(maze,i).is==1&&!news.site(maze,i).ed) {//如果通并且未走过就将该方向压入结点的方向栈
					ti.ss.push(Integer.valueOf(i));
				}
			}
			if(!ti.ss.isEmpty()) {//如果方向栈不空,则试探方向
				c=ti.ss.pop();//出栈
				if(!ti.ss.isEmpty()) {//试探该方向,有方向可走就压栈
					ti.p=v;
					ti.q=u;
					time.push(ti);
				}
				maze[v][u].ed=true;//标记当前位置走过
				v=news.site(maze,c).x;//将news移动到下一个方向
				u=news.site(maze,c).y;
				System.out.println("f"+v+"  "+u);
				news=maze[v][u];
			}
			else{//无方向可走
				maze[v][u].ed=true;//标记当前走过
				if(!time.isEmpty()) {//回到上一个结点
					tt=time.pop();
					ne=road.pop();//出栈路径
					v=tt.p;//回到带有多个方向的结点位置,x
					u=tt.q;//y
					while(!(ne.x==v&&ne.y==u))//路径栈也出栈一直到多个方向结点的地方
						ne=road.pop();
					news=maze[v][u];//回到可走结点
					if(!tt.ss.isEmpty())//还有方向可走,将该结点压入栈
						time.push(tt);
					System.out.println("s"+v+"  "+u);
				}
				else {//结点栈为空则无方向可走,返回无通路
					return false;
				}
					
			}
			ti.ss.clear();//清空方向栈
			ti=null;//清空临时结点
		}
		
		return true;
	}

由于焦点问题后期把重玩和提示路径按钮换为了按键盘R,H。
如果有什么好的建议或意见欢迎大家在评论区留言。
点击下载完整程序