项目要求:

一个网格迷宫由n行n列的单元格组成,每个大院个要么是空地(用0表示),要么是障碍物(用1表示),你的任务是找一条从起点到终点的移动序列,其中只能上下左右移动到相邻单元格。任何时候都不能在有障碍物的单元格中,也不能走到迷宫之外,起点为左上角和终点右下角。

项目功能:

解决迷宫路径查找问题,寻找一条从左上角迷宫入口到右下角迷宫出口的一条有效路径,0代表可走,1代表能走,找到请输出最终的迷宫和路径信息,找不到请输出不存在有效路径。

思路:

1、定义一个迷宫节点类型(MazeNode)的二维数组

2、初始化每个格子中的value值,给二维数组每个格子存放对象。对象的value值只能为0(当前格子可以走)或者1(当前格子不能走)

3、初始化每个格子四个方向(东西南北)是否是可走状态(0可走,1不可走)

4、开始走迷宫。采用栈操作,记录行走的路径,将左上角元素入栈,判断当前栈顶元素的哪个方向可走,将其中一个可走方向进行入栈操作,知道右下角元素停止。栈中保存走过的路径。注意:如果遇到走入死胡同问题,此时需要将是栈顶元素并且栈顶元素的四个方向都不能行走,此时将其出栈,选择新方向再次入栈,直到右下角元素停止。

代码和运行截图:

迷宫的结点类:

package cc;

public class MazeNode {

private int value;//迷宫节点数据0或者1

private int i;//迷宫节点所在的行

private int j;//迷宫节点所在的列

private boolean[] state;//当前节点可走或不可走

/*构造*/

public MazeNode(int value,int i,int j) {

this.value=value;

this.i=i;

this.j=j;

state=new boolean[Constant.SIZE];

}

/*get和set*/

public int getValue() {

return value;

}

public void setValue(int value) {

this.value = value;

}

public int getI() {

return i;

}

public int getJ() {

return j;

}

public void setState(int direction,boolean state) {

this.state[direction]=state;

}

public boolean getState(int direction) {

return state[direction];

}

}

常量的类:

package cc;

public class Constant {

public static final int SIZE=4;//四个方向

public static final int EAST=0;//东

public static final int WEAST=1;//西

public static final int SORTH=2;//南

public static final int NORTH=3;//北

public static final int ABLE=0;//可走

}

迷宫类:

package cc;

import java.util.Scanner;

import java.util.Stack;

/*

* @author : CC

* @data : 2020-12-14

* */

public class Maze {

private MazeNode[][] mazeNodes;//迷宫数组

private int column;//列

private int row;//行

private Stack stack;//栈

/*构造*/

public Maze(int row,int column) {

this.mazeNodes=new MazeNode[row][column];

this.column=column;

this.row=row;

stack=new Stack();

}

/*初始化迷宫*/

private void initValue() {

Scanner sc=new Scanner(System.in);

System.out.println("请输入迷宫路径:");

for(int i=0;i

for(int j=0;j

this.mazeNodes[i][j]=new MazeNode(sc.nextInt(),i,j);

}

}

sc.close();

}

/*初始化迷宫节点的状态*/

private void initState() {

for(int i=0;i

for(int j=0;j

if(mazeNodes[i][j].getValue()==Constant.ABLE) {

//东

if(j+1

mazeNodes[i][j].setState(Constant.EAST,true);

}

//南

if(i+1

mazeNodes[i][j].setState(Constant.SORTH,true);

}

//西

if(j-1>=0&&mazeNodes[i][j-1].getValue()==Constant.ABLE) {

mazeNodes[i][j].setState(Constant.WEAST,true);

}

//北

if(i-1>=0&&mazeNodes[i-1][j].getValue()==Constant.ABLE) {

mazeNodes[i][j].setState(Constant.NORTH,true);

}

}

}

}

}

/*走迷宫*/

public void goMaze() {

initValue();

initState();

if(mazeNodes[0][0].getValue()!=Constant.ABLE) {

//如果连起点都不能走的话,就表示没有路径

System.out.println("没有迷宫路径!");

return;

}

//起点入栈

stack.push(mazeNodes[0][0]);

//开始走迷宫

while(!stack.isEmpty()) {

MazeNode top=stack.peek();//获取栈顶元素

int i=top.getI();

int j=top.getJ();

if(i==row-1&&j==column-1) {

//找到了终点

System.out.println("找到迷宫路径!");

show();

return;

}

//判断栈顶元素是否是死胡同

if(top.getState(Constant.EAST)==false&&top.getState(Constant.WEAST)==false&&top.getState(Constant.NORTH)==false&&top.getState(Constant.SORTH)==false) {

//如果是,直接出栈

stack.pop();

}

//判断各个位置是否可走

//由于起点在左上角,所以我们从东边开始判断

if(top.getState(Constant.EAST)) {

stack.push(mazeNodes[i][j+1]);//东边入栈

//当前节点的东边false

mazeNodes[i][j].setState(Constant.EAST, false);

//当前节点的东边节点的西边false

mazeNodes[i][j+1].setState(Constant.WEAST, false);

}

//南

if(top.getState(Constant.SORTH)) {

stack.push(mazeNodes[i+1][j]);//南边入栈

mazeNodes[i][j].setState(Constant.SORTH, false);

mazeNodes[i+1][j].setState(Constant.NORTH, false);

}

//西

if(top.getState(Constant.WEAST)) {

stack.push(mazeNodes[i][j-1]);//西边入栈

mazeNodes[i][j].setState(Constant.WEAST, false);

mazeNodes[i][j-1].setState(Constant.EAST, false);

}

//北

if(top.getState(Constant.NORTH)) {

stack.push(mazeNodes[i-1][j]);//北边入栈

mazeNodes[i][j].setState(Constant.NORTH, false);

mazeNodes[i-1][j].setState(Constant.SORTH, false);

}

}

System.out.println("此迷宫无解!");

}

/*输出路径*/

private void show(){

while (!stack.isEmpty()) {

MazeNode top = stack.peek();// 获取栈顶元素

top.setValue(2);

stack.pop();// 出栈操作

}

System.out.println("所找到的路径为值2的坐标:");

for(int i = 0;i

for(int j = 0;j

System.out.print(mazeNodes[i][j].getValue()+" ");

}

System.out.println();

}

}

}

测试类:

package cc;

public class Test {

public static void main(String[] args) {

Maze t1=new Maze(4,5);

t1.goMaze();

}

}

运行截图:

如有不足和建议,欢迎指正和讨论。

总结

到此这篇关于Java小项目之迷宫游戏实现的文章就介绍到这了,更多相关Java迷宫小项目内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

java课设小迷宫含代码_Java小项目之迷宫游戏的实现方法相关推荐

  1. 100套java课设源码参考/毕设源码代码参考

    引言:本人是一个Java 开发者,喜欢分享Java课设源码和代码,用于课程设计或者作业学习参考噢,开发一些有技术含量的Java web源码,主要的技术有JSP+Servlet,SSM/SpringBo ...

  2. java课程设计总结迷宫_java课设走迷宫(含代码)#优质参考

    java课设走迷宫(含代码)#优质参考 目录1设计目的1.1课程设计的目的2总体设计2.1设计思路2.2设计方法3关键技术4程序流程5主要源代码6. 运行结果及结论7.参考文献1.设计目的1.1课程设 ...

  3. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

  4. JAVA课设单人版五子棋小游戏

    内容介绍:该程序为Java课设的单人版五子棋小游戏,通过eclipse编辑,实现了动作事件的监听与处理,以及JavaSwing的界面编程.  编辑排行榜,包含局数,结果,步数,以及"关于我们 ...

  5. java 课设 商品库存管理系统

    比较辛苦的java课设!写了蛮久的,战斗了好多个通宵. 下载https://download.csdn.net/download/qq_37871063/10297290 入门:JAVAFX+MVC+ ...

  6. Java课设——ArxivHelper

    项目地址https://github.com/PKUCSS/arxiv-helper How to run运行方式:java -jar arxiv-helper.jar Tips:We use pyi ...

  7. JAVA课设:电子英汉词典(附源码+调试)

    JAVA课设:电子英汉词典 电子英汉词典功能概述 整体要求:用图形用户界面实现,能够编辑词典库中的信息,能够实现英译汉,汉译英.(要考虑一词多义) 具体实现:1.用图形用户界面实现:2.能够实现英译汉 ...

  8. Java课设:火车售票系统2.0

    文章目录 注意 系统概述 数据库表的变化 类名变化 运行 管理员登陆 管理员界面 录入车次 修改车次信息 查看所有车次 删除车次 管理员用户资料查询 注意 火车售票系统等java课设已经停止更新了,博 ...

  9. 华南农业大学课设——数据结构课设、Java课设、操作系统课设

    文章目录 缘起 大二上-数据结构课设(高校教学管理系统)-C++.Qt 视频演示 感想 大二下-Java课设(流程图绘制程序)-JavaFX 视频演示 感想 大三上-操作系统课设(模拟磁盘文件系统实现 ...

最新文章

  1. 读 博 失 败 的 10 大 作 死 方 法
  2. 解读微软开源MMLSpark:统一的大规模机器学习生态系统
  3. OVS DPDK--数据结构关系(七)
  4. MATLAB自定义函数及局部变量
  5. 【转】嵌入式产品开发流程
  6. 数据库安装mysql57_记录CentOS7.X版本下安装MySQL5.7数据库
  7. php yaf.dll,windows下配置nginx+php+yaf的环境
  8. 中文女和程序员的爱情奇遇[转]
  9. Python3 - 文件处理
  10. ie8升级到ie11
  11. 计算机专业英语高等教育出版社2013版
  12. 几行代码,搞定 SpringBoot 接口恶意刷新和暴力请求!
  13. 万字综述自动驾驶数据闭环
  14. 2048版俄罗斯方块java_Java版俄罗斯方块
  15. HTML5 之 Figure Figcaption 标签
  16. 理想电压源的内阻是0,理想电流源的内阻是无穷大
  17. You called this URL via POST, but the URL doesn‘t end in a slash and you hav
  18. 搭建系统|升级选股工具,多板块个股同时提取!个股行情走势存入数据库
  19. 宝塔php并发500什么意思,宝塔bt面板服务器设置调整PHP最大并发性能优化设置方法方案...
  20. 透视学现象如何产生?

热门文章

  1. Java网络通信实验小记四:Swing聊天软件
  2. 浅析计算机主板故障,浅析计算机主板故障及维修
  3. WPF 获取主程序(主窗口)对象
  4. maven项目查看依赖树
  5. AForge “未能加载文件或程序集“AForge.Video.FFMPEG.dll”或它的某一个依赖项。找不到指定的模块”
  6. 特征提取与检测6-SURF特征检测
  7. 基于学术研究于NASA官网GPM卫星数据下载详细教程
  8. NSIS:迅雷5.8.6.600自由定制版脚本及下载
  9. 基于社交网络搜索算法的WSN覆盖优化和工程优化
  10. C++ 数据类型与基础