package 迷宫;
import java.awt.Component;
import java.awt.Font;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectOutputStream.PutField;
import java.io.RandomAccessFile;
import javax.swing.JButton;
import javax.swing.JLayeredPane;
//此类代表迷宫
public class Maze extends JLayeredPane{
File mazeFile; //mazeFile是File类声明的对象,用来存放迷宫文件的引用
MazePoint[][]mazePoint; //mazePoint是MazePoint类型的二维数组,用来确定“路”“墙”“人”对象在Maze对象中的位置
WallOrRoad[][]wallOrRoad; //用来表示迷宫中的“墙”和“路”
PersonlnMaze person; //走“迷宫的人”
HandleMove handleMove; //负责处理person上的键盘事件
File wallImage,roadImage;
int distance=26,m=0,n=0;
public Maze(){
setLayout(null);
wallImage=new File("wall.jpg");
roadImage=new File("road.jpg");
person=new PersonlnMaze();
handleMove=new HandleMove();
handleMove.initSpendTime();
person.addKeyListener(handleMove);
setLayer(person,JLayeredPane.DRAG_LAYER);
}
public void setMazeFile(File f){ //把迷宫文件 通过参数形式传过来
mazeFile=f; //迷宫文件赋值给mazeFile
char [][]a;
RandomAccessFile in=null; // 定义随机流对象 in
String lineWord=null;
try {
in=new RandomAccessFile(mazeFile, "r"); //创建随机流的源为mazeFile;对文件的访问权限为 只读
long length=in.length(); //文件的长度
long position=0;
in.seek(position);//读写位置 距离 文件开头的字节数为0
//此while循环 是为了获取迷宫文件几行几列
while(position<length){ //如果 当前读写位置 小于 mazeFile文件长度,就进行循环
String str=in.readLine().trim();//
if(str.length()>=n) //str的长度大于列数n,就重新给列数n赋值
n=str.length(); //保存列数
position=in.getFilePointer();//获取流当前读写位置
m++; //然后接着 读取下一行
}
a=new char[m][n]; //把行数、列数保存到数组a中
position=0;
in.seek(position);
m=0;
while(position<length){
String str=in.readLine();
a[m]=str.toCharArray(); //把str字符串转化为 字符数组
position=in.getFilePointer();
m++;
}
in.close();
wallOrRoad=new WallOrRoad[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
wallOrRoad[i][j]=new WallOrRoad();
if(a[i][j]=='1'){
wallOrRoad[i][j].setIsWall(true);
wallOrRoad[i][j].setWallImage(wallImage);
wallOrRoad[i][j].repaint();
}
else if(a[i][j]=='0'){
wallOrRoad[i][j].setIsRoad(true);
wallOrRoad[i][j].setRoadImage(roadImage);
wallOrRoad[i][j].repaint();
}
else if(a[i][j]=='*'){
wallOrRoad[i][j].setIsEnter(true);
wallOrRoad[i][j].setIsRoad(true);
wallOrRoad[i][j].repaint();
}
else if(a[i][j]=='#'){
wallOrRoad[i][j].setIsOut(true);
wallOrRoad[i][j].setIsRoad(true);
wallOrRoad[i][j].repaint();
}
}
}
mazePoint=new MazePoint[m][n];
int Hspace=distance,Vspace=distance; //初始化x,y坐标为(26,26)
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
mazePoint[i][j]=new MazePoint(Hspace,Vspace); //每把设置“墙”、“路”位置 就把它传递给MazePoint类中
Hspace=Hspace+distance; //x坐标++
}
Hspace=distance;
Vspace=Vspace+distance; //y坐标++
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
add(wallOrRoad[i][j]);
wallOrRoad[i][j].setSize(distance,distance); //设置“墙”、“路”的大小
wallOrRoad[i][j].
setLocation(mazePoint[i][j].getX(),mazePoint[i][j].getY());
wallOrRoad[i][j].setAtMazePoint(mazePoint[i][j]);//设置自己所在的点
mazePoint[i][j].setWallOrRoad(wallOrRoad[i][j]); //将WallOrRoad对象放置到MazePoint对象上
mazePoint[i][j].setIsWallOrRoad(true);
if(wallOrRoad[i][j].getIsEnter()){
person.setAtMazePoint(mazePoint[i][j]);
add(person);
person.setSize(distance, distance);
person.
setLocation(mazePoint[i][j].getX(), mazePoint[i][j].getY());
person.requestFocus();
person.repaint();
}
}
}
handleMove.setMazePoint(mazePoint);
} catch (IOException exp) {
JButton mess=new JButton("无效的迷宫文件");
add(mess);
mess.setBounds(30, 39, 100, 100);
mess.setFont(new Font("宋体",Font.BOLD,30));
System.out.println(exp+"mess");
}
}
public void setWallImage(File f) { //MazeWindow调用此方法,传递过来图像文件
wallImage=f;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(wallOrRoad[i][j].getIsWall())
wallOrRoad[i][j].setWallImage(wallImage);
wallOrRoad[i][j].repaint();
}
}
}
public void setRoadImage(File f) {
roadImage=f;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(wallOrRoad[i][j].getIsRoad())
wallOrRoad[i][j].setRoadImage(roadImage);
wallOrRoad[i][j].repaint();
}
}
}
public HandleMove getHandleMove() {
return handleMove;
}
}