1. 程式人生 > >迷宮遊戲程式碼(java語言編寫)

迷宮遊戲程式碼(java語言編寫)

迷宮遊戲

題目描述:
用0和1組成一個矩形矩陣,0代表當前位置可走,1代表當前位置不可走。
eg:
0 0 0 0
1 0 1 0
1 0 0 0
1 1 1 0
實現功能:
1.建立迷宮
2.選擇迷宮入口和出口
3.搜尋從迷宮入口到迷宮出口的所有路徑,輸出(路徑用2表示)
如上例,尋找從迷宮左上角到右下角的路徑,結果如下:
第一條:
2 2 0 0
1 2 1 0
1 2 2 2
1 1 1 2
第二條:
2 2 2 2
1 0 1 2
1 0 0 2
1 1 1 2

//迷宮中的每一個位置
class Place {
    private
int wall=1; private boolean search=false; private Place e=null,s=null,w=null,n=null; public Place(int isWall){ wall=isWall; } public void setWall(int wall) { this.wall = wall; } public void setE(Place e) { this.e = e; } public void setS(Place s) { this
.s = s; } public void setW(Place w) { this.w = w; } public void setN(Place n) { this.n = n; } public void setSearch(boolean search) { this.search = search; } public int getWall() { return wall; } public Place getE() { return
e; } public Place getS() { return s; } public Place getW() { return w; } public Place getN() { return n; } public boolean isSearch() { return search; } } //迷宮 class Maze{ Place [][] maze; int row=0,list=0; final int PLACE=5; final int FLAG=0; //建立迷宮 public void setMaze(){ System.out.println("正在建立迷宮......"); Scanner sc=new Scanner(System.in); int wall=1; System.out.println("請輸入迷宮的行數和列數:"); row=sc.nextInt(); list=sc.nextInt(); System.out.println("請輸入迷宮路徑:"); maze=new Place[row+2][]; for(int i=1;i<=row;i++){ maze[i]=new Place [list+2]; for(int j=1;j<=list;j++){ wall=sc.nextInt(); maze[i][j]=new Place(wall); } } maze[0]=new Place [list+2]; maze[row+1]=new Place [list+2]; for(int j=0;j<=list+1;j++){ maze[0][j]=new Place(1); maze[row+1][j]=new Place(1); } for(int j=0;j<=row+1;j++){ maze[j][0]=new Place(1); maze[j][list+1]=new Place(1); } System.out.println("迷宮建立完成......"); } //輸出迷宮 public void printMaze(){ for(int i=1;i<=row;i++){ for(int j=1;j<=list;j++){ System.out.print(maze[i][j].getWall()+" "); } System.out.println(); } } //搜尋下一可行位置 private void isPlace(){ for(int i=1;i<=row;i++){ for(int j=1;j<=list;j++){ if(maze[i][j+1].getWall()==0){ maze[i][j].setE(maze[i][j+1]); } if(maze[i+1][j].getWall()==0){ maze[i][j].setS(maze[i+1][j]); } if(maze[i][j-1].getWall()==0){ maze[i][j].setW(maze[i][j-1]); } if(maze[i-1][j].getWall()==0){ maze[i][j].setN(maze[i-1][j]); } } } } //尋找迷宮路徑 public void searchPath(int entrance,int exit){ System.out.println("正在尋找迷宮路徑......"); isPlace(); int pathAll=0;//總路徑數 Place [] endPath=new Place [row*list];//最終路徑 int endPathTop=-1;//最終路徑陣列下標 Place [][] path=new Place [row*list][];//當前路徑 for(int i=0;i<path.length;i++){ path [i] = new Place [PLACE]; } int pathTop=-1;//當前路徑陣列下標 int [] top=new int [row*list];//當前位置的下一位置的可能數下標 for(int i=0;i<top.length;i++){ top[i]=-1; } Place start=maze[1][1],end=maze[1][1];//開始位置和結束位置 if(entrance==list){ start=maze[1][list]; } if(entrance==row*(list-1)+1){ start=maze[row][1]; } if(entrance==row*list){ start=maze[row][list]; } if(exit==list){ end=maze[1][list]; } if(exit==row*(list-1)+1){ end=maze[row][1]; } if(exit==row*list){ end=maze[row][list]; } //開始尋找迷宮路徑 if(start.getWall()==0){ pathTop++; top[pathTop]++; path[pathTop][top[pathTop]]=start; while(pathTop>=0){ //判斷當前位置是否為結束位置,是,輸出迷宮路徑,退回上一位置,否,尋找下一不重複位置 if(path[pathTop][FLAG]==end){ pathAll++; endPathTop=-1; while(endPathTop<pathTop){ endPathTop++; endPath[endPathTop]=path[endPathTop][FLAG]; } top[pathTop]--; pathTop--; System.out.println("第"+pathAll+"條路徑:"); for(int i=0;i<=endPathTop;i++){ endPath[i].setWall(2); } printMaze(); for(int i=0;i<=endPathTop;i++){ endPath[i].setWall(0); } }else if(!path[pathTop][top[FLAG]].isSearch()){//尋找當前位置的下一位置的可能數 if(path[pathTop][FLAG].getE()!=null&&!path[pathTop][FLAG].getE().isSearch()){ path[pathTop][++top[pathTop]]=path[pathTop][FLAG].getE(); } if(path[pathTop][FLAG].getS()!=null&&!path[pathTop][FLAG].getS().isSearch()){ path[pathTop][++top[pathTop]]=path[pathTop][FLAG].getS(); } if(path[pathTop][FLAG].getW()!=null&&!path[pathTop][FLAG].getW().isSearch()){ path[pathTop][++top[pathTop]]=path[pathTop][FLAG].getW(); } if(path[pathTop][FLAG].getN()!=null&&!path[pathTop][FLAG].getN().isSearch()){ path[pathTop][++top[pathTop]]=path[pathTop][FLAG].getN(); } path[pathTop][FLAG].setSearch(true); } //當前位置的下一位置的所有可能依次查詢,無下一位置則回退到上一位置 if(top[pathTop]==FLAG){ path[pathTop][FLAG].setSearch(false); top[pathTop]--; pathTop--; }else{ pathTop++; top[pathTop]++; path[pathTop][FLAG]=path[pathTop-1][top[pathTop-1]--]; } } } if(pathAll==0){ System.out.println("從迷宮入口到迷宮出口不存在有效路徑!"); }else{ System.out.println("從迷宮入口到迷宮出口存在 "+pathAll+" 條有效路徑!"); } System.out.println("迷宮路徑尋找完成......"); } } class TestDemo{ public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); Maze maze=new Maze(); maze.setMaze(); System.out.println("迷宮為:"); maze.printMaze(); int entrance=0,exit=0,sel=0; boolean judge=false; while(!judge){ System.out.print("請選擇迷宮入口:"); System.out.println("(1.左上方 2.右上方 3.左下方 4.右下方 )"); sel=sc.nextInt(); switch(sel){ case 1: entrance=1; judge=true; break; case 2: entrance=maze.list; judge=true; break; case 3: entrance=maze.row*(maze.list-1)+1; judge=true; break; case 4: entrance=maze.row*maze.list; judge=true; break; default: System.out.println("您的選擇輸入錯誤,請重新輸入!"); break; } } judge=false; while(!judge){ System.out.print("請選擇迷宮出口:"); System.out.println("(1.左上方 2.右上方 3.左下方 4.右下方 )"); sel=sc.nextInt(); switch(sel){ case 1: exit=1; judge=true; break; case 2: exit=maze.list; judge=true; break; case 3: exit=maze.row*(maze.list-1)+1; judge=true; break; case 4: exit=maze.row*maze.list; judge=true; break; default: System.out.println("您的選擇輸入錯誤,請重新輸入!"); break; } } if(entrance==exit){ System.out.println("從入口出,無需進入迷宮,無須尋找迷宮路徑!"); }else{ maze.searchPath(entrance, exit); } } }