Java小案例-(逃离迷宫)

Java小案例-(逃离迷宫)

一,迷宫需求描述:

1,用户输入迷宫图(限制方形):字母1位墙,0为通,e为出口,m为入口,*为已访问的位置,用外围1围住迷宫

2,运行轨迹右,左,下,上

3,判断该迷宫是否能从入口走到出口,并将搜索过程输出

二,迷宫实现:

1,迷宫元素类MazeCell:

package smalldemo.maze;

 class MazeCell {
  public int x,y;
  public MazeCell(){
  }
  public MazeCell(int x,int y){
      this.x=x;
      this.y=y;
  }
  public boolean equals(MazeCell cell){
     return x==cell.x && y==cell.y;
  }
}

2,迷宫搜索类MazeUtils:

package smalldemo.maze;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.Stack;
class MazeUtils {
    private int rows,columns;
    private MazeCell currentCell,exitCell=new MazeCell(),entryCell=new MazeCell();
    private final char wall='1',passage='0',visited='*',entryMarker='m',exitMarker='e';
    private char[][] stores;
    private Stack<MazeCell> mazePath=new Stack<MazeCell>();
    MazeUtils(){
        int row=0,column=0;

        InputStreamReader in=new InputStreamReader(System.in);
        BufferedReader buf=new BufferedReader(in);
        Stack<String> mazeRows=new Stack<String>();
        System.out.println("Enter a rectangular maze using the following"+
        "characters\nm -entry\ne -exit\n1 - wall \n0 - passage\n"+"Enter one line at one time:" +
                "end with Ctrl- D:");
        try {
            String str=buf.readLine();
            while(str !=null) {
                row += 1;
                columns = str.length();
                str = "1" + str + "1";
                mazeRows.push(str);
                if (str.indexOf(entryMarker) != -1) {
                    entryCell.x = row;
                    entryCell.y = str.indexOf(entryMarker);
                }
                if (str.indexOf(exitMarker) != -1) {
                    exitCell.x = row;
                    exitCell.y = str.indexOf(exitMarker);
                }
                str = buf.readLine();

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        rows=row;
        stores=new char[rows+2][];
        stores[0]=new char[columns+2];
        for(;!mazeRows.empty();row --){
            stores[row]=mazeRows.pop().toCharArray();
        }
        stores[rows+1]=new char[columns+2];
        for(int i=0;i<columns+2;i+=1){
            stores[0][i]=wall;
            stores[rows+1][i]=wall;
        }
    }
    private void display(PrintStream out){
        for(int row =0;row <rows +1;row+=1){
            out.println(stores[row]);
        }
        out.println();
    }
    private void pushUnvisited(int row,int col){
        if(stores[row][col] ==passage || stores[row][col] == exitMarker){
            mazePath.push(new MazeCell(row,col));
        }
    }
    public void exitMaze(PrintStream out){
        currentCell=entryCell;
        out.println();
        while (!currentCell.equals(exitCell)){
            int x=currentCell.x;
            int y=currentCell.y;
            display(System.out);
            stores[x][y]=visited;
            pushUnvisited(x-1,y);
            pushUnvisited(x+1,y);
            pushUnvisited(x,y-1);
            pushUnvisited(x,y+1);
            if(mazePath.isEmpty()){
                display(out);
                out.println("Failure");
                return;
            }
            else{
                currentCell=mazePath.pop();
            }
        }
        display(out);
        out.println("Success!");
    }
    public static void main(String[] args){
        new MazeUtils().exitMaze(System.out);
    }
}

3,结果是:

Enter a rectangular maze using the followingcharacters
m -entry
e -exit
1 - wall 
0 - passage
Enter one line at one time:end with Ctrl- D:
1101
000e
00m1
^D

111111
111011
1000e1
100m11

111111
111011
1000e1
100*11

111111
111011
1000e1
10**11

111111
111011
1000e1
1***11

111111
111011
1*00e1
1***11

111111
111011
1**0e1
1***11

111111
111011
1***e1
1***11

Success!

Process finished with exit code 0
View Code

 

posted @ 2017-08-19 22:43  DamonDr  阅读(922)  评论(0编辑  收藏  举报