? main(String srgd[])方法是程序运行的入口方法。
3.2.3 代码(Dialog.java)
package maze;
import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * 启动窗口 * */
@SuppressWarnings(\)
public class Dialog extends JDialog {
private JTextField tf1=new JTextField(\,10); private JTextField tf2=new JTextField(\,10); private JButton b=new JButton(\生成迷宫\); public static void main(String srgd[]){ }
public Dialog(){
setTitle(\课程设计--求解迷宫\); setLayout(new BorderLayout());
JPanel p=new JPanel(new GridLayout(4,1)); FlowLayout flowLayout=new FlowLayout(); flowLayout.setAlignment(FlowLayout.LEFT); flowLayout.setHgap(10);
FlowLayout flowLayout1=new FlowLayout(); flowLayout1.setAlignment(FlowLayout.RIGHT); JPanel p1=new JPanel(flowLayout); JPanel p2=new JPanel(flowLayout); JPanel p3=new JPanel(); JPanel p4=new JPanel();
JPanel p5=new JPanel(flowLayout1);
p1.add(new JLabel(\行数: \)); p1.add(tf1);
p2.add(new JLabel(\列数: \));
11
try{ }
new Dialog();
Thread.sleep(300); e.printStackTrace(); }catch(Exception e){
}
}
p2.add(tf2);
p1.setBackground(new Color(226,244,255)); p2.setBackground(new Color(226,244,255)); p3.setBackground(new Color(226,244,255)); p4.setBackground(new Color(226,244,255));
p.add(p3); p.add(p1); p.add(p2); p.add(p4);
p5.add(b);
p5.setBackground(new Color(196,227,248));
add(new JLabel(new ImageIcon(\)),BorderLayout.NORTH); add(p,BorderLayout.CENTER); add(p5,BorderLayout.SOUTH); setSize(345, 250); setLocation(400, 100); setVisible(true);
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){ }
new MazeGUI(Integer.parseInt(tf1.getText()), setVisible(false);
Integer.parseInt(tf2.getText()));
});
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ }
System.exit(0);
});
3.3 Maze.java
3.3.1 效果图
Maze类绘制的墙、通路、路径、起点和终点的效果图如图3所示。
12
图3 墙、通路、路径、起点和终点
3.3.2 UML图
Maze类创建的对象是MazeGUI类和Rollback类最重要的成员之一,代表迷宫。标明Maze类的主要成员变量、成员方法的UMl图如图4所示。
图4 Maze类的UML图
以下是UML图中有关数据和方法的详细说明。 1) 成员变量
? mazeMap是int类型的二维数组,数组的元素的值表示迷宫对应位置的内容。若元素的
值为0表示迷宫对应位置可通过,即为通路;若元素的值为1表示迷宫对应位置为墙;若元素的值为2表示迷宫对应位置为已经走过的足迹;若元素的值为3,表示迷宫对应位置是从栈中弹出的点,并且不能再次通过;若元素的值为4,表示迷宫对应位置为起点,保证起点不可通过。
? begin和end是Position类创建的对象,其存储了起点和终点在迷宫图形界面上的坐
标信息。
? drawPos是Position类创建的对象,在迷宫图形界面上表现为一个方框,起到定位的
作用,其存储了在设置起点、终点、障碍在迷宫图形界面的位置时当前的坐标信息。 ? wallPic、roadPic、goPic、beginPic和endPic是Image类创建的对象,其内容分别
为墙、通路、路径、起点和终点的图片。
? row和col是int类型的变量,其值分别表示迷宫数组的行数和列数。 2) 成员方法
13
? Maze(int row,int col)是Maze类的构造方法,通过调用setMaze方法来创建maze对
象,其参数row,col是从MazeGUI类中传来的参数。 ? setMaze(int row,int col)方法,maze对象可调用该方法完成迷宫数组的初始化操作:
创建指定行数和列数的迷宫数组,将迷宫图形界面外围位置对应迷宫数组的元素的值设为1,将其余元素的值设为0。
? isPass(Position p)方法,maze对象可调用该方法判断传入的参数p点周围的四个方
向是否能通过,并返回一个整型数。根据p点坐标,确定该点在迷宫数组中的元素位置,然后再根据该位置四个方向上相邻位置元素的值判断该p点周围的四个方向是否能通过。若元素的值为0表示可以通过。对于返回值,若返回-1,表示p点四周没有通路(包括从栈中弹出的点);若返回0,表示p点东方向有通路;若返回1,表示p点南方向有通路;若返回2,表示p点西方向有通路;若返回3,表示p点北方向有通路。 ? mark(Position p,int m)方法,maze对象可调用该方法将传入的参数p点在迷宫数组
的对应位置的元素设为m。
? draw(Graphics g)方法,maze对象可调用该方法根据迷宫数组元素的值来绘制墙、通
路、路径图像和用于在迷宫图形界面定位的方框,此外该方法还根据begin和end中存储的坐标信息来绘制对应位置的起点和终点图像。
? setBegin(int x,int y)和setEnd(int x,int y)方法,maze对象可调用该方法根据传
入的参数x,y来创建Position类的对象begin和end。
3.3.3 代码(Maze.java)
package maze;
import java.awt.*; import javax.swing.*; /** * 迷宫参数 * */
public class Maze {
int[][] mazeMap;//地图数据 Position begin;//起始坐标
Position end;//结束坐标
Position drawPos=new Position(1,1);
Image wallPic=new ImageIcon(\).getImage(); Image roadPic=new ImageIcon(\).getImage(); Image a=new ImageIcon(\).getImage(); Image goPic=new ImageIcon(\).getImage(); Image endPic=new ImageIcon(\).getImage(); Image beginPic=new ImageIcon(\).getImage(); int row=0,col=0;
public Maze(int row,int col){
this.row=row;
14
}
this.col=col;
mazeMap=new int[row][col]; for(int i=0;i for(int j=0;j if(i==0||j==0||j==col-1||i==row-1){//迷宫最外层设为墙 this.mazeMap[i][j]=1; }else{ } this.mazeMap[i][j]=0; public Maze(){ } public void mark(Position p,int m){//标记位置已走过 this.mazeMap[p.y][p.x]=m; } public void draw(Graphics g){//绘制地图图片 for(int i=0;i 15 } for(int j=0;j if(begin!=null&&i==begin.y&&j==begin.x){//起点 g.drawImage(beginPic,j*50, 24+i*50, 50, 50,null); }else if(end!=null&&i==end.y&&j==end.x){//终点 g.drawImage(endPic,j*50, 24+i*50, 50, 50,null); }else if(this.mazeMap[i][j] == 1){//墙壁 g.drawImage(wallPic,j*50, 24+i*50, 50, 50,null); }else if(this.mazeMap[i][j] == 2){//已走过的路径 g.drawImage(goPic,j*50, 24+i*50, 50, 50,null); }else if(this.mazeMap[i][j] == 3){//已走过的路径,消除脚印 g.drawImage(roadPic,j*50, 24+i*50, 50, 50,null); }else if(this.mazeMap[i][j] == 5){//A*方法路径 g.drawImage(a,j*50, 24+i*50, 50, 50,null); } else{//通道 g.drawImage(roadPic,j*50, 24+i*50, 50, 50,null); } g.drawRect(drawPos.x*50, 24+drawPos.y*50, 50, 50);