资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

java迷宫源代码 迷宫求解代码

用java语言控制小机器人走迷宫的算法?

我昨天刚写了个走迷宫的界面(一个初始小球,一个目标小球,随机在界面种生成障碍(迷宫图),然后初始小球移动到目标小球那),不知道是否跟你的想法一样。用的是回溯法(目前我只知道这个算法走迷宫),你可以查下。PS:我电脑没联网不能把代码给你…QQ254774042。

梧州ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!

关于Java走迷宫的问题。我已经有相关代码了,但是我看不懂。麻烦高手帮忙注释一下,然后再修改点儿。

package 走迷宫;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.ArrayList;

import java.util.LinkedList;

import java.util.List;

import java.util.TimerTask;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

// 迷宫

public class Maze extends JFrame implements ActionListener {

private JPanel panel;

private JPanel northPanel;

private JPanel centerPanel;

private MazeGrid grid[][];

private JButton restart;

private JButton dostart;

private int rows;// rows 和cols目前暂定只能是奇数

private int cols;

private ListString willVisit;

private ListString visited;

private LinkedListString comed;

private long startTime;

private long endTime;

public Maze() {

rows = 25;

cols = 25;

willVisit = new ArrayListString();

visited = new ArrayListString();

comed = new LinkedListString();

init();

this.setTitle("回溯法--走迷宫");

this.add(panel);

this.pack();

this.setVisible(true);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public void init() {

panel = new JPanel();

northPanel = new JPanel();

centerPanel = new JPanel();

panel.setLayout(new BorderLayout());

restart = new JButton("重新生成迷宫");

dostart = new JButton("开始走迷宫");

grid = new MazeGrid[rows][cols];

centerPanel.setLayout(new GridLayout(rows, cols, 1, 1));

centerPanel.setBackground(new Color(0, 0, 0));

northPanel.add(restart);

northPanel.add(dostart);

dostart.addActionListener(this);

restart.addActionListener(this);

for (int i = 0; i grid.length; i++)

for (int j = 0; j grid[i].length; j++) {

if (j % 2 == 0 i % 2 == 0)

grid[i][j] = new MazeGrid(true, 20, 20);

else

grid[i][j] = new MazeGrid(false, 20, 20);

}

grid[0][0].setVisited(true);

grid[0][0].setPersonCome(true);

grid[0][0].setStart(true);

visited.add("0#0");

grid[rows - 1][cols - 1].setEnd(true);

grid = createMap(grid, 0, 0);

for (int i = 0; i grid.length; i++)

for (int j = 0; j grid[i].length; j++) {

grid[i][j].repaint();

centerPanel.add(grid[i][j]);

}

panel.add(northPanel, BorderLayout.NORTH);

panel.add(centerPanel, BorderLayout.CENTER);

}

/**

* 生成迷宫

*

* @param mazeGrid

* @param x

* @param y

* @return

*/

public MazeGrid[][] createMap(MazeGrid mazeGrid[][], int x, int y) {

int visitX = 0;

int visitY = 0;

if (x - 2 = 0) {

if (!mazeGrid[x - 2][y].isVisited()) {

willVisit.add((x - 2) + "#" + y);

}

}

if (x + 2 cols) {

if (!mazeGrid[x + 2][y].isVisited()) {

willVisit.add((x + 2) + "#" + y);

}

}

if (y - 2 = 0) {

if (!mazeGrid[x][y - 2].isVisited()) {

willVisit.add(x + "#" + (y - 2));

}

}

if (y + 2 rows) {

if (!mazeGrid[x][y + 2].isVisited()) {

willVisit.add(x + "#" + (y + 2));

}

}

if (!willVisit.isEmpty()) {

int visit = (int) (Math.random() * willVisit.size());

String id = willVisit.get(visit);

visitX = Integer.parseInt(id.split("#")[0]);

visitY = Integer.parseInt(id.split("#")[1]);

mazeGrid[(visitX + x) / 2][(visitY + y) / 2].setMark(true);

mazeGrid[visitX][visitY].setVisited(true);

if (!visited.contains(id)) {// 将这个点加到已访问中去

visited.add(id);

}

willVisit.clear();

createMap(mazeGrid, visitX, visitY);

} else {

if (!visited.isEmpty()) {

String id = visited.remove(visited.size() - 1);// 取出最后一个元素

visitX = Integer.parseInt(id.split("#")[0]);

visitY = Integer.parseInt(id.split("#")[1]);

mazeGrid[visitX][visitY].setVisited(true);

createMap(mazeGrid, visitX, visitY);

}

}

return mazeGrid;

}

/**

* 走迷宫

*

* @param mazeGrid

* @param x

* @param y

*/

public String goMaze(MazeGrid mazeGrid[][], int x, int y) {

int comeX = 0;

int comeY = 0;

// left

if (x - 1 = 0) {

if (mazeGrid[x - 1][y].isMark()) {

if (!comed.contains((x - 1) + "#" + y))

willVisit.add((x - 1) + "#" + y);

}

}

// right

if (x + 1 cols) {

if (mazeGrid[x + 1][y].isMark()) {

if (!comed.contains((x + 1) + "#" + y))

willVisit.add((x + 1) + "#" + y);

}

}

// up

if (y - 1 = 0) {

if (mazeGrid[x][y - 1].isMark()) {

if (!comed.contains(x + "#" + (y - 1)))

willVisit.add(x + "#" + (y - 1));

}

}

// down

if (y + 1 rows) {

if (mazeGrid[x][y + 1].isMark()) {

if (!comed.contains(x + "#" + (y + 1)))

willVisit.add(x + "#" + (y + 1));

}

}

if (!willVisit.isEmpty()) {

int visit = (int) (Math.random() * willVisit.size());

String id = willVisit.get(visit);

comeX = Integer.parseInt(id.split("#")[0]);

comeY = Integer.parseInt(id.split("#")[1]);

mazeGrid[x][y].setPersonCome(false);

mazeGrid[comeX][comeY].setPersonCome(true);

mazeGrid[x][y].repaint();

mazeGrid[comeX][comeY].repaint();

willVisit.clear();

comed.add(x + "#" + y);

} else {

if (!comed.isEmpty()) {

String id = comed.removeLast();

comeX = Integer.parseInt(id.split("#")[0]);

comeY = Integer.parseInt(id.split("#")[1]);

mazeGrid[x][y].setPersonCome(false);

mazeGrid[comeX][comeY].setPersonCome(true);

mazeGrid[x][y].repaint();

mazeGrid[comeX][comeY].repaint();

comed.addFirst(x + "#" + y);

}

}

return comeX + "#" + comeY;

}

int comeX = 0;

int comeY = 0;

public void actionPerformed(ActionEvent e) {

if (e.getActionCommand().equals("重新生成迷宫")) {

refreshMap(grid);

} else if (e.getActionCommand().equals("开始走迷宫")) {

startTime = System.currentTimeMillis();

dostart.setVisible(false);

restart.setText("禁止刷新");

int delay = 1000;

int period = 500;// 循环间隔

java.util.Timer timer = new java.util.Timer();

timer.scheduleAtFixedRate(new TimerTask() {

public void run() {

if (grid[rows - 1][cols - 1].isPersonCome()) {

endTime = System.currentTimeMillis();

JOptionPane.showMessageDialog(null, "已经走出迷宫,耗时"

+ (endTime - startTime) / 1000 + "秒", "消息提示",

JOptionPane.ERROR_MESSAGE);

this.cancel();

restart.setText("重新生成迷宫");

} else {

String id = goMaze(grid, comeX, comeY);

comeX = Integer.parseInt(id.split("#")[0]);

comeY = Integer.parseInt(id.split("#")[1]);

}

}

}, delay, period);

}

}

/**

* 刷新地图

*/

public void refreshMap(MazeGrid mazeGrid[][]) {

comeX = 0;

comeY = 0;

willVisit.clear();

visited.clear();

comed.clear();

this.remove(panel);

init();

this.add(panel);

this.pack();

this.setVisible(true);

}

public static void main(String args[]) {

long start = System.currentTimeMillis();

new Maze();

long end = System.currentTimeMillis();

System.out.println("使用ArrayList生成迷宫耗时:" + (end - start) + "毫秒");

}

}

请帮忙用数据结构(java版)的知识解决这道迷宫问题的程序代码。

我这是用c写的。你可以看看,希望能帮助到你。

#include"stdlib.h"

#include"stdio.h"

#define N 50

#define M 50

int X;

int maze[N+2][M+2];

struct point{

int row,col,predecessor;

}queue[512];

int head=0,tail=0;

void shoudong_maze(int m,int n){

int i,j;

printf("\n\n");

printf("请按行输入迷宫,0表示通路,1表示障碍:\n\n");

for(i=0;im;i++)

for(j=0;jn;j++)

scanf("%d",maze[i][j]);

}

void zidong_maze(int m,int n){

int i,j;

printf("\n迷宫生成中……\n\n");

system("pause");

for(i=0;im;i++)

for(j=0;jn;j++)

maze[i][j]=rand()%2;

//由于rand()产生的随机数是从0到RAND_MAX

//RAND_MAX是定义在stdlib.h中的,其值至少为32767)

//要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X;

}

void print_maze(int m,int n){

int i,j;

printf("\n迷宫生成结果如下:\n\n");

printf("迷宫入口\n");

printf("↓");

for(i=0;im;i++)

{printf("\n");

for(j=0;jn;j++)

{if(maze[i][j]==0) printf("□");

if(maze[i][j]==1) printf("■");}

}

printf("→迷宫出口\n");

}

void result_maze(int m,int n)

{ int i,j;

printf("迷宫通路(用☆表示)如下所示:\n\t");

for(i=0;im;i++)

{ printf("\n");

for(j=0;jn;j++)

{if(maze[i][j]==0||maze[i][j]==2) printf("□");

if(maze[i][j]==1) printf("■");

if(maze[i][j]==3) printf("☆");

}

}

}

void enqueue(struct point p)

{ queue[tail]=p;

tail++;

}

struct point dequeue()

{ head++;

return queue[head-1];

}

int is_empty()

{ return head==tail;

}

void visit(int row,int col,int maze[52][52])

{ struct point visit_point={row,col,head-1};

maze[row][col]=2;

enqueue(visit_point);

}

int mgpath(int maze[52][52],int m,int n)

{ X=1;

struct point p={0,0,-1};

if(maze[p.row][p.col]==1)

{ printf("\n===============================================\n");

printf("此迷宫无解\n\n");X=0;return 0;}

maze[p.row][p.col]=2;

enqueue(p);

while(!is_empty())

{p=dequeue();

if((p.row==m-1)(p.col==n-1)) break;

if((p.col+1n)(maze[p.row][p.col+1]==0)) visit(p.row,p.col+1,maze);

if((p.row+1m)(maze[p.row+1][p.col]==0)) visit(p.row+1,p.col,maze);

if((p.col-1=0)(maze[p.row][p.col-1]==0)) visit(p.row,p.col-1,maze);

if((p.row-1=0)(maze[p.row-1][p.col]==0)) visit(p.row-1,p.col,maze);

}

if(p.row==m-1p.col==n-1)

{printf("\n==================================================================\n");

printf("迷宫路径为:\n");

printf("(%d,%d)\n",p.row,p.col);

maze[p.row][p.col]=3;

while(p.predecessor!=-1)

{p=queue[p.predecessor];

printf("(%d,%d)\n",p.row,p.col);

maze[p.row][p.col]=3;

}

}

else {printf("\n=============================================================\n");

printf("此迷宫无解!\n\n");X=0;}

return 0;

}

int main()

{int i,m,n,cycle=0;

while(cycle!=(-1))

{

printf("********************************************************************************\n");

printf(" ☆欢迎进入迷宫求解系统☆\n");

printf(" 设计者:尹旭 林静波(信息2班)\n");

printf("********************************************************************************\n");

printf(" 手动生成迷宫 请按:1\n");

printf(" 自动生成迷宫 请按:2\n");

printf(" 退出 请按:3\n\n");

printf("********************************************************************************\n");

printf("\n");

printf("请选择你的操作:\n");

scanf("%d",i);

switch(i)

{case 1:printf("\n请输入行数:");

scanf("%d",m);

printf("\n");

printf("请输入列数:");

scanf("%d",n);

while((m=0||m50)||(n=0||n50))

{ printf("\n抱歉,你输入的行列数超出预设范围(0-50,0-50),请重新输入:\n\n");

printf("请输入行数:");

scanf("%d",m);

printf("\n");

printf("请输入列数:");

scanf("%d",n);

}

shoudong_maze(m,n);

print_maze(m,n);

mgpath(maze,m,n);

if(X!=0)

result_maze(m,n);

printf("\n\nPress Enter Contiue!\n");

getchar();

while(getchar()!='\n');

break;

case 2:printf("\n请输入行数:");

scanf("%d",m);

printf("\n");

printf("请输入列数:");

scanf("%d",n);

while((m=0||m50)||(n=0||n50))

{printf("\n抱歉,你输入的行列数超出预设范围(0-50,0-50),请重新输入:\n\n");

printf("请输入行数:");

scanf("%d",m);

printf("\n");

printf("请输入列数:");

scanf("%d",n);

}

zidong_maze(m,n);

print_maze(m,n);

mgpath(maze,m,n);

if(X!=0)

result_maze(m,n);

printf("\n\nPress Enter Contiue!\n");getchar();while(getchar()!='\n');break;

case 3:cycle=(-1);

break;

default:printf("\n");

printf("你的输入有误!\n");

printf("\nPress Enter Contiue!\n");

getchar();

while(getchar()!='\n');break;

}

}

}


本文名称:java迷宫源代码 迷宫求解代码
文章出自:http://cdkjz.cn/article/hgjhdd.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220