一.实验目标
1.迷宫游戏是非常经典的游戏,在该题中要求随机生成一个迷宫,并求解迷宫;
2.要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘方向键控制,并在行走路径上留下痕迹;系统走迷宫路径要求基于A*算法实现,输出走迷宫的最优路径并显示。
3.设计交互友好的游戏图形界面。
二.实验代码
MAP类
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package 迷宫;
import java.util.ArrayList;
public class EMap {
private ArrayList<Integer> blockPos = new ArrayList();
private int[][] d = new int[][]{{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
private boolean[][] a;
private int width;
private int height;
private boolean fl = false;
public EMap(boolean[][] b) {
this.width = (b.length - 1) / 2;
this.height = (b[0].length - 1) / 2;
this.a = new boolean[b.length][b[0].length];
for(int i = 0; i < b.length; ++i) {
for(int j = 0; j < b[0].length; ++j) {
this.a[i][j] = b[i][j];
}
}
}
private void dfs(int x, int y, int c) {
if (x == this.width * 2 && y == this.height * 2 - 1) {
this.fl = true;
} else {
for(int i = 0; i < 4; ++i) {
if (c != i) {
int dx = x + this.d[i][0];
int dy = y + this.d[i][1];
if (this.ise(dx, dy) && this.a[dx][dy]) {
if (this.fl) {
break;
}
this.blockPos.add(dx);
this.blockPos.add(dy);
this.a[dx][dy] = false;
this.dfs(dx, dy, (i + 2) % 4);
}
}
}
if (!this.fl) {
this.blockPos.remove(this.blockPos.size() - 1);
this.blockPos.remove(this.blockPos.size() - 1);
}
}
}
public ArrayList<Integer> exitmap() {
this.blockPos.add(0);
this.blockPos.add(1);
this.dfs(0, 1, 3);
return this.blockPos;
}
private boolean ise(int dx, int dy) {
return 0 <= dx && dx <= this.width * 2 && 0 <= dy && dy <= this.height * 2;
}
}
test类
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package 迷宫;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class Test extends JFrame implements ActionListener, KeyListener {
boolean[][] map = (new PMap()).prim(2, 0, 20, 19, true);
PaintMap p;
public Test() {
this.p = new PaintMap(this.map, (new EMap(this.map)).exitmap());
this.setTitle("迷宫游戏");
this.add(this.p);
this.setSize(500, 500);
this.setVisible(true);
this.setLocationRelativeTo((Component)null);
this.setDefaultCloseOperation(3);
this.addKeyListener(this);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
(new Test()).setVisible(true);
}
});
}
public void keyPressed(KeyEvent key) {
switch (key.getKeyCode()) {
case 32:
this.p.PressSp();
case 33:
case 34:
case 35:
case 36:
default:
break;
case 37:
this.p.moveLeft();
break;
case 38:
this.p.moveUp();
break;
case 39:
this.p.moveRight();
break;
case 40:
this.p.moveDown();
}
}
public void keyReleased(KeyEvent arg0) {
}
public void keyTyped(KeyEvent arg0) {
}
public void actionPerformed(ActionEvent arg0) {
}
}
三.实验图解