java实现简单二维迷宫(2)
这次是改良版本。
将地图封装,老鼠封装。是对Java基础的一个练习吧。
这次实现也遇到了一些问题。主要是栈。封装的mouse类中有成员变量i,j代表了老鼠的坐标。将mouse类对象m入栈的时候,总是入栈的是一个对象m的参考。你再次对m进行修改的时候栈里面的内容也全部变成m的内容。
解决方案:再写一个函数,在函数内部构建一个mouse类对象mtemp,将m的成员变量i,j先赋值给int型变量a,b。再将a,b赋值给mtemp的i,j。再将mtemp入栈。就解决了。
接下来附上代码,仅供参考:
1 //map.java 2 3 package test; 4 5 import java.util.Stack; 6 7 public class map { 8 int [][] maze={ 9 {2,2,2,2,2,2,2,2,2}, 10 {2,2,2,2,2,2,2,2,2}, 11 {2,0,0,0,0,0,0,2,2}, 12 {2,2,0,2,0,2,0,2,2}, 13 {2,2,0,0,2,0,2,2,2}, 14 {2,2,2,0,2,0,2,2,2}, 15 {2,2,0,0,0,0,0,2,2}, 16 {2,2,2,2,2,2,0,2,2}, 17 {2,2,2,2,2,2,2,2,2} 18 }; //在地图外面加一圈围墙,防止数组越界。 19 20 int [][] posi={ 21 {0,0,0,0,0,0,0,0,0}, 22 {0,0,0,0,0,0,0,0,0}, 23 {0,0,0,0,0,0,0,0,0}, 24 {0,0,0,0,0,0,0,0,0}, 25 {0,0,0,0,0,0,0,0,0}, 26 {0,0,0,0,0,0,0,0,0}, 27 {0,0,0,0,0,0,0,0,0}, 28 {0,0,0,0,0,0,0,0,0}, 29 {0,0,0,0,0,0,0,0,0} 30 }; 31 32 Stack<mouse> stack=new Stack<mouse>(); 33 34 void createpush(mouse m,Stack<mouse> stack) 35 { 36 mouse mtemp=new mouse(); 37 int a=m.geti(); 38 int b=m.getj(); 39 mtemp.seti(a); 40 mtemp.setj(b); 41 stack.push(mtemp); 42 } 43 44 void findpath(mouse m) 45 { 46 posi[m.geti()][m.getj()]=1; 47 48 createpush(m,stack); 49 50 while(!stack.empty()) 51 { 52 if(m.geti()==7&&m.getj()==6) 53 break; 54 if(maze[m.geti()][m.getj()+1]==0&&posi[m.geti()][m.getj()+1]==0) //向右探索 55 { 56 posi[m.geti()][m.getj()+1]=1; 57 m.setj(m.getj()+1); 58 createpush(m,stack); 59 //m.setj(m.geti()+1); 60 //stack.push(m.geti()+' '+m.getj()); 61 } 62 else if(maze[m.geti()+1][m.getj()]==0&&posi[m.geti()+1][m.getj()]==0) //向下探索 63 { 64 posi[m.geti()+1][m.getj()]=1; 65 m.seti(m.geti()+1); 66 createpush(m,stack); 67 68 } 69 else if(maze[m.geti()-1][m.getj()]==0&&posi[m.geti()-1][m.getj()]==0) //向上探索 70 { 71 posi[m.geti()-1][m.getj()]=1; 72 m.seti(m.geti()-1); 73 createpush(m,stack); 74 75 } 76 else if(maze[m.geti()][m.getj()-1]==0&&posi[m.geti()][m.getj()-1]==0) //向左探索 77 { 78 posi[m.geti()][m.getj()-1]=1; 79 m.setj(m.getj()-1); 80 createpush(m,stack); 81 82 } 83 else 84 { 85 stack.pop(); //走到死路,就将栈中该位置的点 出栈。 86 if(stack.empty()) 87 { 88 break; 89 } 90 m.seti(stack.peek().geti()); //peek()取栈顶元素。 91 m.setj(stack.peek().getj()); 92 } 93 } 94 } 95 96 void print(Stack<mouse> stack) 97 { 98 Stack<mouse> stacktemp=new Stack<mouse>(); 99 mouse mtemp=new mouse(); 100 101 while(!stack.empty()) //栈反转。 102 { 103 mtemp=(mouse) stack.pop(); 104 stacktemp.push(mtemp); 105 } 106 107 while(!stacktemp.empty()) // 将反转后的栈,挨个出栈,这就是老鼠的轨迹。 108 { 109 System.out.print(stacktemp.peek().geti()-1); 110 System.out.print(" "); 111 System.out.println(stacktemp.peek().getj()-1); 112 stacktemp.pop(); 113 } 114 } 115 }
1 //mouse.java 2 3 package test; 4 5 public class mouse { 6 7 mouse(int i,int j) 8 { 9 this.i=i; 10 this.j=j; 11 } 12 mouse() 13 { 14 this.i=0; 15 this.j=0; 16 } 17 18 void seti( int a) 19 { 20 this.i=a; 21 } 22 void setj(int b) 23 { 24 this.j=b; 25 } 26 27 int geti() 28 { 29 return i; 30 } 31 int getj() 32 { 33 return j; 34 } 35 36 private int i,j; 37 }
1 //test.java 2 3 package test; 4 5 public class test { 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 10 map maze=new map(); 11 mouse m=new mouse(2,1); 12 13 maze.findpath(m); 14 maze.print(maze.stack); 15 16 } 17 18 }
这次的练习,虽然很枯燥,但是我却收获了很多,一点点进步吧。