Java non-recursive maze
This is my course design. It is also the first time I have done this independently. To be honest, last night I felt very fulfilled. The whole person is happy to pop up in the study room. Because I have been a self-taught Java and have never done any project on my own, this course design takes me three days. In fact, it should be two and a half days, two and a half days later, I went to show off with my roommate. After reading the story, my brother said that if I had blocked the previous Road, I would have changed the road. Then, it's blown up ............... After that, I was happy for only three seconds. Because of the endless emptiness after the excitement, I don't know who to share my achievement with. Single dogs cannot afford to hurt. Let's just talk about the code.
Interface Construction
Package maze;
Import java. awt. Color;
Import javax. swing. JFrame;
Import javax. swing. JLabel;
Import javax. swing. JPanel;
Public class MyFrame extends JFrame {
Private int FIELDSIZE = 50;
Public JLabel [] [] labs;
Public MyFrame (){
SetTitle ("Maze problem ");
// SetName ("test ");
SetBounds (400,200,800,850 );
SetResizable (false );
JPanel boardPane = new JPanel ();
BoardPane. setLayout (null );
Add (boardPane );
Labs = new JLabel [16] [16];
For (int x = 0; x <16; x ++ ){
For (int y = 0; y <16; y ++ ){
JLabel backgroundLabel = new JLabel ();
BackgroundLabel. setOpaque (true );
BackgroundLabel. setBounds (x * FIELDSIZE, y * FIELDSIZE, FIELDSIZE, FIELDSIZE );
BoardPane. add (backgroundLabel, new Integer (1), 0 );
Labs [x] [y] = backgroundLabel;
}
}
SetColor (labs );
Setdefaclocloseoperation (EXIT_ON_CLOSE );
SetVisible (true );
}
Private void setColor (JLabel [] [] labs ){
For (int x = 0; x <16; x ++ ){
For (int y = 0; y <16; y ++ ){
If (x = 0 ){
Labs [x] [y]. setBackground (Color. BLACK );
}
}
}
For (int x = 0; x <16; x ++ ){
For (int y = 0; y <16; y ++ ){
If (x = 15 ){
Labs [x] [y]. setBackground (Color. BLACK );
}
}
}
For (int x = 0; x <16; x ++ ){
For (int y = 0; y <16; y ++ ){
If (y = 0 ){
Labs [x] [y]. setBackground (Color. BLACK );
}
}
}
For (int x = 0; x <16; x ++ ){
For (int y = 0; y <16; y ++ ){
If (y = 15 ){
Labs [x] [y]. setBackground (Color. BLACK );
}
}
}
For (int y = 0; y <8; y ++ ){
Labs [2] [y]. setBackground (Color. BLACK );
}
For (int y = 9; y <15; y ++ ){
Labs [2] [y]. setBackground (Color. BLACK );
}
For (int x = 3; x <7; x ++ ){
Labs [x] [7]. setBackground (Color. BLACK );
}
For (int x = 6; x <12; x ++ ){
Labs [x] [4]. setBackground (Color. BLACK );
}
Labs [6] [9]. setBackground (Color. BLACK );
Labs [6] [10]. setBackground (Color. BLACK );
For (int x = 3; x <10; x ++ ){
Labs [x] [10]. setBackground (Color. BLACK );
}
For (int x = 4; x <11; x ++ ){
Labs [x] [13]. setBackground (Color. BLACK );
}
Labs [8] [15]. setBackground (Color. BLACK );
For (int y = 2; y <4; y ++ ){
Labs [11] [y]. setBackground (Color. BLACK );
}
For (int y = 6; y <14; y ++ ){
Labs [11] [y]. setBackground (Color. BLACK );
}
For (int y = 7; y <14; y ++ ){
Labs [13] [y]. setBackground (Color. BLACK );
}
Labs [1] [1]. setBackground (Color. RED );
Labs [14] [14]. setBackground (Color. GREEN );
Labs [9] [6]. setBackground (Color. black );
Labs [9] [5]. setBackground (Color. black );
Labs [13] [1]. setBackground (Color. black );
Labs [13] [2]. setBackground (Color. black );
Labs [13] [3]. setBackground (Color. black );
Labs [14] [3]. setBackground (Color. black );
Labs [14] [4]. setBackground (Color. black );
Labs [11] [5]. setBackground (Color. black );
// Labs [14] [5]. setBackground (Color. black );
Labs [12] [13]. setBackground (Color. black );
// Labs [3] [13]. setBackground (Color. black );
Labs [14] [6]. setBackground (Color. black );
} // Construct the interface
Public static void main (String [] args ){
MyFrame myFrame = new MyFrame ();
}
Analysis:
Red indicates the entrance, and Green indicates the exit. When the access is green, the program ends.
}
Implement stack definition by yourself, because our course design does not allow direct API calls
Package maze;
Public class MyStack_Text {
Object [] stacks;
Int size;
Int top;
Int len;
Public MyStack_Text (int size ){
Super ();
This. size = size;
This. stacks = new Object [this. size];
This. top =-1;
}
Public Object peek (){
Return this. stacks [top];
}
Public boolean empty (){
Return top = (-1 );
}
Public boolean isFull (){
Return top = (size-1 );
}
Public void push (Object value ){
Len ++;
Stacks [++ this. top] = value;
}
Public Object pop (){
Len --;
Return stacks [this. top --];
}
Public int len (){
Return this. len;
}
}
Core algorithms
Analysis: Without analysis, it is the construction of the basic data structure stack.
Package maze;
Import java. awt. Color;
Import java. util. Stack;
Import java. util. TimerTask;
Import javax. swing. JLabel;
Public class Run extends TimerTask {
// Stack <JLabel> stack = new Stack <JLabel> (); // you can call
Run (){
}
MyFrame myFrame = new MyFrame ();
MyStack_Text stack = new MyStack_Text (100 );
Public void run (){
Int I = 1, j = 1;
Stack. push (myFrame. labs [1] [1]);
While (! Stack. empty () | myFrame. labs [I] [j]. getBackground ()! = Color. GREEN ){
// ��
While (myFrame. labs [I] [J-1]. getBackground ()! = Color. BLACK & myFrame. labs [I] [j]. getBackground ()! = Color. GREEN & myFrame. labs [I] [J-1]. getBackground ()! = Color. yellow & myFrame. labs [I] [J-1]. getBackground ()! = Color. RED & myFrame. labs [I] [J-1]. getBackground ()! = Color. pink ){
If (myFrame. labs [I] [-- j]. getBackground ()! = Color. GREEN)
Try {
Thread. sleep (100 );
}
Catch (InterruptedException e ){
E. printStackTrace ();
}
MyFrame. labs [I] [j]. setBackground (Color. yellow );
Stack. push (myFrame. labs [I] [j]);
}
// ��
While (myFrame. labs [I] [j + 1]. getBackground ()! = Color. BLACK & myFrame. labs [I] [1 + j]. getBackground ()! = Color. GREEN & myFrame. labs [I] [j + 1]. getBackground ()! = Color. yellow & myFrame. labs [I] [j + 1]. getBackground ()! = Color. RED & myFrame. labs [I] [j + 1]. getBackground ()! = Color. pink ){
If (myFrame. labs [I] [++ j]. getBackground ()! = Color. GREEN ){
MyFrame. labs [I] [j]. setBackground (Color. yellow );
Try {
Thread. sleep (100 );
}
Catch (InterruptedException e ){
E. printStackTrace ();
}
Stack. push (myFrame. labs [I] [j]);
}
}
// ��
While (myFrame. labs [I-1] [j]. getBackground ()! = Color. BLACK & myFrame. labs [I] [j]. getBackground ()! = Color. GREEN & myFrame. Lab [I-1] [j]. getBackground ()! = Color. yellow & myFrame. labs [I-1] [j]. getBackground ()! = Color. RED & myFrame. labs [I-1] [j]. getBackground ()! = Color. pink ){
If (myFrame. labs [-- I] [j]. getBackground ()! = Color. GREEN ){
MyFrame. labs [I] [j]. setBackground (Color. yellow );
Try {
Thread. sleep (100 );
}
Catch (InterruptedException e ){
E. printStackTrace ();
}
Stack. push (myFrame. labs [I] [j]);
}
}
// ��
While (myFrame. labs [I + 1] [j]. getBackground ()! = Color. BLACK & myFrame. labs [I] [j]. getBackground ()! = Color. GREEN & myFrame. labs [I + 1] [j]. getBackground ()! = Color. yellow & myFrame. labs [I + 1] [j]. getBackground ()! = Color. RED & myFrame. labs [I + 1] [j]. getBackground ()! = Color. pink ){
If (myFrame. labs [++ I] [j]. getBackground ()! = Color. GREEN ){
MyFrame. labs [I] [j]. setBackground (Color. yellow );
Try {
Thread. sleep (100 );
}
Catch (InterruptedException e ){
E. printStackTrace ();
}
Stack. push (myFrame. labs [I] [j]);
}
}
If (myFrame. labs [I] [j + 1]. getBackground ()! = Color. GREEN ){
Try {
Thread. sleep (100 );
}
Catch (InterruptedException e ){
E. printStackTrace ();
}
JLabel XX = (JLabel) stack. peek ();
I = XX. getX ()/50;
J = XX. getY ()/50;
Int pp = 0;
If (myFrame. labs [I + 1] [j]. getBackground () = Color. black | myFrame. labs [I + 1] [j]. getBackground () = Color. pink | myFrame. labs [I + 1] [j]. getBackground () = Color. yellow)
Pp ++;
If (myFrame. labs [I-1] [j]. getBackground () = Color. black | myFrame. labs [I-1] [j]. getBackground () = Color. pink | myFrame. labs [I-1] [j]. getBackground () = Color. yellow)
Pp ++;
If (myFrame. labs [I] [j + 1]. getBackground () = Color. black | myFrame. labs [I] [j + 1]. getBackground () = Color. pink | myFrame. labs [I] [j + 1]. getBackground () = Color. yellow)
Pp ++;
If (myFrame. labs [I] [J-1]. getBackground () = Color. black | myFrame. labs [I] [J-1]. getBackground () = Color. pink | myFrame. labs [I] [J-1]. getBackground () = Color. yellow)
Pp ++;
If (myFrame. labs [I] [j]. getBackground ()! = Color. GREEN)
If (pp = 4 ){
Stack. pop ();
XX. setBackground (Color. pink );
// System. out. println (I );
// System. out. println (j );
} // If
} // If
} // While
}
Public static void main (String [] args ){
// MyFrame myFrame = new MyFrame ();
Run R = new Run ();
// R. run (1, 1 );
R. run ();
}
}
Analysis: Here, black represents obstacles, white represents the path that can be taken, yellow represents the final path, and pink represents the mark of the stack after it is pushed into the stack.
Try {
Thread. sleep (100 );
}
Catch (InterruptedException e ){
E. printStackTrace ();
}
The sleep of processes is used to make the stack-to-stack operations visually visible.
Int pp = 0;
If (myFrame. labs [I + 1] [j]. getBackground () = Color. black | myFrame. labs [I + 1] [j]. getBackground () = Color. pink | myFrame. labs [I + 1] [j]. getBackground () = Color. yellow)
Pp ++;
If (myFrame. labs [I-1] [j]. getBackground () = Color. black | myFrame. labs [I-1] [j]. getBackground () = Color. pink | myFrame. labs [I-1] [j]. getBackground () = Color. yellow)
Pp ++;
If (myFrame. labs [I] [j + 1]. getBackground () = Color. black | myFrame. labs [I] [j + 1]. getBackground () = Color. pink | myFrame. labs [I] [j + 1]. getBackground () = Color. yellow)
Pp ++;
If (myFrame. labs [I] [J-1]. getBackground () = Color. black | myFrame. labs [I] [J-1]. getBackground () = Color. pink | myFrame. labs [I] [J-1]. getBackground () = Color. yellow)
Pp ++;
If (myFrame. labs [I] [j]. getBackground ()! = Color. GREEN)
If (pp = 4 ){
Stack. pop ();
XX. setBackground (Color. pink );
// System. out. println (I );
// System. out. println (j );
} // If
This should be my satisfaction, and I will determine when to exit the stack. After analysis, it is found that the top and bottom of the stack are not allowed to go up and down, that is, the top and bottom are surrounded by one or more of the three colors of yellow, pink, and black. Therefore, a pp variable is defined here. If there are any of the three colors of yellow, pink, and black in the upper and lower sides, pp ++, when pp = 4, that is, when the top, bottom, and left are one or more of the three colors, the stack is output. I think, I think, this should be a form of abstract thinking. by abstracting the consistency of the surrounding environment, we can make a unified judgment, reducing the amount of code.