最近经常在机房看同学在玩一个走迷宫的游戏,比较有趣,自己也用java写一个实现随机生成迷宫的算法,其实就是一个图的深度优先遍历算法.基本思想就是,迷宫中的每个点都有四面墙,然后呢,

从任意一点开始访问(我的算法中固定是从(0,0)点开始),往四个方向中的随机一个访问(每访问到一个可访问的点,就去掉该点的那个方向的墙),被访问点继续以这种方识向下进行访问。

对每个被访问的点都被标识为已访问,当一个点对某个方向进行访问时我们首先会判断被访问点是否已被访问,或者触到边界.如果该点四个方向皆已访问或已无法访问,就退回上一个点。上一个点继续这个过程。

这样一次遍历下来,可以确定每个点都被访问过,而且由于每次访问的方向都是随机,这就会形成许多不同遍历情况,同时每两个点之间的路径是唯一,也就形成不同的迷宫,且是起点到终点只有唯一路径,这是由于图的深度遍历算法的特点所决定的。算法的实现上,主要是利用栈,第一次,先把第一个点压进栈里,每访问到一个点,就把该点压进栈里,我们再对栈顶的点进行四个方向的随机访问,访问到新点,又把新点压进去,一旦这个点四个方向都无法访问了,就让该点退栈,再对栈顶的点的四个方向进行访问,以此类推,直到栈里的点都全部退出了,我们的遍历就成功了,这是一个递归的过程,这个算法自然可以用递归的方法来实现,不过这里我这样做,而是手工用一个数组作为栈来实现,呵呵~~说了这么多,也不知道自己要表达的有没表达出来。不过我感觉我的具体代码设计还是写的不好,还有很多地方缺乏完善和优化,权当是算法练习,以下是两个关键类的核心代码,至于表示层的代码就不贴出来了,因为那些都很琐碎。有空时把它完善为一个迷宫游戏,发上来赚资源分,呵呵

下面是效果图:

迷宫的类:

//作者:zhongZw

//邮箱:zhong317@126.com

package cn.zhongZw.model;

import java.util.ArrayList;

import java.util.Random;

public class MazeModel {

private int width = 0;

private int height = 0;

private Random rnd = new Random();

public MazeModel() {

this.width = 50; //迷宫宽度

this.height = 50; //迷宫高度

}

public int getWidth() {

return width;

}

public void setWidth(int width) {

this.width = width;

}

public int getHeight() {

return height;

}

public void setHeight(int height) {

this.height = height;

}

public MazeModel(int width, int height) {

super();

this.width = width;

this.height = height;

}

public ArrayList < MazePoint > getMaze() {

ArrayList < MazePoint > maze = new ArrayList < MazePoint > ();

for (int h = 0; h < height; h++) {

for (int w = 0; w < width; w++) {

MazePoint point = new MazePoint(w, h);

maze.add(point);

}

}

return CreateMaze(maze);

}

private ArrayList < MazePoint > CreateMaze(ArrayList < MazePoint > maze) {

int top = 0;

int x = 0;

int y = 0;

ArrayList < MazePoint > team = new ArrayList < MazePoint > ();

team.add(maze.get(x + y * width));

while (top >= 0) {

int[] val = new int[] {

-1, -1, -1, -1

};

int times = 0;

boolean flag = false;

MazePoint pt = (MazePoint) team.get(top);

x = pt.getX();

y = pt.getY();

pt.visted = true;

ro1: while (times < 4) {

int dir = rnd.nextInt(4);

if (val[dir] == dir)

continue;

else

val[dir] = dir;

switch (dir) {

case 0: // 左边

if ((x - 1) >= 0 && maze.get(x - 1 + y * width).visted == false) {

maze.get(x + y * width).setLeft();

maze.get(x - 1 + y * width).setRight();

team.add(maze.get(x - 1 + y * width));

top++;

flag = true;

break ro1;

}

break;

case 1: // 右边

if ((x + 1) < width && maze.get(x + 1 + y * width).visted == false) {

maze.get(x + y * width).setRight();

maze.get(x + 1 + y * width).setLeft();

team.add(maze.get(x + 1 + y * width));

top++;

flag = true;

break ro1;

}

break;

case 2: // 上边

if ((y - 1) >= 0 && maze.get(x + (y - 1) * width).visted == false) {

maze.get(x + y * width).setUp();

maze.get(x + (y - 1) * width).setDown();

team.add(maze.get(x + (y - 1) * width));

top++;

flag = true;

break ro1;

}

break;

case 3: // 下边

if ((y + 1) < height && maze.get(x + (y + 1) * width).visted == false) {

maze.get(x + y * width).setDown();

maze.get(x + (y + 1) * width).setUp();

team.add(maze.get(x + (y + 1) * width));

top++;

flag = true;

break ro1;

}

break;

}

times += 1;

}

if (!flag) {

team.remove(top);

top -= 1;

}

}

return maze;

}

}迷宫

//作者:zhongZw

//邮箱:zhong317@126.com

package cn.zhongZw.model;

import java.util.*;

import java.lang.*;

public class MazePoint {

private int left = 0;

private int right = 0;

private int up = 0;

private int down = 0;

private int x;

private int y;

public boolean visted;

public MazePoint(int x, int y) {

this.x = x;

this.y = y;

}

public int getLeft() {

return left;

}

public void setLeft() {

this.left = 1;

}

public int getRight() {

return right;

}

public void setRight() {

this.right = 1;

}

public int getUp() {

return up;

}

public void setUp() {

this.up = 1;

}

public int getDown() {

return down;

}

public void setDown() {

this.down = 1;

}

public int getX() {

return x;

}

public void setX(int x) {

this.x = x;

}

public int getY() {

return y;

}

public void setY(int y) {

this.y = y;

}

}

java随机生成迷宫游戏地图_java随机生成迷宫(图的深度优先遍历)相关推荐

  1. java随机生成迷宫(图的深度优先遍历)

    最近经常在机房看同学在玩一个走迷宫的游戏,比较有趣,自己也用java写一个实现随机生成迷宫的算法,其实就是一个图的深度优先遍历算法.基本思想就是,迷宫中的每个点都有四面墙,然后呢, 从任意一点开始访问 ...

  2. java语言实现图的深度优先遍历

    java语言实现图的深度优先遍历: 图的存储采用的是邻接矩阵存储的方式,对下面的无向图进行遍历 代码如下: public class Deep {int count=0;public static v ...

  3. java 生成校验验证码_java 验证码生成与校验

    java绘图相关类 验证码工具类 package dt2008.util; import javax.imageio.ImageIO; import javax.servlet.http.HttpSe ...

  4. java 生成token代码_java token生成和校验的实例代码

    现在越来越多的登录方式都用到了token作为用户登录令牌,所以实现了一个token生成和校验案例. 缺点:该实现方式token是存储在内存中,不适合分布式项目,如需改为分布式项目部署,可把token存 ...

  5. java随机生成一个号码_Java 随机生成任意组电话号码过程解析

    需求说明 要求根据用户输入,生成相应组数的电话号码 实现思路 1.通过百度,获取对应真实世界中电话号码的头三位数 2.采用Math.random()方法,生成电话号码的后八位数 代码内容 随机生成任意 ...

  6. java 随机生成常用汉字_Java随机生成中文汉字

    /** * 原理是从汉字区位码找到汉字.在汉字区位码中分高位与底位, 且其中简体又有繁体. * 位数越前生成的汉字繁体的机率越大. * 所以在本例中高位从171取,底位从161取, 去掉大部分的繁体和 ...

  7. java 判断是否为男女_java:生成中文姓名(区分男女)

    需求 因为某些特殊原因需要生成一些订单数据.所以需要生成随机的姓名. 实现思路 将姓氏.男生名常见字.女生名常见字分别保存在字典中,key为从1开始的连续的整数,value为姓或单字.将字典中的数据缓 ...

  8. java 前端页面调用数据库_java如何生成json被前端调用

    小妹前端一枚,CSDN新人,分不多,请见谅. 现在在自学前后台交互. 现在采用的是ajax调用的方法,json文件是自己写的假数据. $.ajax({ url:"json/mood.json ...

  9. java设置pdf不可编辑_Java动态生成pdf文件(使用itext编辑pdf)

    一.创建pdf模板 使用PDFelement制作pdf模板(数据域的名称对应后面插入的key) 二.导入maven依赖 com.itextpdf itextpdf 5.5.13 com.itextpd ...

  10. java 生成正弦波声音_Java错误生成声音正弦波

    我这里有这个代码,我从如何创建一个可听正弦波的教程有:Java错误生成声音正弦波 import java.nio.ByteBuffer; import javax.sound.sampled.*; p ...

最新文章

  1. golang atomic 32位机器问题
  2. 11-机器学习开发流程--初识
  3. Centos6.3下rsync+sersync安装配置笔记
  4. Docker cgroups作用(十)
  5. saltstack(八):saltstack配置管理-安装配置启动tomcat样例
  6. 机器学习基础(三十一)—— 岭回归(Ridge Regression)到 LASSO
  7. Merkle Tree与区块链
  8. 梅特勒托利多xk3124电子秤说明书_梅特勒托利多电子秤校正标定方法
  9. 微型四轴飞行器(3)嵌入式软件设计
  10. Spring学习笔记(一)
  11. 如何给刚刚出厂的服务器配置IP地址(华为RH2288 v3)
  12. [附源码]计算机毕业设计Python校园运动会管理系统(程序+源码+LW文档)
  13. 用笔记本改装智能家居服务器,一年之后,改装4G版小米笔记本电脑的可行性
  14. andl $size-1,%ecx
  15. 简述TCP 三次握手
  16. Web安全—逻辑越权漏洞(BAC)
  17. DAL(Dynamic Anchor Learning for Arbitrary-Oriented Object Detection)
  18. 如何使用微图将影像和矢量一起导出成CAD格式的数据
  19. Python数据分析——Numpy常用函数
  20. Spring及Springboot 异步请求

热门文章

  1. H.264之几种开源解码器的对比评测
  2. Win11C盘扩容详细教程
  3. 数学猜想验证步骤_猜想验证思想在数学教学中的应用
  4. 大数据信息资料采集:电商网站京东淘宝苏宁易购产品评论内容采集
  5. C语言4位BCD码加法器,四位二进制BCD码加法器.doc
  6. 罗素“杀死了”康托尔
  7. 华退学博士王垠:离开是为了获得力量后再回来
  8. 【浏览器】【vue】修改网页上的页签图标
  9. 一款免费在线文字识别(OCR)工具
  10. 【Go语言】深入浅出chan(各种实例场景+分析)