package com.tom.sample.maze;
// 程序:自动产生迷宫
// 范例文件:AutoMaze.java
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class MazePanel extends JPanel{
private static final long serialVersionUID = 1L;
int cellX = 20, cellY = 20; // 建立迷宫个数,cellX横向单元的个数,cellY纵向单元的个数
int Si, Sj, Ei, Ej; // 入口和出口
int[][] maze = new int[30][30]; // 迷宫数组
int enter = 20, width = 20; // 入口位置和每格大小
int ballIndexX, ballIndexY;
int ballCoordinateX = 1, ballCoordinateY = 1, diameter = 16;
KeyEvent ke = null;
JButton btnStart;
Button btnHelp;
Panel p;
Image wall1, wall2;
MediaTracker MT;
public MazePanel(){
super();
init();
}
public void init() { // 取的外墙图片
MT = new MediaTracker(this);
try {
wall1 = ImageIO.read(new File("src/images/wall1.gif"));
wall2 = ImageIO.read(new File("src/images/wall2.gif"));
} catch (IOException e1) {
e1.printStackTrace();
}
MT.addImage(wall1, 0);
MT.addImage(wall2, 0);
this.setSize(new Dimension((cellX + 2)*width,(cellY+2)*width + 20));
try {
//showStatus("图像载入中(Loading Images)...");
MT.waitForAll();
} catch (InterruptedException E) {
System.out.println(" Exception throwed...");
} // 懒的异常
btnStart = new JButton("开始游戏");
btnStart.setPreferredSize(new Dimension(100,21));
btnStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnStart.setText("重新开始");
int i, j;
Si = 1;
Sj = 1;
Ei = cellY;
Ej = cellX; // 设置出入口
ballIndexX = 1;
ballIndexY = 1;
ballCoordinateX = 1;
ballCoordinateY = 1;
for (i = 0; i <= cellY + 1; i++) {
for (j = 0; j <= cellX + 1; j++) {
if (i == 0 || j == 0 || i == cellY + 1
|| j == cellX + 1)
maze[i][j] = 15;
else
maze[i][j] = 3;
}
}
for (i = 0; i <= cellY + 1; i++) {
for (j = 0; j <= cellX + 1; j++) {
System.out.print(maze[i][j]+" ");
}
System.out.println();
}
genmaze(Ei, Ej);
maze[Ei][Ej] = maze[Ei][Ej] & 0xd;
repaint();
}
});
btnStart.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
updateBall(e);
}
});
p = new Panel();
p.add(btnStart);
setLayout(new BorderLayout());
add(p, "South");
}
public void genmaze(int i, int j) {
int n;
maze[i][j] |= 0x4; // 标志此格已经设置
while (maze[i][j + 1] == 3 || maze[i + 1][j] == 3 // 如果不是外墙(如果当前元素的东南西北方向的四个元素中,只
|| maze[i][j - 1] == 3 || maze[i - 1][j] == 3)//要有任何一个没有设值)
{
n = (int) (4 * Math.random() + 1); //随机生成一个 [1,4]的值
System.out.print("n="+n+"\ti="+i+"\tj="+j+
"\tmaze["+i+"]["+j+"]="+maze[i][j]+
"\tmaze["+i+"]["+(j+1)+"]="+maze[i][j+1]+
"\tmaze["+(i-1)+"]["+j+"]="+maze[i-1][j]+
"\tmaze["+i+"]["+(j-1)+"]="+maze[i][j-1]+
"\tmaze["+(i+1)+"]["+j+"]="+maze[i+1][j]);
if (n == 1 && maze[i][j + 1] == 3) {//如果随机数为1 并且东面元素没有设值
maze[i][j] &= 0xd;//则将当前元素与0xd(00001101)作与运算
System.out.println("\tmaze["+i+"]["+j+"]="+maze[i][j]);
genmaze(i, j + 1);//递归处理东面的元素
} else if (n == 2 && maze[i - 1][j] == 3) {//如果随机数为2,并且北面元素没有设值
maze[i][j] &= 0xe;//则将当前元素与0xe(00001110)作与运算
System.out.println("\tmaze["+i+"]["+j+"]="+maze[i][j]);
genmaze(i - 1, j);//递归处理北面的元素
} else if (n == 3 && maze[i][j - 1] == 3) {//如果随机数为3,并且西面元素没有设值
maze[i][j - 1] &= 0xd; //则将西面元素与0xd(00001101)作与运算
System.out.println("\tmaze["+i+"]["+(j-1)+"]="+maze[i][j-1]);
genmaze(i, j - 1);//递归处理西面的元素
} else if (n == 4 && maze[i + 1][j] == 3) {//如果随机数为4,并且南面元素没有设值
maze[i + 1][j] &= 0xe;//则将南面元素与0xe(00001110)作与运算
System.out.println("\tmaze["+(i+1)+"]["+j+"]="+maze[i+1][j]);
genmaze(i + 1, j);//递归处理南面的元素
}
System.out.println("\tNo recursion");
}
}
public void paint(Graphics g) {
int x, y, i, j;
g.clearRect(0, 0, (cellX + 3) * width, (cellY + 6) * width);
g.drawImage(wall1, enter, enter, (cellX + 1) * width, 2 * width, 0, 0,
100, 100, this);
g.drawImage(wall2, 0, 2 * width, width, (cellY + 1) * width + 5, 0, 0,
100, 100, this);
g.drawImage(wall1, enter, (cellY + 1) * width, (cellX + 1) * width,
(cellY + 2) * width, 0, 0, 100, 100, this);
g.drawImage(wall2, cellX * width, width, (cellX + 1) * width, cellY
* width, 0, 0, 100, 100, this);
for (i = 1; i <= cellY; i++) {
for (j = 1; j <= cellX; j++) {
x = (j - 1) * width + enter;
y = (i - 1) * width + enter;
if ((maze[i][j] & 1) == 1)
g.drawImage(wall1, x - width / 5, y, x + width, y + width,
0, 0, 100, 100, this);
if ((maze[i][j] & 2) == 2)
g.drawImage(wall2, x, y, x + width, y + width, 0, 0, 100,
100, this);
}
}
g.setColor(Color.RED);
g.fill3DRect(ballCoordinateX * width, ballCoordinateY * width + 4, diameter, diameter,false);
}
public void updateBall(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_RIGHT:
if((maze[ballIndexX][ballIndexY] & 2) != 2){
ballIndexY ++;
ballCoordinateX ++;
repaint();
}
if(ballIndexY > cellX)
JOptionPane.showMessageDialog(this, "恭喜您成功穿越迷宫!");
break;
case KeyEvent.VK_DOWN:
if((maze[ballIndexX + 1][ballIndexY] & 1) != 1){
ballIndexX ++;
ballCoordinateY ++;
repaint();
}
break;
case KeyEvent.VK_LEFT:
if((maze[ballIndexX][ballIndexY-1] & 2) != 2 && ballIndexY > 1){
ballIndexY --;
ballCoordinateX --;
repaint();
}
break;
case KeyEvent.VK_UP:
if((maze[ballIndexX][ballIndexY] & 1) != 1 && ballIndexX > 1){
ballIndexX --;
ballCoordinateY --;
repaint();
}
break;
default:
break;
}
}
public static void main(String args[]){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MazePanel mp = new MazePanel();
Dimension size = mp.getSize();
frame.setSize(new Dimension((int)mp.getSize().getWidth(),(int)mp.getSize().getHeight() + 30));
frame.getContentPane().add(mp);
frame.setVisible(true);
}
}
- 1
- 2
前往页