迷宮遊戲程式碼(java語言編寫)
阿新 • • 發佈:2019-01-29
迷宮遊戲
題目描述:
用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);
}
}
}