迷宫java代码_java写的迷宫代码

迷宫代码:

截图如下:

3a0c0bd87872e06c8cddeeab78b14325.png

packagecom.zxl.maze;/** 抽象类表示选择不同的算法*/

public abstract classAbstractMap

{/** 得到数据*/

public abstract boolean[][] getData(int m,intn);/** 重置*/

public abstract void reset(int m,intn);

}packagecom.zxl.maze;/**深度优先,生成迷宫*/

importjava.awt.Point;importjava.util.Random;importjava.util.Stack;public class DFSMap extendsAbstractMap

{private int m = 30, n = 30;private booleana[][];private intcurrX, currY;private Stack stack;//保存已走路径

private int[] X_GO1 = { -2, 2, 0, 0};private int[] Y_GO1 = { 0, 0, 2, -2};private int[] X_GO2 = { -1, 1, 0, 0};private int[] Y_GO2 = { 0, 0, 1, -1};publicDFSMap()

{

stack= new Stack();

}

@Overridepublic boolean[][] getData(int m,int n)//得到数据

{//TODO Auto-generated method stub

reset(m, n);returna;

}

@Overridepublic void reset(int m, int n)//重置

{//TODO Auto-generated method stub

a= new boolean[2 * m + 1][2 * n + 1];this.m = 2 * m + 1;this.n = 2 * n + 1;for (int i = 0; i < this.m; i++)for (int j = 0; j < this.n; j++)

a[i][j]= false;

currX= 1;

currY= 1;

stack.clear();

stack.push(new Point(1, 1));

a[1][0] = true;

a[1][1] = true;

start();

}private boolean check()//判断是否全部走过。。。

{for (int i = 1; i < m; i += 2)

{for (int j = 1; j < n; j += 2)

{if (a[i][j] == false)return false;

}

}return true;

}private void forward()//后退一步

{if (stack.size() > 0)

{

Point p=stack.pop();

currX= (int) p.getX();

currY= (int) p.getY();

}else{

goRandPosition();

}

}private voidgoRandPosition()

{inti, j;while (true)

{

i= (int) (Math.random() *m);

j= (int) (Math.random() *n);if (a[i][j] == true && i % 2 == 1 && j % 2 == 1)

{

stack.push(newPoint(i, j));

currX=i;

currY=j;break;

}

}

}private void start()//具体操作

{while (!check())

{

go();

}

a[m- 2][n - 1] = true;

}private voidgo()

{int orders[] = getOrder(4);for (int i = 0; i < orders.length; i++)

{if (isSafe(currX + X_GO1[orders[i]], currY + Y_GO1[orders[i]]))//上

{

goNext(orders[i]);return;

}

}

forward();

}private void goNext(int i)//下一步

{//TODO Auto-generated method stub

a[currX + X_GO1[i]][currY + Y_GO1[i]] = true;

a[currX+ X_GO2[i]][currY + Y_GO2[i]] = true;

stack.push(newPoint(currX, currY));

currX+=X_GO1[i];

currY+=Y_GO1[i];

}private int[] getOrder(int i)//产生随机序列

{//TODO Auto-generated method stub

int a[] = new int[i];

Random ran= newRandom();for (int j = 0; j < i; j++)

a[j]=j;for (int k = 0; k < i; k++)

{int r1 =ran.nextInt(i);int r2 =ran.nextInt(i);int b =a[r1];

a[r1]=a[r2];

a[r2]=b;

}returna;

}private boolean isSafe(int x, inty)

{if (x < 0 || x >= m || y < 0 || y >= n || a[x][y] == true)

{return false;

}return true;

}

}packagecom.zxl.maze;/** 随机prim算法的核心是(翻译的维基):

1、让迷宫全是墙

2、选一个格作为迷宫的通路,然后把它的邻墙放入列表

3、当列表里还有墙时

——1、从列表里随机选一个墙,如果它对面的格子不是迷宫的通路

————1、把墙打通,让对面的格子成为迷宫的通路

————2、把那个格子的邻墙加入列表

——2、如果对面的格子已经是通路了,那就从列表里移除这面墙*/

importjava.awt.Point;importjava.util.ArrayList;importjava.util.List;importjava.util.Random;public class PriMap extendsAbstractMap

{private int m = 0, n = 0;private booleana[][];private int currX, currY;//记录当前格子位置

private List set;//用作队列,存放墙

private int[] X_GO1 = { 1, 0, -1, 0};private int[] Y_GO1 = { 0, -1, 0, 1};public void reset(int m, intn)

{this.m = 2 * m + 1;this.n = 2 * n + 1;

a= new boolean[this.m][this.n];for (int i = 0; i < this.m; i++)for (int j = 0; j < this.n; j++)

a[i][j]= false;

currX= 1;

currY= 1;

set.clear();

set.add(new Point(1, 2));

set.add(new Point(2, 1));

a[1][0] = true;

a[1][1] = true;

go();

a[this.m - 2][this.n - 1] = true;

}public voidgo()

{while (set.size() > 0)

{if (choiceWall())//选择墙

{

addWall(currX, currY);//将墙的临墙加入队列

}

}

}private booleanchoiceWall()

{//TODO Auto-generated method stub

Random r = newRandom(System.currentTimeMillis());

Point p=set.remove(r.nextInt(set.size()));int x = (int) p.getX();int y = (int) p.getY();if (test(x, y) == 1)

{if (isSafe(x - 1, y) && a[x - 1][y] == false)

{

a[x][y]= true;

currX= x - 1;

currY=y;

a[currX][currY]= true;return true;

}else if (isSafe(x + 1, y) && a[x + 1][y] == false)

{

a[x][y]= true;

currX= x + 1;

currY=y;

a[currX][currY]= true;return true;

}

}else if (test(x, y) == 2)

{if (isSafe(x, y - 1) && a[x][y - 1] == false)

{

a[x][y]= true;

currX=x;

currY= y - 1;

a[currX][currY]= true;return true;

}else if (isSafe(x, y + 1) && a[x][y + 1] == false)

{

a[x][y]= true;

currX=x;

currY= y + 1;

a[currX][currY]= true;return true;

}

}return false;

}private void addWall(int x, inty)

{//TODO Auto-generated method stub

for (int i = 0; i < X_GO1.length; i++)

{if (isSafe(currX + X_GO1[i], currY +Y_GO1[i]))

{if (!set.contains(new Point(currX + X_GO1[i], currY +Y_GO1[i])))

{

set.add(new Point(currX + X_GO1[i], currY +Y_GO1[i]));

}

}

}

}private int test(int x, inty)

{if (x % 2 == 0)return 1;//竖线

else if (y % 2 == 0)return 2;//横线

else

return 0;//出错了

}private boolean isSafe(int x, inty)

{if (x <= 0 || x >= m || y <= 0 || y >= n || a[x][y] == true)

{return false;

}return true;

}

@Overridepublic boolean[][] getData(int m,intn)

{//TODO Auto-generated method stub

set = new ArrayList();

reset(m, n);returna;

}

}packagecom.zxl.maze;importjava.awt.Color;importjava.awt.Dimension;importjava.awt.Graphics;importjavax.swing.JPanel;public class MainPanel extendsJPanel

{int x = 0;int y = 0;boolean b[][]=null;publicMainPanel()

{this.setSize(400, 400);

}public void setMap(booleanb[][])

{this.b =b;

}

@OverridepublicDimension getPreferredSize()

{//TODO Auto-generated method stub

return new Dimension(400,400);

}public void paintMap(int x, inty)

{this.x =x;this.y =y;

repaint();

}

@Overridepublic voidpaintComponent(Graphics g)

{//TODO Auto-generated method stub

if (x == 0&&y==0)

{

g.clearRect(0, 0, this.getWidth(), this.getHeight());

}else{for(int i=0;i<=x;i++)for(int j=0;j<=y;j++)

{if (b[i][j] == true)

{

g.setColor(Color.blue);

g.fillRect(50 + i * 10, 50 + j* 10, 10, 10);

}else{

g.setColor(Color.red);

g.fillRect(50 + i * 10, 50 + j * 10, 10, 10);

}

}

}

}

}packagecom.zxl.maze;importjava.awt.BorderLayout;importjava.awt.Color;importjava.awt.Container;importjava.awt.Graphics;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JMenu;importjavax.swing.JMenuBar;importjavax.swing.JMenuItem;public class MainFrame extendsJFrame

{//JButton resetButton;

Container con;booleanb[][];

JMenu menu;

JMenuBar bar;

JMenuItem item;

MainPanel pan=newMainPanel();publicMainFrame()

{this.setSize(600,550);this.setDefaultCloseOperation(EXIT_ON_CLOSE);//resetButton=new JButton("重 绘");

con=this.getContentPane();

con.setLayout(newBorderLayout());//con.add(resetButton,BorderLayout.SOUTH);

menu=new JMenu("菜单");

item=new JMenuItem("绘制地图");

bar=newJMenuBar();

bar.add(menu);

menu.add(item);this.add(pan);this.setJMenuBar(bar);this.setVisible(true);//setMap();

item.addActionListener(newActionListener()

{

@Overridepublic voidactionPerformed(ActionEvent e)

{//TODO Auto-generated method stub

setMap();

Thread t=new Thread(newDrawHandler(pan));

t.start();

}

});

}private voidsetMap()

{//TODO Auto-generated method stub

this.requestFocus();

AbstractMap map=newDFSMap();

b=map.getData(20, 20);

pan.setMap(b);/*for(int i=0;i

{

for(int j=0;j

{

pan.paintMap(i, j);

try

{

Thread.sleep(10);

}catch(Exception ex)

{

ex.printStackTrace();

}

}

}*/}class DrawHandler implementsRunnable{privateMainPanel pan;publicDrawHandler(MainPanel pan){this.pan=pan;

}public voidrun(){for(int i=0;i

{for(int j=0;j

{

pan.paintMap(i, j);try{

Thread.sleep(10);

}catch(Exception ex)

{

ex.printStackTrace();

}

}

}

}

}

}packagecom.zxl.maze;public classTest

{public static voidmain(String []args)

{newMainFrame();

}

}packagecom.zxl.maze;importjava.util.Random;/**深度优先,生成迷宫*/

public class TreeMap extendsAbstractMap

{private int m = 0, n = 0;private booleana[][];private intcurrX, currY;private int[] X_GO1 = { -2, 2, 0, 0};private int[] Y_GO1 = { 0, 0, 2, -2};private int[] X_GO2 = { -1, 1, 0, 0};private int[] Y_GO2 = { 0, 0, 1, -1};

@Overridepublic boolean[][] getData(int m,int n)//得到数据

{//TODO Auto-generated method stub

reset(m,n);returna;

}

@Overridepublic void reset(int m, int n)//重置

{//TODO Auto-generated method stub

a = new boolean[2 * m + 1][2 * n + 1];this.m = 2 * m + 1;this.n = 2 * n + 1;for (int i = 0; i < this.m; i++)for (int j = 0; j < this.n; j++)

a[i][j]= false;

currX= 1;

currY= 1;

a[1][0] = true;

a[1][1] = true;

start();

}private boolean check()//判断是否全部走过。。。

{for (int i = 1; i < m; i += 2)

{for (int j = 1; j < n; j += 2)

{if (a[i][j] == false)return false;

}

}return true;

}private void forward()//后退一步

{inti, j;while (true)

{

i= (int) (Math.random() *m);

j= (int) (Math.random() *n);if (a[i][j] == true && i % 2 == 1 && j % 2 == 1)

{

currX=i;

currY=j;return;

}

}

}private void start()//具体操作

{while (!check())

{

go();

}

a[m- 2][n - 1] = true;

}private voidgo()

{int orders[] = getOrder(4);for (int i = 0; i < orders.length; i++)

{if (isSafe(currX + X_GO1[orders[i]], currY + Y_GO1[orders[i]]))//上

{

goNext(orders[i]);return;

}

}

forward();

}private void goNext(int i)//下一步

{//TODO Auto-generated method stub

a[currX + X_GO1[i]][currY + Y_GO1[i]] = true;

a[currX+ X_GO2[i]][currY + Y_GO2[i]] = true;

currX+=X_GO1[i];

currY+=Y_GO1[i];

}private int[] getOrder(int i)//产生随机序列

{//TODO Auto-generated method stub

int a[] = new int[i];

Random ran= newRandom();for (int j = 0; j < i; j++)

a[j]=j;for (int k = 0; k < i; k++)

{int r1 =ran.nextInt(i);int r2 =ran.nextInt(i);int b =a[r1];

a[r1]=a[r2];

a[r2]=b;

}returna;

}private boolean isSafe(int x, inty)

{if (x < 0 || x >= m || y < 0 || y >= n || a[x][y] == true)

{return false;

}return true;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java class list_详解Java 集合类 List 的那些坑

现在的一些高级编程语言都会提供各种开箱即用的数据结构的实现&#xff0c;像 Java 编程语言的集合框架中就提供了各种实现&#xff0c;集合类包含 Map 和 Collection 两个大类&#xff0c;其中 Collection 下面的 List 列表是我们经常使用的集合类之一&#xff0c;很多的业务代…

java 类加载 双亲委派_Java类加载器和双亲委派机制

前言之前详细介绍了Java类的整个加载过程(类加载机制详解)。虽然&#xff0c;篇幅较长&#xff0c;但是也不要被内容吓到了&#xff0c;其实每个阶段都可以用一句话来概括。1)加载&#xff1a;查找并加载类的二进制字节流数据。2)验证&#xff1a;保证被加载的类的正确性。3)准…

win10开发java_win10系统搭建Java开发环境的操作方法

很多小伙伴都遇到过对win10系统搭建Java开发环境进行设置的困惑吧&#xff0c;一些朋友看过网上对win10系统搭建Java开发环境设置的零散处理方法&#xff0c;并没有完完全全明白win10系统搭建Java开发环境的操作方法非常简单&#xff0c;只需要1、双击运行jdk-8u60-windows-x64…

java cms bootstrap_thinkcms: Java CMS系统,完善的后台功能,大气的前台页面. 使用springMVC,hibernate,bootstrap,amazeui....

#thinkcmsJava CMS系统&#xff0c;完善的后台功能&#xff0c;大气的前台页面主要技术springmvc-mvc控制层shiro-方便全面的安全控制框架hibernate-orm框架ehcache-缓存框架前端&#xff1a;jquery&#xff0c;bootstrap&#xff0c;amazeui拉完代码将maven相关包拉下来&#…

java方法不可覆盖_详解Java构造方法为什么不能覆盖,我的钻牛角尖病又犯了.......

一看Think in Java&#xff0c;遇到个程序classEgg2 {protected classYolk {publicYolk() {System.out.println("Egg2.Yolk()");}public voidf() {System.out.println("Egg2.Yolk.f()");}}private Yolk y newYolk();publicEgg2() {System.out.println(&qu…

有人去瑞幸咖啡java_瑞幸股价暴跌,门店竟然爆单了

本文首发于“全天候科技”作者姚心璐。欢迎下载“见闻VIP”&#xff0c;即时见证历史。昨晚至今&#xff0c;有人被瑞幸疯狂打了1.8折&#xff0c;有人疯狂用1.8折券买入瑞幸咖啡。是不是看上去很迷&#xff1f;这的确是冰火两重天一样的真实存在。4月2日&#xff0c;瑞幸自曝2…

我的世界java版做船_“不要在云了,船的合成用木铲?”我的世界:Java和基岩版的差异...

“不要在云了&#xff0c;你这个云玩家&#xff01;”不知道你没有没有因为某些原因被网友说成是MC的云玩家&#xff0c;我就听到过一个很冤枉的故事。一个已经玩了5年之久的基岩版玩家&#xff0c;被一个玩了一年Java版的玩家硬生生说成是一个云玩家&#xff0c;重点不是这&am…

java线程interu_Intel 10nm服务器U首曝:多线程性能提升118%

Intel 10nm Ice Lake已经应用在轻薄本平台上&#xff0c;当时频率先天不足&#xff0c;而且只能做到4核心&#xff0c;不得不同时祭出14nm Comet Lake予以辅助&#xff0c;而在游戏本、桌面上也不得不继续依赖14nm Comet Lake。根据路线图&#xff0c;服务器平台上Intel今年会先…

java面板换一个斜的圆形_java – 如何从底部设计圆形视图?

我想设计一个从底部是圆形的视图,请看图像I have try different way to design, Like XML, Programatically but I am not able to get any success. I use XML code it’s doing circle from bottom but when I use Any image or Banner slider as show in figure then it’s …

php反序列化漏洞 freebuf,最全的PHP反序列化漏洞的理解和应用

原创&#xff1a;f1r3K0php反序列化漏洞&#xff0c;又叫php对象注入漏洞&#xff0c;是一种常见的漏洞&#xff0c;在我们进行代码审计以及CTF中经常能够遇到。01学习前最好提前掌握的知识PHP类与对象(https://www.php.net/manual/zh/language.oop5.php)PHP魔术方法(https://s…

php按数字分页类,PHP简单实现数字分页功能示例

本文实例讲述了PHP简单实现数字分页功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;header ( Content-Type: text/html; charsetutf-8 );//分页$page$_GET[page];$allcount 100;$page_size 10;$page_show 5;$page_count ceil($allcount/$page_size);if($page <…

php 瀑布流布局,CSS3实现瀑布流布局的方法

这次给大家带来CSS3实现瀑布流布局的方法&#xff0c;CSS3实现瀑布流布局的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。以前使用瀑布流都要用js&#xff0c;现在有了css3&#xff0c;可以轻松实现了。掌握点&#xff1a;1、column-count 把p中的文本…

php 文章列表,ThinkPHP初学者:主页,获取一个文章列表

在之前的文章&#xff0c;已经实现了注册登录的功能&#xff0c;主要熟悉TP与HTML、JS交互&#xff0c;数据库的基本操作等。接下来就要登录到主页&#xff0c;熟悉一下列表的处理&#xff0c;以及数据库多表联查操作。为了简化模型&#xff0c;列表的字段仅有文章标题、简介、…

php js登录,php+js实现单点登录

phpjs实现单点登录2020年08月14日 00:45:23阅读数&#xff1a;110登录信息表DROP TABLE IF EXISTS fly_admin_login_info;CREATE TABLE fly_admin_login_info (id int(11) unsigned NOT NULL AUTO_INCREMENT,admin_id int(11) unsigned DEFAULT NULL,email varchar(80) DEFAULT…

android jni java调用c,Android与JNI(一) ---- Java调用C 静态调用

第一、通过eclipse新建一个工程名为HelloJni的android工程&#xff0c;并编译。第二、右键工程-->Android Tools --> Add Native Support,出现如下界面&#xff0c;名字默认就可以了&#xff0c;点击finish。第三、我们在MainActivity类中加入要调用的native代码public n…

c语言程序综合实习学生成绩,C语言程序设计综合实习报告

课题一&#xff1a;用指针优化学生成绩排名一、目的1&#xff0e;熟悉变量的指针和指向变量的的指针变量的概念和使用2&#xff0e;熟悉数组的指针和指向数组的的指针变量的概念和使用3. 掌握冒泡法或选择法排序的算法4. 掌握函数的定义、调用、声明&#xff0c;以及参数的两种…

c语言求最多啤酒数,C语言,算法、动态规划:有一个箱子的容量为v(正整数,0=v=20000),同时有n个物品(0n=30),...

满意答案24k纯真爱l2013.11.07采纳率&#xff1a;42% 等级&#xff1a;12已帮助&#xff1a;9552人#include#define N 30int xiangzi(int n ,int V ,int a[]) //楼主后面的Vo数组必须放进递归函数里面或定义成全局数组 另外h[n]什么情况??{int minv,t,mV;if(n0){if(a[n]&l…

c语言休眠函数useconds类型,带你了解C语言中的Sleep函数(附代码)

Sleep函数:功 能: 执行挂起一段时间用 法:unsigned sleep(unsigned seconds);注意:在VC中使用带上头文件#include ,在Linux下,gcc编译器中&#xff0c;使用的头文件因gcc版本的不同而不同#include 在VC中,Sleep中的第一个英文字符为大写的"S" ,在linux下不要大写&…

android 环绕布局,Android自定义View实现圆形环绕效果

之前项目中需要实现一个四周环绕中心圆形头像的效果&#xff0c;感觉还是自定义比较方便&#xff0c;于是就自己封装了一个控件去实现。先贴张图显示最终效果。首先自定义一个View继承自LinearLayout,通过动态添加childView的方式将子控件添加到View中。思路是先添加中间圆形头…

android 高德地图 sh1,百度、高德地图获取发布版(Release)SHA1

一、简介&#xff1a;在百度、高德地图开发中&#xff0c;申请key的时候&#xff0c;要两个版本的sha1值。一个是开发版(debug)&#xff0c;一个是发布版(release)。debug版本的sha1比较好获取&#xff0c;网上资料一堆&#xff0c;这里引用一下&#xff0c;就不再重复写了。最…