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 }

 

这次的练习,虽然很枯燥,但是我却收获了很多,一点点进步吧。

posted @ 2017-07-04 15:17  ll7  阅读(483)  评论(0编辑  收藏  举报