一、项目准备
需求分析
(1)迷宫游戏是非常经典的游戏,在该题中要求随机生成一个迷宫,并求解迷宫;
(2)要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘方向键控制;
(3)系统走迷宫路径基于逆二叉树搜索,输出走迷宫的路径并显示。
(4)设计交互友好的游戏图形界面
编程语言及开发工具
java 基于IDEA
二、实现过程
利用深度遍历的思想。访问到一个节点时,搜索这个节点没有被访问过的相邻节点,选择一个继续做同样的操作,直到没有邻节点为止再回溯到上一个访问的节点,并选择另外的邻节点。
算法思想
- 从第一个单元开始,检查当前单元是否堵塞(即周围四个单元都是已被访问或不可访问)
- 若不堵塞,则随机选择一个相邻单元作为下一单元,检查是否可访问
- 若可访问,则打破当前单元与下一单元之间的墙壁,将当前单元入栈,将下一单元作为当前单元;若不不可访问,则回到步骤2
- 若当前单元堵塞,则回退至上一单元
- 如此遍历,直到所有的单元都被访问
面板设计
- 利用Java Swing的相关函数,进行实线的绘画,以线为墙,实心圆为角色,空白部分为路来画迷宫。
- 利用Java函数addKeyListener来监听按键↑↓←→的输入,只有当角色周围是路上,才能移动。当角色到达终点时进入下一关。
三、代码部分
package com.company;
import java.awt.Color; //颜色相关操作的类;
import java.awt.Graphics; //用以基本计何图形的绘制;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random; //随机类
import java.util.Stack; //栈
import javax.swing.*;
import javax.imageio.ImageIO;
class grid {
static final int InTree = 1;
static final int NotIntree = 0;
private int x = -1;
private int y = -1;
private int flag = NotIntree;
private grid father = null;
public grid(int xx, int yy) {
//构造函数;
x = xx;
y = yy;
}
public int getX() {
//获取该方格的横坐标;(由于不可直接用对象访问私有变量);
return x;
}
public int getY() {
//获取纵坐标;
return y;
}
public int getFlag() {
//获取标志位;
return flag;
}
public grid getFather() {
//获取方格对象的父节点;
return father;
}
public void setFather(grid f) {
//修改方格对象的父节点;
father = f;
}
public void setFlag(int f) {
flag = f; //修改标志位;
}
public String toString() {
//以字符串形式导出坐标;
return new String("(" + x + "," + y + ")\n");
}
}
public class Main extends JPanel {
private static final long serialVersionUID = -8300339045454852626L;
private int NUM, width, padding; // NUM为界面总边长,width为每个格子的边长;padding为内边距;
private grid[][] maze;
private int myX, myY; //定义了两个点;
int sum = 0; //记录步数;
int rand = 0; //记录关数;
//JButton Level1,Level2,Level3;
private boolean drawPath = false; //路径标志位;
Main(int n, int w, int p) {
//Main的构造方法;
NUM = n; //窗口边长;
width = w; //子方格边长;
padding = p; //边线长度
/*
Level1=new JButton("难度1");
Level2=new JButton("难度2");
Level3=new JButton("难度3");
this.add(Level1);
this.add(Level2);
this.add(Level3);
Level1.addActionListener( this);
Level2.addActionListener( this);
Level3.addActionListener( this);
this.addKeyListener((KeyListener) this);
*/
maze = new grid[NUM][NUM]; //调用Lattice的构造函数,对尾端的小方格构造;
for (int i = 0; i <= NUM - 1; i++) //对除最后一格外的每一个坐标认定为一个小方格对象并构造;
for (int j = 0; j <= NUM - 1; j++)
maze[i][j] = new grid(i, j); //每个在窗口内具有整数坐标的点被视为一个方格对象;
createMaze();
setKeyListener();
this.setFocusable(true);
}
private void init() {