实验要求:

1、迷宫随机生成

2、玩家走迷宫,留下足迹;

3、系统用A*算法寻路,输出路径

解决问题:

1、如何显示迷宫的图形界面;

2、如何生成随机的迷宫;
3、怎样移动游戏中走迷宫的“玩家”;

4、用A*算法求解迷宫;

生成随机迷宫的方法:

  1. 深度优先遍历:利用深度遍历的思想。访问到一个节点时,搜索这个节点没有被访问过的相邻节点,选择一个继续做同样的操作,直到没有邻节点为止再回溯到上一个访问的节点,并选择另外的邻节点。这种方案生成的迷宫会有一条明显的主路,这条主路特别长,贯穿大部分区域的路线,同时,迷宫的路线一般比较扭曲。这种采用深度优先算法(递归回溯算法)生成的迷宫称之为“主路扭曲型”迷宫。

  2. 普利姆算法:把图中预置的通路节点分成两个集合,已经在通路里的属于U,未添加到通路里的属于V-U,通过这样的添加节点策略,把节点间的蓝色0当成最小生成树的边,依次添加到TE里,直到所有节点都添加到U里,这样,在任意两个节点间就形成了一个通路。prim算法形成的主路相对于深度优先算法,比较自然,但迷宫的分岔比较多,所以迷宫会更复杂,玩家需要做的选择次数可能会比较多。

  • 这里我选择的是普利姆算法, 根据这个算法的思想,大致的过程是:

  • 1.生成一个基础地图。格子先用黄色1和灰色0来表示。

  • 2.随机取一个地图边缘的黄色1,把它标记为红色1.即 变成通路。然后把它旁边的灰色0标记成为蓝色0,表示“待定”。

3.随机选择一个蓝色0,然后看红色1隔着这个蓝色0对面的格子,是否是黄色的1,

1)如果是,则把对面的黄色1标记成红色1,即变成通路,然后把蓝色0变成红色的,即也变成通路;

2)如果不是,就把这个蓝色的0变成灰色的;

4.继续为红色通路集合寻找待定的蓝色0,然后随机选择一个蓝色0,然后看红色1隔着这个蓝色0对面的格子,是否是黄色的1,

1)如果是,则把对面的黄色1标记成红色1,即变成通路,然后把蓝色0变成红色的,即也变成通路;

2)如果不是,就把这个蓝色的0变成灰色的;

如果随机选的蓝色的0隔着红色1对面的不是黄色1,说明这不是一条通路,就把这个蓝色的0变成灰色0,变成确定的障碍物;接下来就继续随机找另一个蓝色的0;即不停地重复上面的步骤3,直到整个地图都没有蓝色0了,地图就生成完毕。大致就是这么一个思路。

我们就先把迷宫生成吧。

主方法类:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;public class Maze {public static JFrame jFrame1 = new JFrame("迷宫");public static JFrame jFrame2 = new JFrame("迷宫");public static JFrame jFrame3 = new JFrame("迷宫3");public static JPanel jPanel1 = new JPanel();public static void main(String[] args) {jFrame1.setBounds(450, 100, 1000, 1000);jFrame1.setResizable(true);jFrame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame2.setBounds(450, 100, 1000, 900);jFrame2.setResizable(true);jFrame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame3.setBounds(200, 200, 1100, 1100);jFrame3.setResizable(true);jFrame3.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JLabel jLabel1 = new JLabel("难度选择");JButton jButton1 = new JButton("简单");JButton jButton2 = new JButton("中等");JButton jButton3 = new JButton("困难");jPanel1.setLayout(null);jPanel1.add(jLabel1);jPanel1.add(jButton1);jPanel1.add(jButton2);jPanel1.add(jButton3);jLabel1.setFont(new Font("微软雅黑", Font.BOLD + Font.ITALIC, 40));jLabel1.setBounds(420, 200, 700, 50);jButton1.setBounds(450, 400, 100, 50);jButton2.setBounds(450, 500, 100, 50);jButton3.setBounds(450, 600, 100, 50);jFrame1.add(jPanel1);jButton1.addMouseListener(new MouseListener() {@Overridepublic void mouseClicked(MouseEvent e) {jFrame1.dispose();jFrame2.add(new Build1());jFrame2.setVisible(true);}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}});jButton2.addMouseListener(new MouseListener() {@Overridepublic void mouseClicked(MouseEvent e) {}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}});jFrame1.setVisible(true);}
}

这样就有了一个界面的基本框架。

接着做普利姆算法的第一步,

难度一的地图类:(第一步)

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.*;
import java.util.List;public class Build1 extends JPanel implements KeyListener, ActionListener {int[] stardustX = new int[600];int[] stardustY = new int[500];int[] mazeX = new int[600];int[] mazeY = new int[500];String forward;//方格的宽度和长度int BLOCK_WIDTH = 70;int BLOCK_HEIGHT = 70;Random random = new Random();HashMap<String, String> hashMap1 = new HashMap<String, String>();HashMap<String, String> hashMap2 = new HashMap<String, String>();List<String> arraylist =new ArrayList<String>();public Build1() {for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {hashMap1.put(String.valueOf(i) + "," + String.valueOf(j), "灰色0");}}for (int i = 1; i < 11; i = i + 2) {for (int j = 1; j < 11; j = j + 2) {hashMap1.replace(String.valueOf(i) + "," + String.valueOf(j), "黄色1");}}int x = 2 * random.nextInt(5) + 1;int y;if (x == 1 || x == 9) {y = 2 * random.nextInt(5) + 1;} else {y = random.nextInt(2);if (y == 0) {y = 1;} else {y = 9;}}hashMap1.replace(String.valueOf(x) + "," + String.valueOf(y), "红色1");if (x + 1 != 10) {hashMap1.replace(String.valueOf(x + 1) + "," + String.valueOf(y), "蓝色0");arraylist.add(String.valueOf(x + 1) + "," + String.valueOf(y));}if (x - 1 != 0) {hashMap1.replace(String.valueOf(x - 1) + "," + String.valueOf(y), "蓝色0");arraylist.add(String.valueOf(x + 1) + "," + String.valueOf(y));}if (y + 1 != 10) {hashMap1.replace(String.valueOf(x) + "," + String.valueOf(y + 1), "蓝色0");arraylist.add(String.valueOf(x + 1) + "," + String.valueOf(y));}if (y - 1 != 0) {hashMap1.replace(String.valueOf(x) + "," + String.valueOf(y - 1), "蓝色0");arraylist.add(String.valueOf(x + 1) + "," + String.valueOf(y));}inti();this.setFocusable(true);this.addKeyListener(this);this.setSize(12 * BLOCK_HEIGHT, 12 * BLOCK_WIDTH);//界面的方格的行数和列数this.setLocation(0, 0);}public void inti() {}@Overrideprotected void paintComponent(Graphics Picture) {super.paintComponent(Picture);this.setBackground(Color.black);Picture.setColor(Color.white);for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (hashMap1.get(String.valueOf(i) + "," + String.valueOf(j)).equals("红色1")) {Picture.setColor(Color.red);Picture.fillRect(i * 70, j * 70, 70, 70);}if (hashMap1.get(String.valueOf(i) + "," + String.valueOf(j)).equals("黄色1")) {Picture.setColor(Color.yellow);Picture.fillRect(i * 70, j * 70, 70, 70);}if (hashMap1.get(String.valueOf(i) + "," + String.valueOf(j)).equals("灰色0")) {Picture.setColor(Color.gray);Picture.fillRect(i * 70, j * 70, 70, 70);}if (hashMap1.get(String.valueOf(i) + "," + String.valueOf(j)).equals("蓝色0")) {Picture.setColor(Color.blue);Picture.fillRect(i * 70, j * 70, 70, 70);}}}Picture.setColor(Color.white);for (int i = 0; i < 12; i++) {Picture.drawLine(0, i * BLOCK_HEIGHT, 12 * BLOCK_WIDTH, i * BLOCK_HEIGHT);}for (int i = 0; i < 12; i++) {Picture.drawLine(i * BLOCK_WIDTH, 0, i * BLOCK_WIDTH, 12 * BLOCK_HEIGHT);}Picture.setColor(Color.black);Picture.fillRect(771, 0, 900, 900);Picture.fillRect(0, 771, 900, 900);}@Overridepublic void actionPerformed(ActionEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {}@Overridepublic void keyReleased(KeyEvent e) {}
}

难度一的地图类:(第二步)由第一步做了一些计算的更新

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.*;
import java.util.List;public class Build1 extends JPanel implements KeyListener, ActionListener {int[] stardustX = new int[600];int[] stardustY = new int[500];int[] mazeX = new int[600];int[] mazeY = new int[500];int fx;int fy;String forward;//方格的宽度和长度int BLOCK_WIDTH = 70;int BLOCK_HEIGHT = 70;Random random = new Random();HashMap<String, String> hashMap1 = new HashMap<String, String>();HashMap<String, String> hashMap2 = new HashMap<String, String>();List<String> arraylist = new ArrayList<String>();public Build1() {for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {hashMap1.put(String.valueOf(i) + "," + String.valueOf(j), "灰色0");}}for (int i = 1; i < 11; i = i + 2) {for (int j = 1; j < 11; j = j + 2) {hashMap1.replace(String.valueOf(i) + "," + String.valueOf(j), "黄色1");}}fx = 2 * random.nextInt(5) + 1;if (fx == 1 || fx == 9) {fy = 2 * random.nextInt(5) + 1;} else {fy = random.nextInt(2);if (fy == 0) {fy = 1;} else {fy = 9;}}hashMap1.replace(String.valueOf(fx) + "," + String.valueOf(fy), "红色1");if (fx + 1 != 10) {hashMap1.replace(String.valueOf(fx + 1) + "," + String.valueOf(fy), "蓝色0");arraylist.add(String.valueOf(fx + 1) + "," + String.valueOf(fy));}if (fx - 1 != 0) {hashMap1.replace(String.valueOf(fx - 1) + "," + String.valueOf(fy), "蓝色0");arraylist.add(String.valueOf(fx + 1) + "," + String.valueOf(fy));}if (fy + 1 != 10) {hashMap1.replace(String.valueOf(fx) + "," + String.valueOf(fy + 1), "蓝色0");arraylist.add(String.valueOf(fx + 1) + "," + String.valueOf(fy));}if (fy - 1 != 0) {hashMap1.replace(String.valueOf(fx) + "," + String.valueOf(fy - 1), "蓝色0");arraylist.add(String.valueOf(fx + 1) + "," + String.valueOf(fy));}inti();this.setFocusable(true);this.addKeyListener(this);this.setSize(12 * BLOCK_HEIGHT, 12 * BLOCK_WIDTH);//界面的方格的行数和列数this.setLocation(0, 0);}public void inti() {int x = 0;int y = 0;String str1 = "";String str2 = "";int num1 = random.nextInt(arraylist.size());int num2 = 0;System.out.println(arraylist.size());System.out.println(arraylist.get(num1));for (int i = 0; i < arraylist.get(num1).length(); i++) {if (arraylist.get(num1).charAt(i) == ',') {num2++;break;} else {str1 = str1 + arraylist.get(num1).charAt(i);num2++;}}for (int i = 0; i < str1.length(); i++) {x += (str1.charAt(i) - '0') * Math.pow(10, str1.length() - i - 1);}for (int i = num2; i < arraylist.get(num1).length(); i++) {str2 = str2 + arraylist.get(num1).charAt(i);}for (int i = 0; i < str2.length(); i++) {y += (str2.charAt(i) - '0') * Math.pow(10, str2.length() - i - 1);}arraylist.remove(num1);System.out.println(x);System.out.println(y);if (hashMap1.getOrDefault(String.valueOf(x + 1) + "," + String.valueOf(y),"").equals("红色1")) {if (hashMap1.getOrDefault(String.valueOf(x - 1) + "," + String.valueOf(y),"").equals("黄色1")) {hashMap1.replace(String.valueOf(x - 1) + "," + String.valueOf(y), "红色1");fx = x - 1;fy = y;if (fx + 1 != 10) {hashMap1.replace(String.valueOf(fx + 1) + "," + String.valueOf(fy), "蓝色0");arraylist.add(String.valueOf(fx + 1) + "," + String.valueOf(fy));}if (fx - 1 != 0) {hashMap1.replace(String.valueOf(fx - 1) + "," + String.valueOf(fy), "蓝色0");arraylist.add(String.valueOf(fx - 1) + "," + String.valueOf(fy));}if (fy + 1 != 10) {hashMap1.replace(String.valueOf(fx) + "," + String.valueOf(fy + 1), "蓝色0");arraylist.add(String.valueOf(fx ) + "," + String.valueOf(fy+1));}if (fy - 1 != 0) {hashMap1.replace(String.valueOf(fx) + "," + String.valueOf(fy - 1), "蓝色0");arraylist.add(String.valueOf(fx ) + "," + String.valueOf(fy-1));}hashMap1.replace(String.valueOf(x) + "," + String.valueOf(y), "红色0");} else {hashMap1.get(String.valueOf(x) + "," + String.valueOf(y)).equals("灰色0");}} else if (hashMap1.getOrDefault(String.valueOf(x - 1) + "," + String.valueOf(y),"").equals("红色1")) {if (hashMap1.getOrDefault(String.valueOf(x + 1) + "," + String.valueOf(y),"").equals("黄色1")) {hashMap1.replace(String.valueOf(x + 1) + "," + String.valueOf(y), "红色1");fx = x + 1;fy = y;if (fx + 1 != 10) {hashMap1.replace(String.valueOf(fx + 1) + "," + String.valueOf(fy), "蓝色0");arraylist.add(String.valueOf(fx + 1) + "," + String.valueOf(fy));}if (fx - 1 != 0) {hashMap1.replace(String.valueOf(fx - 1) + "," + String.valueOf(fy), "蓝色0");arraylist.add(String.valueOf(fx - 1) + "," + String.valueOf(fy));}if (fy + 1 != 10) {hashMap1.replace(String.valueOf(fx) + "," + String.valueOf(fy + 1), "蓝色0");arraylist.add(String.valueOf(fx) + "," + String.valueOf(fy+1));}if (fy - 1 != 0) {hashMap1.replace(String.valueOf(fx) + "," + String.valueOf(fy - 1), "蓝色0");arraylist.add(String.valueOf(fx) + "," + String.valueOf(fy-1));}hashMap1.replace(String.valueOf(x) + "," + String.valueOf(y), "红色0");} else {hashMap1.get(String.valueOf(x) + "," + String.valueOf(y)).equals("灰色0");}} else if (hashMap1.getOrDefault(String.valueOf(x) + "," + String.valueOf(y + 1),"").equals("红色1")) {if (hashMap1.getOrDefault(String.valueOf(x) + "," + String.valueOf(y - 1),"").equals("黄色1")) {hashMap1.replace(String.valueOf(x) + "," + String.valueOf(y - 1), "红色1");fx = x;fy = y - 1;if (fx + 1 != 10) {hashMap1.replace(String.valueOf(fx + 1) + "," + String.valueOf(fy), "蓝色0");arraylist.add(String.valueOf(fx + 1) + "," + String.valueOf(fy));}if (fx - 1 != 0) {hashMap1.replace(String.valueOf(fx - 1) + "," + String.valueOf(fy), "蓝色0");arraylist.add(String.valueOf(fx - 1) + "," + String.valueOf(fy));}if (fy + 1 != 10) {hashMap1.replace(String.valueOf(fx) + "," + String.valueOf(fy + 1), "蓝色0");arraylist.add(String.valueOf(fx ) + "," + String.valueOf(fy+1));}if (fy - 1 != 0) {hashMap1.replace(String.valueOf(fx) + "," + String.valueOf(fy - 1), "蓝色0");arraylist.add(String.valueOf(fx ) + "," + String.valueOf(fy-1));}hashMap1.replace(String.valueOf(x) + "," + String.valueOf(y), "红色0");} else {hashMap1.get(String.valueOf(x) + "," + String.valueOf(y)).equals("灰色0");}} else if (hashMap1.getOrDefault(String.valueOf(x) + "," + String.valueOf(y - 1),"").equals("红色1")) {if (hashMap1.getOrDefault(String.valueOf(x) + "," + String.valueOf(y + 1),"").equals("黄色1")) {hashMap1.replace(String.valueOf(x) + "," + String.valueOf(y + 1), "红色1");fx = x;fy = y + 1;if (fx + 1 != 10) {hashMap1.replace(String.valueOf(fx + 1) + "," + String.valueOf(fy), "蓝色0");arraylist.add(String.valueOf(fx + 1) + "," + String.valueOf(fy));}if (fx - 1 != 0) {hashMap1.replace(String.valueOf(fx - 1) + "," + String.valueOf(fy), "蓝色0");arraylist.add(String.valueOf(fx - 1) + "," + String.valueOf(fy));}if (fy + 1 != 10) {hashMap1.replace(String.valueOf(fx) + "," + String.valueOf(fy + 1), "蓝色0");arraylist.add(String.valueOf(fx ) + "," + String.valueOf(fy+1));}if (fy - 1 != 0) {hashMap1.replace(String.valueOf(fx) + "," + String.valueOf(fy - 1), "蓝色0");arraylist.add(String.valueOf(fx) + "," + String.valueOf(fy-1));}hashMap1.replace(String.valueOf(x) + "," + String.valueOf(y), "红色0");}} else {hashMap1.get(String.valueOf(x) + "," + String.valueOf(y)).equals("灰色0");}while (!arraylist.isEmpty()){inti();}}@Overrideprotected void paintComponent(Graphics Picture) {super.paintComponent(Picture);this.setBackground(Color.black);Picture.setColor(Color.white);for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (hashMap1.get(String.valueOf(i) + "," + String.valueOf(j)).equals("红色1") || hashMap1.get(String.valueOf(i) + "," + String.valueOf(j)).equals("红色0")) {Picture.setColor(Color.red);Picture.fillRect(i * 70, j * 70, 70, 70);}if (hashMap1.get(String.valueOf(i) + "," + String.valueOf(j)).equals("黄色1")) {Picture.setColor(Color.yellow);Picture.fillRect(i * 70, j * 70, 70, 70);}if (hashMap1.get(String.valueOf(i) + "," + String.valueOf(j)).equals("灰色0")) {Picture.setColor(Color.gray);Picture.fillRect(i * 70, j * 70, 70, 70);}if (hashMap1.get(String.valueOf(i) + "," + String.valueOf(j)).equals("蓝色0")) {Picture.setColor(Color.blue);Picture.fillRect(i * 70, j * 70, 70, 70);}}}Picture.setColor(Color.white);for (int i = 0; i < 12; i++) {Picture.drawLine(0, i * BLOCK_HEIGHT, 12 * BLOCK_WIDTH, i * BLOCK_HEIGHT);}for (int i = 0; i < 12; i++) {Picture.drawLine(i * BLOCK_WIDTH, 0, i * BLOCK_WIDTH, 12 * BLOCK_HEIGHT);}Picture.setColor(Color.black);Picture.fillRect(771, 0, 900, 900);Picture.fillRect(0, 771, 900, 900);}@Overridepublic void actionPerformed(ActionEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {}@Overridepublic void keyReleased(KeyEvent e) {}
}

可以看到基本算是形成了一个迷宫。把蓝色部分涂成灰色之后..

接下来就是做动作监听和键盘监听、按钮监听之类的事了。

以下是最终修改版本:

(主方法类)Maze:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;public class Maze {public static JFrame jFrame1 = new JFrame("主菜单");public static JFrame jFrame2 = new JFrame("简单迷宫");public static JFrame jFrame3 = new JFrame("中等迷宫");public static JFrame jFrame4 =new JFrame("困难迷宫");public static JPanel jPanel1 = new JPanel();public static JPanel jPanel2 = new JPanel();public static void main(String[] args) {jFrame1.setBounds(450, 100, 1000, 1000);jFrame1.setResizable(true);jFrame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame2.setBounds(450, 100, 1000, 900);jFrame2.setResizable(true);jFrame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame3.setBounds(450, 100, 1000, 900);jFrame3.setResizable(true);jFrame3.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame4.setBounds(450, 100, 1000, 900);jFrame4.setResizable(true);jFrame4.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);ImageIcon bgim1 = new ImageIcon(Data.class.getResource("/static/海伊(迷宫).jpg")) ;//背景图案bgim1.setImage(bgim1.getImage().getScaledInstance(bgim1.getIconWidth(), bgim1.getIconHeight(), Image.SCALE_DEFAULT));JLabel jLabel1 = new JLabel("难度选择");JButton jButton1 = new JButton("简单");JButton jButton2 = new JButton("中等");JButton jButton3 = new JButton("困难");JLabel label1 = new JLabel();JLabel label2 = new JLabel("海伊的水母发饰找不到了,你能帮海伊找找嘛");JLabel label3=new JLabel();label1.setIcon(bgim1);//文件路径label1.add(label2); label2.setFont(new Font("微软雅黑", Font.BOLD + Font.ITALIC, 20));label2.setBounds(700,300,700,100);label1.add(jLabel1);label1.add(jButton1);label1.add(jButton2);label1.add(jButton3);jLabel1.setFont(new Font("微软雅黑", Font.BOLD + Font.ITALIC, 40));jLabel1.setBounds(420, 200, 700, 50);jButton1.setBounds(450, 400, 100, 50);jButton2.setBounds(450, 500, 100, 50);jButton3.setBounds(450, 600, 100, 50);jPanel1.add(label1);jFrame1.add(jPanel1);jButton1.addMouseListener(new MouseListener() {@Overridepublic void mouseClicked(MouseEvent e) {jFrame1.dispose();jFrame2.add(new Build1());jFrame2.setVisible(true);}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}});jButton2.addMouseListener(new MouseListener() {@Overridepublic void mouseClicked(MouseEvent e) {jFrame1.dispose();jFrame3.add(new Build2());jFrame3.setVisible(true);}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}});jButton3.addMouseListener(new MouseListener() {@Overridepublic void mouseClicked(MouseEvent e) {jFrame1.dispose();jFrame4.add(new Build3());jFrame4.setVisible(true);}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}});jFrame1.setVisible(true);}
}

主方法界面:

两张背景图用的都是原子Dan老师的画,画的是真的好看。

 (简单迷宫类)Build1:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import java.util.ArrayList;public class Build1 extends JPanel implements KeyListener {int stardustX;int stardustY;int fx;int fy;boolean isFalse = false;//方格的宽度和长度int BLOCK_WIDTH = 70;int BLOCK_HEIGHT = 70;Random random = new Random();HashMap<String, String> hashMap1 = new HashMap<String, String>();List<String> arraylist = new ArrayList<String>();JPanel jPanel1 = new JPanel();JButton jButton1 = new JButton("返回主菜单");JButton jButton2 = new JButton("重新游戏");JButton jButton3 = new JButton("路径提示");JButton jButton4 = new JButton("关闭提示");public static int[][] map;public static int[][] map1;public boolean flag = false;public Build1() {map = new int[11][11];for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {hashMap1.put(i + "," + j, "灰色0");map[j][i] = 0;}}for (int i = 1; i < 11; i = i + 2) {for (int j = 1; j < 11; j = j + 2) {hashMap1.replace(i + "," + j, "黄色1");map[j][i] = 1;}}fx = 2 * random.nextInt(5) + 1;if (fx == 1 || fx == 9) {fy = 2 * random.nextInt(5) + 1;} else {fy = random.nextInt(2);if (fy == 0) {fy = 1;} else {fy = 9;}}hashMap1.replace(fx + "," + fy, "红色1");map[fy][fx]=1;if (fx + 1 != 10) {hashMap1.replace((fx + 1) + "," + fy, "蓝色0");arraylist.add((fx + 1) + "," + fy);}if (fx - 1 != 0) {hashMap1.replace((fx - 1) + "," + fy, "蓝色0");arraylist.add((fx - 1) + "," + fy);}if (fy + 1 != 10) {hashMap1.replace(fx + "," + (fy + 1), "蓝色0");arraylist.add(fx + "," + (fy + 1));}if (fy - 1 != 0) {hashMap1.replace(fx + "," + (fy - 1), "蓝色0");arraylist.add(fx + "," + (fy - 1));}inti();stardustX = 0;stardustY = 70;hashMap1.replace(0 + "," + 1, "红色1");map[1][0] = 1;hashMap1.replace(10 + "," + 9, "红色1");map[9][10] = 1;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {System.out.print(map[i][j]+" ");}System.out.print('\n');}Maze.jFrame2.add(jButton1);Maze.jFrame2.add(jButton2);Maze.jFrame2.add(jButton3);Maze.jFrame2.add(jButton4);jButton1.setBounds(800, 100, 100, 50);jButton2.setBounds(800, 300, 100, 50);jButton3.setBounds(800, 500, 100, 50);jButton4.setBounds(800,700,100,50);jButton1.addMouseListener(new MouseListener() {@Overridepublic void mouseClicked(MouseEvent e) {Maze.jFrame2.dispose();Maze.jFrame1.add(Maze.jPanel1);Maze.jFrame1.setVisible(true);}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}});jButton2.addMouseListener(new MouseListener() {@Overridepublic void mouseClicked(MouseEvent e) {map = new int[11][11];isFalse = false;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {hashMap1.put((i) + "," + (j), "灰色0");map[j][i]=0;}}for (int i = 1; i < 11; i = i + 2) {for (int j = 1; j < 11; j = j + 2) {hashMap1.replace((i) + "," + (j), "黄色1");map[j][i]=1;}}fx = 2 * random.nextInt(5) + 1;if (fx == 1 || fx == 9) {fy = 2 * random.nextInt(5) + 1;} else {fy = random.nextInt(2);if (fy == 0) {fy = 1;} else {fy = 9;}}hashMap1.replace((fx) + "," + (fy), "红色1");map[fy][fx]=1;if (fx + 1 != 10) {hashMap1.replace((fx + 1) + "," + (fy), "蓝色0");arraylist.add((fx + 1) + "," + (fy));}if (fx - 1 != 0) {hashMap1.replace((fx - 1) + "," + (fy), "蓝色0");arraylist.add((fx - 1) + "," + (fy));}if (fy + 1 != 10) {hashMap1.replace((fx) + "," + (fy + 1), "蓝色0");arraylist.add((fx) + "," + (fy + 1));}if (fy - 1 != 0) {hashMap1.replace((fx) + "," + (fy - 1), "蓝色0");arraylist.add((fx) + "," + (fy - 1));}inti();AStar.init();stardustX = 0;stardustY = 70;hashMap1.replace(0 + "," + 1, "红色1");hashMap1.replace(10 + "," + 9, "红色1");Maze.jFrame2.dispose();Maze.jFrame2.add(new Build1());Maze.jFrame2.setVisible(true);repaint();}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}});jButton3.addMouseListener(new MouseListener() {@Overridepublic void mouseClicked(MouseEvent e) {for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {System.out.print(map[i][j]+" ");}System.out.print('\n');}AStar.Node startPoint = new AStar().new Node(stardustY / 70, stardustX / 70, null);AStar.Node endPoint = new AStar().new Node(9, 10, null);AStar.seachWay( startPoint, endPoint,11,11);for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {System.out.print(map[i][j]+" ");}System.out.print('\n');}flag = true;jButton3.setFocusable(false);repaint();}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}});jButton4.addMouseListener(new MouseListener() {@Overridepublic void mouseClicked(MouseEvent e) {for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (map[j][i]==2) {map[j][i] = 1;}}}flag=false;repaint();jButton4.setFocusable(false);}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}});this.setFocusable(true);this.addKeyListener(this);this.setSize(12 * BLOCK_HEIGHT, 12 * BLOCK_WIDTH);//界面的方格的行数和列数this.setLocation(0, 0);}public void inti() {int x = 0;int y = 0;String str1 = "";String str2 = "";int num1 = random.nextInt(arraylist.size());int num2 = 0;System.out.println(arraylist.size());System.out.println(arraylist.get(num1));for (int i = 0; i < arraylist.get(num1).length(); i++) {if (arraylist.get(num1).charAt(i) == ',') {num2++;break;} else {str1 = str1 + arraylist.get(num1).charAt(i);num2++;}}for (int i = 0; i < str1.length(); i++) {x += (str1.charAt(i) - '0') * Math.pow(10, str1.length() - i - 1);}for (int i = num2; i < arraylist.get(num1).length(); i++) {str2 = str2 + arraylist.get(num1).charAt(i);}for (int i = 0; i < str2.length(); i++) {y += (str2.charAt(i) - '0') * Math.pow(10, str2.length() - i - 1);}arraylist.remove(num1);System.out.println(x);System.out.println(y);if (hashMap1.getOrDefault((x + 1) + "," + (y), "").equals("红色1")) {if (hashMap1.getOrDefault((x - 1) + "," + (y), "").equals("黄色1")) {hashMap1.replace((x - 1) + "," + (y), "红色1");map[y][x-1]=1;fx = x - 1;fy = y;if (fx + 1 != 10) {hashMap1.replace((fx + 1) + "," + (fy), "蓝色0");arraylist.add((fx + 1) + "," + (fy));}if (fx - 1 != 0) {hashMap1.replace((fx - 1) + "," + (fy), "蓝色0");arraylist.add((fx - 1) + "," + (fy));}if (fy + 1 != 10) {hashMap1.replace((fx) + "," + (fy + 1), "蓝色0");arraylist.add((fx) + "," + (fy + 1));}if (fy - 1 != 0) {hashMap1.replace((fx) + "," + (fy - 1), "蓝色0");arraylist.add((fx) + "," + (fy - 1));}hashMap1.replace((x) + "," + (y), "红色0");map[y][x] = 1;}} else if (hashMap1.getOrDefault((x - 1) + "," + (y), "").equals("红色1")) {if (hashMap1.getOrDefault((x + 1) + "," + (y), "").equals("黄色1")) {hashMap1.replace((x + 1) + "," + (y), "红色1");map[y][x+1]=1;fx = x + 1;fy = y;if (fx + 1 != 10) {hashMap1.replace((fx + 1) + "," + (fy), "蓝色0");arraylist.add((fx + 1) + "," + (fy));}if (fx - 1 != 0) {hashMap1.replace((fx - 1) + "," + (fy), "蓝色0");arraylist.add((fx - 1) + "," + (fy));}if (fy + 1 != 10) {hashMap1.replace((fx) + "," + (fy + 1), "蓝色0");arraylist.add((fx) + "," + (fy + 1));}if (fy - 1 != 0) {hashMap1.replace((fx) + "," + (fy - 1), "蓝色0");arraylist.add((fx) + "," + (fy - 1));}hashMap1.replace((x) + "," + (y), "红色0");map[y][x] = 1;}} else if (hashMap1.getOrDefault((x) + "," + (y + 1), "").equals("红色1")) {if (hashMap1.getOrDefault((x) + "," + (y - 1), "").equals("黄色1")) {hashMap1.replace((x) + "," + (y - 1), "红色1");map[y-1][x]=1;fx = x;fy = y - 1;if (fx + 1 != 10) {hashMap1.replace((fx + 1) + "," + (fy), "蓝色0");arraylist.add((fx + 1) + "," + (fy));}if (fx - 1 != 0) {hashMap1.replace((fx - 1) + "," + (fy), "蓝色0");arraylist.add((fx - 1) + "," + (fy));}if (fy + 1 != 10) {hashMap1.replace((fx) + "," + (fy + 1), "蓝色0");arraylist.add((fx) + "," + (fy + 1));}if (fy - 1 != 0) {hashMap1.replace((fx) + "," + (fy - 1), "蓝色0");arraylist.add((fx) + "," + (fy - 1));}hashMap1.replace((x) + "," + (y), "红色0");map[y][x] = 1;}} else if (hashMap1.getOrDefault((x) + "," + (y - 1), "").equals("红色1")) {if (hashMap1.getOrDefault((x) + "," + (y + 1), "").equals("黄色1")) {hashMap1.replace((x) + "," + (y + 1), "红色1");map[y+1][x]=1;fx = x;fy = y + 1;if (fx + 1 != 10) {hashMap1.replace((fx + 1) + "," + (fy), "蓝色0");arraylist.add((fx + 1) + "," + (fy));}if (fx - 1 != 0) {hashMap1.replace((fx - 1) + "," + (fy), "蓝色0");arraylist.add((fx - 1) + "," + (fy));}if (fy + 1 != 10) {hashMap1.replace((fx) + "," + (fy + 1), "蓝色0");arraylist.add((fx) + "," + (fy + 1));}if (fy - 1 != 0) {hashMap1.replace((fx) + "," + (fy - 1), "蓝色0");arraylist.add((fx) + "," + (fy - 1));}hashMap1.replace((x) + "," + (y), "红色0");map[y][x] = 1;}}while (!arraylist.isEmpty()) {inti();}}@Overrideprotected void paintComponent(Graphics Picture) {Picture.setColor(Color.white);Data.getbackground2().paintIcon(this, Picture, 0, 0);for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (map[j][i]==1||map[j][i]==2) {Picture.setColor(Color.BLACK);Picture.fillRect(i * 70, j * 70, 70, 70);}}}Picture.setColor(Color.white);if (flag) {for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (map[j][i] == 2) {Picture.fillRect(i * 70 + 20, j * 70 + 20, 30, 30);}}}}Data.gethaiyi1().paintIcon(this,Picture,stardustX,stardustY);Data.getShuimu1().paintIcon(this,Picture,700,630);if (isFalse == true) {Picture.setColor(Color.CYAN);Picture.setFont(new Font("微软雅黑", Font.BOLD + Font.ITALIC, 50));Picture.drawString("成功帮助海伊找到水母饰品!", 200, 200);}}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();if (keyCode == KeyEvent.VK_UP) {if (map[(stardustY-70)/70][stardustX / 70]==1 || map[(stardustY-70)/70] [stardustX / 70]==2) {stardustY = stardustY - 70;}} else if (keyCode == KeyEvent.VK_DOWN) {if (map[(stardustY+70)/70] [stardustX / 70]==1 || map[(stardustY+70)/70][stardustX / 70]==2) {stardustY = stardustY + 70;}} else if (keyCode == KeyEvent.VK_LEFT) {if (map[stardustY / 70][(stardustX-70)/70]==1 || map[stardustY / 70][(stardustX-70)/70]==2) {stardustX = stardustX - 70;}} else if (keyCode == KeyEvent.VK_RIGHT) {if (map [stardustY / 70][(stardustX+70)/70]==1 || map[(stardustY / 70)][(stardustX+70)/70]==2) {stardustX = stardustX + 70;}}if (stardustX == 700 && stardustY == 630) {isFalse = true;}repaint();}@Overridepublic void keyReleased(KeyEvent e) {}
}

(A星算法类1)AStar:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;/*** A*算法---迷宫中寻找最短路径** @author fh**/
public class AStar {public static int[][]arr;public static List<Node> openList = new ArrayList<Node>();// 开启列表public static List<Node> closeList = new ArrayList<Node>();// 关闭列表/*** 搜寻最短路径** @param startPoint* @param endPoint*/public static boolean seachWay(Node startPoint, Node endPoint, int row, int col) {final int CONST_HENG = 10;// 垂直方向或水平方向移动的路径评分openList.clear();closeList.clear();Node curNode = startPoint;arr =Build1.map;if (startPoint.x < 0 || startPoint.y > col || endPoint.x < 0|| endPoint.y > col || arr[startPoint.x][startPoint.y] == 0|| arr[endPoint.x][endPoint.y] == 0) {throw new IllegalArgumentException("坐标参数错误!!");}openList.add(startPoint);while (!openList.isEmpty() && !openList.contains(endPoint)) {curNode = minList(openList);if (curNode.x == endPoint.x && curNode.y == endPoint.y|| openList.contains(endPoint)) {System.out.println("找到最短路径");while(!(curNode.x==startPoint.x&&curNode.y==startPoint.y)){System.out.print("("+curNode.x+","+curNode.y+") ");arr[curNode.x][curNode.y]=2;if (curNode.parentNode!=null) {curNode=curNode.parentNode;}}System.out.print("("+startPoint.x+","+startPoint.y+")\n ");arr[startPoint.x][startPoint.y]=2;return true;}// 上if (curNode.y - 1 >= 0) {checkPath(curNode.x, curNode.y - 1, curNode, endPoint,CONST_HENG);}// 下if (curNode.y + 1 < col) {checkPath(curNode.x, curNode.y + 1, curNode, endPoint,CONST_HENG);}// 左if (curNode.x - 1 >= 0) {checkPath(curNode.x - 1, curNode.y, curNode, endPoint,CONST_HENG);}// 右if (curNode.x + 1 < row) {checkPath(curNode.x + 1, curNode.y, curNode, endPoint,CONST_HENG);}openList.remove(curNode);closeList.add(curNode);}// if (!openList.contains(endPoint)) {// System.out.println("一条路径都未找到!!!");// return false;// }return false;}// 核心算法---检测节点是否通路public static boolean checkPath(int x, int y, Node preNode, Node endPoint, int c) {Node node = new AStar().new Node(x, y, preNode);// 查找地图中是否能通过if (arr [x][y] == 0) {closeList.add(node);return false;}// 查找关闭列表中是否存在if (isListContains(closeList, x, y) != -1) {// 存在return false;}// 查找开启列表中是否存在int index = -1;if ((index = isListContains(openList, x, y)) != -1) {// 存在// G值是否更小,即是否更新G,F值if ((preNode.g + c) < openList.get(index).g) {countG(node, endPoint, c);countF(node);openList.set(index, node);}} else {// 不存在,添加到开启列表中node.setParentNode(preNode);count(node, endPoint, c);openList.add(node);}return true;}// 计算G,H,F值public static void count(Node node, Node eNode, int cost) {countG(node, eNode, cost);countH(node, eNode);countF(node);}// 计算G值public static void countG(Node node, Node eNode, int cost) {if (node.getParentNode() == null) {node.setG(cost);} else {node.setG(node.getParentNode().getG() + cost);}}// 计算H值public static void countH(Node node, Node eNode) {node.setF((Math.abs(node.getX() - eNode.getX()) + Math.abs(node.getY()- eNode.getY())) * 10);}// 计算F值public static void countF(Node node) {node.setF(node.getG() + node.getH());}// 集合中是否包含某个元素(-1:没有找到,否则返回所在的索引)public static int isListContains(List<Node> list, int x, int y) {for (int i = 0; i < list.size(); i++) {Node node = list.get(i);if (node.getX() == x && node.getY() == y) {return i;}}return -1;}// 找最小值public static Node minList(List<Node> list) {Iterator<Node> i = list.iterator();Node candidate = i.next();while (i.hasNext()) {Node next = i.next();if (next.compareTo(candidate) < 0)candidate = next;}return candidate;}// 节点类class Node {public int x;// X坐标public int y;// Y坐标public Node parentNode;// 父类节点public int g;// 当前点到起点的移动耗费public int h;// 当前点到终点的移动耗费,即曼哈顿距离|x1-x2|+|y1-y2|(忽略障碍物)public int f;// f=g+hpublic Node(int x, int y, Node parentNode) {this.x = x;this.y = y;this.parentNode = parentNode;}public int compareTo(Node candidate) {return this.getF() - candidate.getF();}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;}public Node getParentNode() {return parentNode;}public void setParentNode(Node parentNode) {this.parentNode = parentNode;}public int getG() {return g;}public void setG(int g) {this.g = g;}public int getH() {return h;}public void setH(int h) {this.h = h;}public int getF() {return f;}public void setF(int f) {this.f = f;}public String toString() {return "(" + x + "," + y + "," + f + ")";}}// 节点比较类class NodeFComparator implements Comparator<Node> {@Overridepublic int compare(Node o1, Node o2) {return o1.getF() - o2.getF();}}public static void init(){new AStar();}}

对于A*算法的详细步骤建议去看https://blog.csdn.net/fh09102103/article/details/48806095?spm=1001.2014.3001.5506

其实不同难度的迷宫的建立方法其实大致是相同的,我在简单迷宫类用到了栈,因为这是我比较擅长,也比较喜欢用的,其实也可以用二维数组,而且会更简单一点,下面给上实例代码

(困难迷宫类)Build3:

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;public class Build3 extends JPanel implements KeyListener {int stardustX;int stardustY;int fx;int fy;boolean isFalse = false;//方格的宽度和长度int BLOCK_WIDTH = 20;int BLOCK_HEIGHT = 20;Random random = new Random();HashMap<String, String> hashMap1 = new HashMap<String, String>();List<String> arraylist = new ArrayList<String>();JPanel jPanel1 = new JPanel();JButton jButton1 = new JButton("返回主菜单");JButton jButton2 = new JButton("重新游戏");JButton jButton3 = new JButton("路径提示");JButton jButton4 = new JButton("关闭提示");public static int[][] map;public static String[][] map1;public boolean flag = false;public Build3() {map = new int[41][41];map1 = new String[41][41];for (int i = 0; i < 41; i++) {for (int j = 0; j < 41; j++) {map1[i][j] = "灰色0";map[j][i] = 0;}}for (int i = 1; i < 41; i = i + 2) {for (int j = 1; j < 41; j = j + 2) {map1[i][j] = "黄色1";map[j][i] = 1;}}fx = 2 * random.nextInt(20) + 1;if (fx == 1 || fx == 39) {fy = 2 * random.nextInt(20) + 1;} else {fy = random.nextInt(2);if (fy == 0) {fy = 1;} else {fy = 39;}}map1[fx][fy] = "红色1";map[fy][fx] = 1;if (fx + 1 != 40) {map1[fx + 1][fy] = "蓝色0";arraylist.add((fx + 1) + "," + fy);}if (fx - 1 != 0) {map1[fx - 1][fy] = "蓝色0";arraylist.add((fx - 1) + "," + fy);}if (fy + 1 != 40) {map1[fx][fy + 1] = "蓝色0";arraylist.add(fx + "," + (fy + 1));}if (fy - 1 != 0) {map1[fx][fy - 1] = "蓝色0";arraylist.add(fx + "," + (fy - 1));}inti();stardustX = 0;stardustY = 20;map1[0][1] = "红色1";map[1][0] = 1;map1[40][39] = "红色1";map[39][40] = 1;Maze.jFrame4.add(jButton1);Maze.jFrame4.add(jButton2);Maze.jFrame4.add(jButton3);Maze.jFrame4.add(jButton4);jButton1.setBounds(830, 100, 100, 50);jButton2.setBounds(830, 300, 100, 50);jButton3.setBounds(830, 500, 100, 50);jButton4.setBounds(830, 700, 100, 50);jButton1.addMouseListener(new MouseListener() {@Overridepublic void mouseClicked(MouseEvent e) {Maze.jFrame4.dispose();Maze.jFrame1.add(Maze.jPanel1);Maze.jFrame1.setVisible(true);}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}});jButton2.addMouseListener(new MouseListener() {@Overridepublic void mouseClicked(MouseEvent e) {map = new int[41][41];isFalse = false;for (int i = 0; i < 41; i++) {for (int j = 0; j < 41; j++) {map1[i] [j]= "灰色0";map[j][i]=0;}}for (int i = 1; i < 41; i = i + 2) {for (int j = 1; j < 41; j = j + 2) {map1[i] [j]= "黄色1";map[j][i]=1;}}fx = 2 * random.nextInt(20) + 1;if (fx == 1 || fx == 39) {fy = 2 * random.nextInt(20) + 1;} else {fy = random.nextInt(2);if (fy == 0) {fy = 1;} else {fy = 39;}}map1[fx]  [fy]="红色1";map[fy][fx]=1;if (fx + 1 != 40) {map1[fx + 1] [fy]="蓝色0";arraylist.add((fx + 1) + "," + (fy));}if (fx - 1 != 0) {map1[fx - 1] [fy]="蓝色0";;arraylist.add((fx - 1) + "," + (fy));}if (fy + 1 != 40) {map1[fx ] [fy+1]="蓝色0";;arraylist.add((fx) + "," + (fy + 1));}if (fy - 1 != 0) {map1[fx] [fy-1]="蓝色0";;arraylist.add((fx) + "," + (fy - 1));}inti();AStar3.init();stardustX = 0;stardustY = 20;map1[0] [1]= "红色1";map1[40] [39]="红色1";Maze.jFrame4.dispose();Maze.jFrame4.add(new Build3());Maze.jFrame4.setVisible(true);repaint();}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}});jButton3.addMouseListener(new MouseListener() {@Overridepublic void mouseClicked(MouseEvent e) {AStar3.Node startPoint = new AStar3().new Node(stardustY / 20, stardustX / 20, null);AStar3.Node endPoint = new AStar3().new Node(39, 40, null);AStar3.seachWay( startPoint, endPoint, 41, 41);for (int i = 0; i < 41; i++) {for (int j = 0; j < 41; j++) {System.out.print(map[i][j] + " ");}System.out.print('\n');}flag = true;jButton3.setFocusable(false);repaint();}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}});jButton4.addMouseListener(new MouseListener() {@Overridepublic void mouseClicked(MouseEvent e) {for (int i = 0; i < 41; i++) {for (int j = 0; j < 41; j++) {if (map[j][i]==2) {map[j][i] = 1;}}}flag = false;repaint();jButton4.setFocusable(false);}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}});this.setFocusable(true);this.addKeyListener(this);this.setSize(42 * BLOCK_HEIGHT, 42 * BLOCK_WIDTH);//界面的方格的行数和列数this.setLocation(0, 0);}public void inti() {int x = 0;int y = 0;String str1 = "";String str2 = "";int num1 = random.nextInt(arraylist.size());int num2 = 0;System.out.println(arraylist.size());System.out.println(arraylist.get(num1));for (int i = 0; i < arraylist.get(num1).length(); i++) {if (arraylist.get(num1).charAt(i) == ',') {num2++;break;} else {str1 = str1 + arraylist.get(num1).charAt(i);num2++;}}for (int i = 0; i < str1.length(); i++) {x += (str1.charAt(i) - '0') * Math.pow(10, str1.length() - i - 1);}for (int i = num2; i < arraylist.get(num1).length(); i++) {str2 = str2 + arraylist.get(num1).charAt(i);}for (int i = 0; i < str2.length(); i++) {y += (str2.charAt(i) - '0') * Math.pow(10, str2.length() - i - 1);}arraylist.remove(num1);System.out.println(x);System.out.println(y);if (map1[x + 1][y].equals("红色1")) {if (map1[x - 1][y].equals("黄色1")) {map1[x - 1][y] = "红色1";map[y][x - 1] = 1;fx = x - 1;fy = y;if (fx + 1 != 40) {map1[fx + 1][fy] = "蓝色0";arraylist.add((fx + 1) + "," + (fy));}if (fx - 1 != 0) {map1[fx - 1][fy] = "蓝色0";arraylist.add((fx - 1) + "," + (fy));}if (fy + 1 != 40) {map1[fx][fy + 1] = "蓝色0";arraylist.add((fx) + "," + (fy + 1));}if (fy - 1 != 0) {map1[fx][fy - 1] = "蓝色0";arraylist.add((fx) + "," + (fy - 1));}map1[x][y] = "红色0";map[y][x] = 1;}} else if (map1[x - 1][y].equals("红色1")) {if (map1[x + 1][y].equals("黄色1")) {map1[x + 1][y] = "红色1";map[y][x + 1] = 1;fx = x + 1;fy = y;if (fx + 1 != 40) {map1[fx + 1][fy] = "蓝色0";arraylist.add((fx + 1) + "," + (fy));}if (fx - 1 != 0) {map1[fx - 1][fy] = "蓝色0";arraylist.add((fx - 1) + "," + (fy));}if (fy + 1 != 40) {map1[fx][fy + 1] = "蓝色0";arraylist.add((fx) + "," + (fy + 1));}if (fy - 1 != 0) {map1[fx][fy - 1] = "蓝色0";arraylist.add((fx) + "," + (fy - 1));}map1[x][y] = "红色0";map[y][x] = 1;}} else if (map1[x][y + 1].equals("红色1")) {if (map1[x][y - 1].equals("黄色1")) {map1[x][y - 1] = "红色1";map[y - 1][x] = 1;fx = x;fy = y - 1;if (fx + 1 != 40) {map1[fx + 1][fy] = "蓝色0";arraylist.add((fx + 1) + "," + (fy));}if (fx - 1 != 0) {map1[fx - 1][fy] = "蓝色0";arraylist.add((fx - 1) + "," + (fy));}if (fy + 1 != 40) {map1[fx][fy + 1] = "蓝色0";arraylist.add((fx) + "," + (fy + 1));}if (fy - 1 != 0) {map1[fx][fy - 1] = "蓝色0";arraylist.add((fx) + "," + (fy - 1));}map1[x][y] = "红色0";map[y][x] = 1;}} else if (map1[x][y - 1].equals("红色1")) {if (map1[x][y + 1].equals("黄色1")) {map1[x][y + 1] = "红色1";map[y + 1][x] = 1;fx = x;fy = y + 1;if (fx + 1 != 40) {map1[fx + 1][fy] = "蓝色0";arraylist.add((fx + 1) + "," + (fy));}if (fx - 1 != 0) {map1[fx - 1][fy] = "蓝色0";arraylist.add((fx - 1) + "," + (fy));}if (fy + 1 != 40) {map1[fx][fy + 1] = "蓝色0";arraylist.add((fx) + "," + (fy + 1));}if (fy - 1 != 0) {map1[fx][fy - 1] = "蓝色0";arraylist.add((fx) + "," + (fy - 1));}map1[x][y] = "红色0";map[y][x] = 1;}}while (!arraylist.isEmpty()) {inti();}}@Overrideprotected void paintComponent(Graphics Picture) {Picture.setColor(Color.white);Data.getbackground2().paintIcon(this, Picture, 0, 0);for (int i = 0; i < 41; i++) {for (int j = 0; j < 41; j++) {if (map[j][i]==1 || map[j][i]==2) {Picture.setColor(Color.black);Picture.fillRect(i * 20, j * 20, 20, 20);}}}Picture.setColor(Color.white);if (flag) {for (int i = 0; i < 41; i++) {for (int j = 0; j < 41; j++) {if (map[j][i] == 2) {Picture.fillRect(i * 20 + 5, j * 20 + 5, 10, 10);}}}}Data.gethaiyi3().paintIcon(this,Picture,stardustX,stardustY);Data.getShuimu3().paintIcon(this,Picture,800,780);if (isFalse == true) {Picture.setColor(Color.CYAN);Picture.setFont(new Font("微软雅黑", Font.BOLD + Font.ITALIC, 50));Picture.drawString("成功帮助海伊找到水母饰品!", 200, 200);}}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();if (keyCode == KeyEvent.VK_UP) {if (map[(stardustY-20)/20][stardustX / 20]==1 || map[(stardustY-20)/20] [stardustX / 20]==2) {stardustY = stardustY - 20;}} else if (keyCode == KeyEvent.VK_DOWN) {if (map[(stardustY+20)/20] [stardustX / 20]==1 || map[(stardustY+20)/20][stardustX / 20]==2) {stardustY = stardustY + 20;}} else if (keyCode == KeyEvent.VK_LEFT) {if (map[stardustY / 20][(stardustX-20)/20]==1 || map[stardustY / 20][(stardustX-20)/20]==2) {stardustX = stardustX - 20;}} else if (keyCode == KeyEvent.VK_RIGHT) {if (map [stardustY / 20][(stardustX+20)/20]==1 || map[(stardustY / 20)][(stardustX+20)/20]==2) {stardustX = stardustX + 20;}}if (stardustX == 800 && stardustY == 780) {isFalse = true;}repaint();}@Overridepublic void keyReleased(KeyEvent e) {}}

可以看到整体的思路是不变的,变的只是用到的方法。AStar3类与AStar类也相差不多,这里就不给出了。

用于图片调用的Data类:

import javax.swing.*;public class Data {public static ImageIcon background1 = new ImageIcon(Data.class.getResource("/static/海伊(迷宫).jpg"));public static ImageIcon background2 = new ImageIcon(Data.class.getResource("/static/海伊(迷宫)2(1).jpg"));public static ImageIcon haiyi1 = new ImageIcon(Data.class.getResource("/static/海伊(1).png"));public static ImageIcon haiyi2 = new ImageIcon(Data.class.getResource("/static/海伊(2).png"));public static ImageIcon haiyi3 = new ImageIcon(Data.class.getResource("/static/海伊(3).png"));public static ImageIcon shuimu1 = new ImageIcon(Data.class.getResource("/static/水母(迷宫)(1).png"));public static ImageIcon shuimu2 = new ImageIcon(Data.class.getResource("/static/水母(迷宫)(2).png"));public static ImageIcon shuimu3 = new ImageIcon(Data.class.getResource("/static/水母(迷宫)(3).png"));public static ImageIcon getbackground1() {return background1;}public static void setbackground1(ImageIcon background) {Data.background1 = background;}public static ImageIcon getbackground2() {return background2;}public static void setbackground2(ImageIcon background2) {Data.background2 = background2;}public static ImageIcon gethaiyi1() {return haiyi1;}public static void sethaiyi1(ImageIcon haiyi1) {Data.haiyi1 = haiyi1;}public static ImageIcon gethaiyi2() {return haiyi2;}public static void sethaiyi2(ImageIcon haiyi2) {Data.haiyi2 = haiyi2;}public static ImageIcon gethaiyi3() {return haiyi3;}public static void sethaiyi3(ImageIcon haiyi3) {Data.haiyi3 = haiyi3;}public static ImageIcon getShuimu1() {return shuimu1;}public static void setShuimu1(ImageIcon shuimu1) {Data.shuimu1 = shuimu1;}public static ImageIcon getShuimu2() {return shuimu2;}public static void setShuimu2(ImageIcon shuimu2) {Data.shuimu2 = shuimu2;}public static ImageIcon getShuimu3() {return shuimu3;}public static void setShuimu3(ImageIcon shuimu3) {Data.shuimu3 = shuimu3;}
}

接下来就给大家展示一下最终的成品:

简单迷宫界面:

 中等迷宫界面:

 困难迷宫界面:

 到达终点的画面:

在做这个实验的时候,我遇到了很多的BUG,比如生成的路径与迷宫不符,人物穿墙,栈溢出,甚至有时候会发生递归调用死循环。这些都是很正常的,我们就是需要通过问题找原因,所以我会在进行某些操作的时候用

System.out.println();

输出数组或者栈里的数据,好知道问题会出在哪里。

这样我们在面对问题的时候不会太过迷茫,而不知从何入手。

实验三 基于A*算法的迷宫游戏开发相关推荐

  1. 实验三 基于A*算法的迷宫游戏

    软件实习项目三 -- Java实现基于A*算法的迷宫游戏 一.实验任务 (1)该题要求随机生成一个迷宫,并求解迷宫: (2)要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式.玩家走迷宫,通过键盘方向键 ...

  2. 【项目三 基于A*算法的迷宫游戏开发】

    一. 实验要求 1.迷宫随机生成 2.玩家走迷宫,留下足迹 3.系统用A*算法寻路,输出路径 二.前期准备 解决迷宫问题要用到两个算法,深度优先遍历(DFS)生成迷宫,A*算法寻路.那么首先要对这两种 ...

  3. 基于深度优先算法和A*算法的迷宫游戏开发(Java实现)

    先上图 文章目录 一.实验内容 二.深度优先算法生成迷宫 三.A*算法走迷宫 四.结果测试 五.源代码 六.参考文献 一.实验内容 1.要求: 1)迷宫随机生成 2)系统用A*算法寻路,输出路径 3) ...

  4. 基于A*算法的迷宫游戏

    文章目录 前言 一.项目要求 二.A*算法 三.项目实现 1.框架结构 2.数据结构 3.主要功能函数 总结 前言 本项目以PyCharm为开发平台,使用python编程语言,基于A*算法随机生成一个 ...

  5. 实验三、prim算法生成迷宫,A*算法解迷宫(实验准备)

    目录 实验要求: 算法简介: prim算法: A*算法: 实验要求: 该项目的主要要求是:首先生成一个迷宫,要求随机生成.而生成迷宫有深度优先算法.prim算法.递归分割算法等.老师说建议使用prim ...

  6. 实验项目三:基于A*搜索算法迷宫游戏开发

    基于A*搜索算法迷宫游戏开发 由于这一个不太完美,重新写了一个基于python的程序. 一.前言 二.基本流程 三.界面设计 四.迷宫随机生成 五.移动迷宫与尾迹生成 六.A*迷宫自动寻路 七.附加 ...

  7. 算法实验三 【电子老鼠闯迷宫】分支限界

    算法实验三 [电子老鼠闯迷宫]分支限界 1042.电子老鼠闯迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元 ...

  8. 20172328 蓝墨云实验——三种查找算法练习

    20172328 蓝墨云实验--三种查找算法练习 课程:<软件结构与数据结构> 班级: 1723 姓名: 李馨雨 学号:20172328 实验教师:王志强老师 实验日期:2018年10月1 ...

  9. TIT 计算机图形学 实验三 使用重心坐标算法绘制颜色渐变的正六面体

    TIT 计算机图形学 实验三 使用重心坐标算法绘制颜色渐变的正六面体 前言 参考视频计算机图形学全套算法讲解和C++编码实现(共23讲配套源码),计算机图形学案例视频讲解以及主页相关算法.孔老师是我的 ...

最新文章

  1. 组件化 Todo List 编写笔记
  2. SAP用户增强总结-采购订单建立增加客户数据增强示例
  3. Codeforces Gym 100187M M. Heaviside Function two pointer
  4. 韩松、朱俊彦等人提出GAN压缩法:算力消耗不到1/9,现已开源
  5. (五)将YOLOv5 PyTorch模型权重转换为TensorFlow Lite格式
  6. 兄弟们,请求支援,怎么实现互通,全部都互通的
  7. bzoj 4514: 数字配对
  8. DPDK 实现的不完全笔记
  9. 相机模型坐标系关系及转换
  10. android studio 中要在app名称中添加特殊符号
  11. centos安装aria2c_CentOS安装aria2 + yaaw实现离线下载
  12. 服务器 无线键鼠,几台电脑一套键鼠 不光省钱还方便
  13. android微信连wifi设置,微信小程序实现连接wifi功能的方法
  14. python交通调查数据处理_Python突破高德API限制爬取交通态势数据+GIS可视化(超详细)...
  15. 【ELM回归预测】基于非洲秃鹫算法优化极限学习机预测附matlab代码
  16. 人脸表情识别系统介绍——上篇(python实现,含UI界面及完整代码)
  17. 三分钟了解LAP Framework编程框架
  18. 聊聊实时音视频中的技术难点:回声消除+噪声消除
  19. JSON.stringify格式化Json字符串
  20. Hackthebox练习kaliLinux学习

热门文章

  1. 2022年中国研究生数学建模D题
  2. 云丁科技获6亿D轮融资:百度领投 顺为SIG险峰跟投
  3. 我毕业了,疫情还在,大学生就业怎么找工作?
  4. 八皇后问题(n皇后问题) BFS求解!
  5. 计算方法——拉格朗日插值多项式
  6. WWDC23 苹果开发者大会2023 内容一览
  7. 小学计算机课课堂整合,信息技术与小学语文课程整合的教学设计及案例分析精编.pdf...
  8. muduo中封装fd的Socket类和分发Channel的Acceptor类
  9. SwiftUI之深入解析三角函数和三角公式的应用
  10. 单火线设计系列文章4:电源转换电路和无线通信SOC电路