The non-trivial Java example Mouse in a Maze A simple software development process from specification, to design, implementation, and test DAAD project Joint Course on OOP using Java Humboldt University Berlin, University of Novi Sad, Polytehnica University of Timisoara, University of Plovdiv, University of Belgrade Author: Klaus Bothe Version: Sep. 29, 2004 Source Based on an idea from S.N. Kamin, M.D. Mickunas, E.M. Reingold: An introduction to computer science Using Java, McGraw-Hill, 1998 DAAD project Joint Course on OOP using Java 2 1
Points of this Java sample program For the lecturer only Introduce a non- trivial Java program Illustrate a methodology how to present larger Java programs in lectures Using Java API Demonstrate the importance of software engineering principles for ordinary Java program development Interactive style of the lecture improves learning effects DAAD project Joint Course on OOP using Java 3 Course materials For the lecturer only Lecture slides: about 90 slides takes 3 x 2 lecture hours at HU (interactive style) Java sources Classes Mouse Maze MouseMaze Easel SoftFrame MazeTest LOC 61 55 64 23 135 Sum: 378 Assignments: modify, extend the program implement as an applet (grafical interface) DAAD project Joint Course on OOP using Java 4 40 2
Didactical mistake in presenting complex Java programs in lectures The lecturer tries to explain each technical detail of program code non-understandable in a lecture boring For the lecturer only The lecturer starts with a Java program too early details of requirements specification still open design / class structure not well discussed Finding a proper class structure may be more challenging then implementing the Java program code. DAAD project Joint Course on OOP using Java 5 Didactical principles in presenting complex Java programs in lectures For the lecturer only Follow the software engineering process: requirements analysis, design, implementation & test Involve students into this process (interactivity) Only outline the main ideas of the implementation Assignments support detailed understanding the code DAAD project Joint Course on OOP using Java 6 3
Requirements analysis: Mouse in a Maze Task: Develop a program, that simulates the movement of a mouse in a maze (labyrinth) from an entry to an exit. What to do? Next steps? DAAD project Joint Course on OOP using Java 7 Facts concerning software development phases Most errors of software systems result from misunderstanding the problem to be solved. Software development consists only of a small part of programming: Requirements analysis: 20 % Design: 15 % Implementation: 20 % Test: 45 % DAAD project Joint Course on OOP using Java 8 4
Learning goals This example should illustrate the importance of a complete and correct requirements specification for the project success. Before implementing, the next step is the design of the application: Which components belong to the program architecture? Starting with the implementation too early may lead to project s failure. DAAD project Joint Course on OOP using Java 9 Development process of Mouse in a Maze Requirements analysis Design Implementation and test DAAD project Joint Course on OOP using Java 10 5
Requirements analysis: Mouse in a Maze Task: Develop a program, that simulates the movement of a mouse in a maze (labyrinth) from an entry to an exit. Open questions? DAAD project Joint Course on OOP using Java 11 Open questions How does a maze look like? What is a mouse able to do (e.g. which kinds of movements)? What is the initial state of the mouse? What, if there is no way from entry to exit? In which way should the solution be presented? DAAD project Joint Course on OOP using Java 12 6
How does a maze look like? DAAD project Joint Course on OOP using Java 13 Examples of our kind of mazes DAAD project Joint Course on OOP using Java 14 7
Requirements specification (1) Develop a program, that simulates the movement of a mouse in a maze (labyrinth) from an entry to an exit. 1. The Maze A maze is a collection of quadratic rooms arranged in a rectangle. Two adjacent rooms are separated by a wall or opening (gap). The maze is surrounded by a wall which is open at two locations (entry and exit). The size of the maze (length and height) is variable. Examples: DAAD project Joint Course on OOP using Java 15 How does a mouse look like? DAAD project Joint Course on OOP using Java 16 8
Our mouse DAAD project Joint Course on OOP using Java 17 Mouse confronted with different mazes This will become hard No problem exit entry exit entry DAAD project Joint Course on OOP using Java 18 9
Which kinds of movements is our mouse able to do? step forward turn left turn right DAAD project Joint Course on OOP using Java 19 Possible movements of the mouse May move one step forward into the adjacent room in the line of vision exit entry May turn left or right by 90 degrees DAAD project Joint Course on OOP using Java 20 10
Two implemented solutions entry exit What may be suspicious with these solutions? Proper solution for the wrong problem. In each case: the shortest path has been found. Requirements specification is incomplete entry exit DAAD project Joint Course on OOP using Java 21 Requirements specification is incomplete entry exit entry exit In each case: the shortest path has been found Only possible if the mouse knows the whole maze (view from above) This is not the characteristic of maze problems. DAAD project Joint Course on OOP using Java 22 11
Perceptions of the mouse Line of vision only straight forward May see only inside of one room (not into the adjacent room) exit entry May decide: Am I inside or outside the maze? May decide: Do I face a wall or an opening (gap)? DAAD project Joint Course on OOP using Java 23 Field of view of a mouse DAAD project Joint Course on OOP using Java 24 12
The problem may be huge DAAD project Joint Course on OOP using Java 25 Requirements Specification (2) 2. The Mouse: The mouse has no general overview of the maze. a) Themousemaymovein thefollowingway: turn left, turn right (by 90 degrees), move forward into the adjacent room. b) The mouse is located either in a fixed room inside the maze or just next to the entry or exit. In addition, it has a fixed line of vision. c) The mouse can see only in the line of vision. It can decide wether it faces a wall or not. DAAD project Joint Course on OOP using Java 26 13
Requirements specification: open problems? Description of the initial state of the mouse Description of the final state of the mouse Description of the task Special cases User interface DAAD project Joint Course on OOP using Java 27 Requirements Specification (3) 3. Desription of the initial state of the mouse: The mouse is initially placed in front of the entrance to the maze (the next step forward takes her to the maze). Example: exit entry DAAD project Joint Course on OOP using Java 28 14
Requirements Specification (4) 4. Desription of the final state of the mouse and of the task: We a looking for a sequence of movements (turn left, turn right, step forward) leading the mouse from the entry to the exit. Example: exit entry DAAD project Joint Course on OOP using Java 29 Requirements Specification (5) 5. Special case: If there is no exit or if there is no way from the entry to the exit, then the mouse should leave the maze through the entry. Example: entry DAAD project Joint Course on OOP using Java 30 15
Requirements Specification (6) 6. User interface a) Textual output of the solution: Example: step forward, turn right, b) Graphical user interface: The sequence of movements will be displayed with the help of a graphical applet, i.e. the steps of the mouse are visualized. The user can interactively trigger the next step. DAAD project Joint Course on OOP using Java 31 Solvability of the problem Is there an algorithm at all that solves the problem for arbitrary mazes taking into account the characteristic properties of the mouse? DAAD project Joint Course on OOP using Java 32 16
Algorithm: basic principle Principle: Have the mouse walk with its right side on the wall of the maze. Still not an algorithm An algorithm has to determine the sequence of mouse movements. DAAD project Joint Course on OOP using Java 33 Algorithm: as a pseudo code program only one step: if mouse is still inside the maze: turn right; if (facing a wall?): then turn left and test if (facing a wall?); if (facing a wall?) then turn left and test... else step forward DAAD project Joint Course on OOP using Java 34 17
Strong pseudo code: one step IF (NOT outside the maze?) BEGIN /*do next step*/ turn right; WHILE (facing a wall?) DO turn left; ENDWHILE step forward; END Impossible: DAAD project Joint Course on OOP using Java 35 Strong pseudo code: whole algorithm step forward; /* enter the maze */ WHILE(NOT outside the maze?) BEGIN /*do next step*/ turn right; WHILE (facing a wall?) DO turn left; ENDWHILE step forward; END ENDWHILE Think about: The algorithm fulfills the principle. DAAD project Joint Course on OOP using Java 36 18
Mouse movements according to the algorithm: first example exit entry DAAD project Joint Course on OOP using Java 37 Mouse movements according to the algorithm in detail: first example exit entry DAAD project Joint Course on OOP using Java 38 19
Mouse movements according to the algorithm: : second example exit entry DAAD project Joint Course on OOP using Java 39 Mouse movements according to the algorithm in detail: second example exit entry DAAD project Joint Course on OOP using Java 40 20
Mouse movements: graphical and textual output entry exit step forward turn right step forward turn right turn left turn left step forward turn right turn left turn left step forward turn right step forward DAAD project Joint Course on OOP using Java 41 Textual output of the solution xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x x x x x x x x x x x x x x x x x x x x x x x x x x xxxxxxxxxxxxxx x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx step forward turn to the right step forward turn to the right turn to the left turn to the left turn to the left step forward DAAD project Joint Course on OOP using Java 42 21
Mouse in a maze only a nice game? Sample of finding algorithms for robots dealing with different tasks: Playing soccer Robot moving on the moon Rescue robots DAAD project Joint Course on OOP using Java 43 Development process of Mouse in a Maze Requirements analysis Design Implementation and test DAAD project Joint Course on OOP using Java 44 22
Task Requirements specification Next step? Start with programming? If so, with which part/component???? DAAD project Joint Course on OOP using Java 45 Design: develop the software architecture SW architecture description languages: UML Our task: define an object-oriented architecture Main problem: How to find classes? DAAD project Joint Course on OOP using Java 46 23
Software development: Phases and results Analysis & Definition Requirements specification Design Software architecture Implementation Program Test Test cases DAAD project Joint Course on OOP using Java 47 As a matter of fact Finding a proper class structure may be more challenging then implementing the Java program code. DAAD project Joint Course on OOP using Java 48 24
Software architecture Structure of the software: Which components exist? Which relations are between them? Stack: Push(e) Pop() Top() DAAD project Joint Course on OOP using Java 49 Architecture specification languages Graphical languages for the specification of software architectures Industry standard: UML Unified Modelling Language Now: examples of one graphical element of UML: class diagram What programming languages mean to the implementation phase, are architecture specification languages to the design phase. DAAD project Joint Course on OOP using Java 50 25
Name UML classes: the structure Time Attributes: state hidden - hour : int - minute : int Time (hour: int, minute : int) addminutes (Min : int) printtime ( ) Operations: behaviour DAAD project Joint Course on OOP using Java 51 UML classes as interfaces Time - hour : int - minute : int UML classes provide an interface: Which information is visible from outside? Time (hour: int, minute : int) addminutes (Min : int) printtime ( ) Why are hidden data which are not visible from outside part of UML class? DAAD project Joint Course on OOP using Java 52 26
The usable interface of a class: only visible features Time - hour : int - minute : int Hidden data support the understanding of the interface. They are part of the class model. Time (hour: int, minute : int) addminutes (Min : int) printtime ( ) The only way to interact with objects of this class is to call its methods DAAD project Joint Course on OOP using Java 53 Relations between classes: Associations, inheritance, Class 1 Class 2 Association Class 1 Class 2 Directed association: objects of class one know objects of class two and not vice versa DAAD project Joint Course on OOP using Java 54 27
How to find classes? Principles? By separation of the problem to subproblems Sub-problems may become classes From the objects of the problem area Investigate the requirements specification to find objects of the problem area DAAD project Joint Course on OOP using Java 55 Case study: Mouse in a Maze Which objects of the problem area should be implemented as component / class of the system? Mouse Maze Algorithm for mouse movement User interface /output DAAD project Joint Course on OOP using Java 56 28
Which relations exist between the components? Which relations? Who needs whom? Mouse Maze Algorithm for mouse movement User interface /output DAAD project Joint Course on OOP using Java 57 Which relation: Who needs whom? no Mouse e.g. test if in front of a wall Maze Alg. has not to know the maze? Algorithm for mouse movement?? User interface /output DAAD project Joint Course on OOP using Java 58 29
Class diagram for a mouse Which data and which operations characterize the mouse? Mouse?? DAAD project Joint Course on OOP using Java 59 Mouse Interface of the mouse: Which data, which operations? (first approach) State: place / direction in a maze - Location : Point - Direction : int stepforward ( ) turnleft ( ) turnright ( ) facingwall ( ) : boolean outsidemaze ( ) : boolean Behaviour: abilities of the mouse (movements & perceptions) DAAD project Joint Course on OOP using Java 60 30
Detailed interface of the mouse Mouse Visible attribute - Location : Point - Direction : int + started : boolean - themaze : Maze Mouse (Maze m) getlocation ( ) : Point stepforward ( ) turnleft ( ) turnright ( ) facingwall ( ) : boolean outsidemaze ( ) : boolean Create a mouse in relation to a particular maze Current position of the mouse DAAD project Joint Course on OOP using Java 61 Interface of the maze Class diagram of the maze: data and operations? Maze?? Interface of the maze: Which information is necessary for a user of this class (user = objects of class Mouse )? DAAD project Joint Course on OOP using Java 62 31
Interface of the maze (first approach) Maze Is the current position outside of the maze? outside (pos : Point) : boolean checkwall (direction : int, pos : Point) : boolean getstartlocation ( ) : Point Is there a wall at position pos in this direction? Where to place the mouse initially? (position & direction) DAAD project Joint Course on OOP using Java 63 Interface of the maze: attributes? Maze outside (pos : Point) : boolean checkwall (direction : int, pos : Point) : boolean getstartlocation ( ) :? The representation of the maze is too complex to be included as attributes (array) DAAD project Joint Course on OOP using Java 64 32
Maze Detailed interface of the maze - height : int - width : int Detailed maze data are too complex to be included in a class diagram. The height and width of the maze are useful to draw the maze getstartlocation ( ) : Point getstartdirection ( ) : int Height and width as a point. getsize ( ) : Point checkwall (direction : int, pos : Point) : boolean checkwall (direction : int, col : int, row : int) : boolean outside (pos : Point) : boolean To find class diagrams is an iterative process: start with a simple solution and extend and modify if necessary. DAAD project Joint Course on OOP using Java 65 Software Architecture: the whole view (textual output) Mouse - Location : Point - Direction : int + started : boolean - themaze : Maze Mouse (Maze m) getlocation ( ) : Point stepforward ( ) turnleft ( ) turnright ( ) facingwall ( ) : boolean outsidemaze ( ) : boolean Maze - height : int - width : int getstartlocation ( ) : Point getstartdirection ( ) : int getsize ( ) : Point checkwall (direction : int, pos : Point) : boolean checkwall (direction : int, col : int, row : int) : boolean outside (pos : Point) : boolean Algorithm for mouse movement main ( ) Textual output of the maze printmaze ( ) DAAD project Joint Course on OOP using Java 66 33
Problems of the development of a software architecture Software architecture: Not unique (many good and many bad solutions) Design of a software architecture does not succeed for the first time Long process: Software architecture develops stepwise Principle: Start with one preliminary architecture The usability of the methods finally turns out only during the implementation. DAAD project Joint Course on OOP using Java 67 Development process of Mouse in a Maze Requirements analysis Design Implementation and test DAAD project Joint Course on OOP using Java 68 34
Java sources Classes Mouse Maze MouseMaze Easel SoftFrame MazeTest LOC 61 55 64 23 135 40 Sum: 378 DAAD project Joint Course on OOP using Java 69 Information to the audience This presentation gives only an outline of the principle points of the implementation. Several crucial technical details will be explained. However, not each implementation detail will be presented. This would be boring in a lecture. During the self-study and with assignments, everybody should explain oneself open questions. DAAD project Joint Course on OOP using Java 70 35
Planning of implementation steps In which order should the classes be implemented? 2 Mouse Maze 1 3b Algorithm for mouse movement User interface: Textual output of the maze 3a UML class diagram: Dependencies order of implementation DAAD project Joint Course on OOP using Java 71 2 Mouse - Location : Point - Direction : int + started : boolean - themaze : Maze Mouse (Maze m) getlocation ( ) : Point stepforward ( ) turnleft ( ) turnright ( ) facingwall ( ) : boolean outsidemaze ( ) : boolean Software Architecture: the whole view Maze - height : int - width : int getstartlocation ( ) : Point getstartdirection ( ) : int getsize ( ) : Point checkwall (direction : int, pos : Point) : boolean checkwall (direction : int, col : int, row : int) : boolean outside (pos : Point) : boolean 1 3b Algorithm for mouse movement main ( ) Textual output of the maze printmaze ( ) 3a In the lecture: 1, 2, 3b (main ideas) Self-study: 3a; 1, 2, 3b (details) DAAD project Joint Course on OOP using Java 72 36
Implementation of the maze Starting from the class diagram Maze - height : int - width : int getstartlocation ( ) : Point getstartdirection ( ) : int getsize ( ) : Point checkwall (direction : int, pos : Point) : boolean checkwall (direction : int, col : int, row : int) : boolean outside (pos : Point) : boolean DAAD project Joint Course on OOP using Java 73 Representation of the maze as a data structure How to represent the maze by Java data structures? DAAD project Joint Course on OOP using Java 74 37
Position in a maze Position = coordinate (x,y) = (number of column, number of line) (0,0) (1,0) (2,0) (3,0) (4,0) (5,0) (0,1) (1,1) (2,1) (3,1) (4,1) (5,1) (0,2) (1,2) (2,2) (3,2) (4,2) (5,2) (0,3) (1,3) (2,3) (3,3) (4,3) (5,3) (0,4) (1,4) (2,4) (3,4) (4,4) (5,4) DAAD project Joint Course on OOP using Java 75 Movement path of the mouse Path: (0,2), (1,2), (1,3), (1,2), (1,1),, (4,0) (0,0) (1,0) (2,0) (3,0) (4,0) (5,0) (0,1) (1,1) (2,1) (3,1) (4,1) (5,1) (0,2) (1,2) (2,2) (3,2) (4,2) (5,2) (0,3) (1,3) (2,3) (3,3) (4,3) (5,3) (0,4) (1,4) (2,4) (3,4) (4,4) (5,4) DAAD project Joint Course on OOP using Java 76 38
Movement path of the mouse: Long form Detailed description: (0,2), step forward to (1,2), turn to right, step forward to (1,3), turn to right, turn to left, turn to left, turn to left, step forward (0,0) (1,0) (2,0) (3,0) (4,0) (5,0) (0,1) (1,1) (2,1) (3,1) (4,1) (5,1) (0,2) (1,2) (2,2) (3,2) (4,2) (5,2) (0,3) (1,3) (2,3) (3,3) (4,3) (5,3) (0,4) (1,4) (2,4) (3,4) (4,4) (5,4) DAAD project Joint Course on OOP using Java 77 Representation of the maze: store the walls For each relevant position: Is there a wall to the south boolean [][] swall Is there a wall to the east boolean [][] ewall DAAD project Joint Course on OOP using Java 78 39
Representation of the maze: store the walls boolean [][] swall (0,0) (1,0) (2,0) (3,0) (4,0) (5,0) (0,1) (1,1) (2,1) (3,1) (4,1) (5,1) (0,2) (1,2) (2,2) (3,2) (4,2) (5,2) (0,3) (1,3) (2,3) (3,3) (4,3) (5,3) (0,4) (1,4) (2,4) (3,4) (4,4) (5,4) boolean [][] ewall DAAD project Joint Course on OOP using Java 79 South walls of the maze: example boolean [][] swall = {{true, true, true, false}, {false, false, false, true}, {false, false, false, false}, {true, true, true, true}} (0,0) (1,0) (2,0) (3,0) (4,0) (5,0) (0,1) (1,1) (2,1) (3,1) (4,1) (5,1) (0,2) (1,2) (2,2) (3,2) (4,2) (5,2) (0,3) (1,3) (2,3) (3,3) (4,3) (5,3) (0,4) (1,4) (2,4) (3,4) (4,4) (5,4) DAAD project Joint Course on OOP using Java 80 40
South walls of the maze: the array boolean [][] swall = {{true, true, true, false}, {false, false, false, true}, {false, false, false, false}, {true, true, true, true}} 0 1 2 3 0 true true true false 1 false false false true 2 false false false false 3 true true true true DAAD project Joint Course on OOP using Java 81 Method outside public boolean outside (Point pos){ return ((pos.x < 1) //left... (pos.x > width) //right... (pos.y < 1) //over... (pos.y > height) //under... ); // the maze } API: Point pos : (x, y) DAAD project Joint Course on OOP using Java 82 41
Method checkwall :: technical detail Boolean checkwall (int dir, int col, int row) { switch (dir){ case NORTH: return swall[row-1][col-1]; (0,0) (1,0) (2,0) (3,0) (4,0) (5,0) case SOUTH: return swall[row][col-1];... (0,1) (1,1) (2,1) (3,1) (4,1) (5,1) (0,2) (1,2) (2,2) (3,2) (4,2) (5,2) (0,3) (1,3) (2,3) (3,3) (4,3) (5,3) (0,4) (1,4) (2,4) (3,4) (4,4) (5,4) DAAD project Joint Course on OOP using Java 83 Components: separate implementation & separate test Component test: Test of the component independent of the rest of the system. Integration test: Later on, the collaboration with other components will be tested. DAAD project Joint Course on OOP using Java 84 42
Component test of the maze class Maze { } Component to be tested class MazeTest { } Testframe for class Maze DAAD project Joint Course on OOP using Java 85 Test frame: basic principles for test output % java MazeTest Start location is (0,2): [x=0,y=2] Start direction is EAST = 1: 1 Outside true : true Not outside -> false : false Not outside -> false : false Wall -> true : true No wall -> true : true Wall -> true : true Actual value Semantic interpretation Expected value DAAD project Joint Course on OOP using Java 86 43
Implementation of the mouse Starting from the class diagram Mouse - Location : Point - Direction : int + started : boolean - themaze : Maze Mouse (Maze m) getlocation ( ) : Point stepforward ( ) turnleft ( ) turnright ( ) facingwall ( ) : boolean outsidemaze ( ) : boolean DAAD project Joint Course on OOP using Java 87 Communication between the objects: send a message Operation of the mouse public boolean facingwall() { return themaze.checkwall (direction, location); } Operation of the maze The mouse sends a message to the maze: If I have a certain location and direction in the maze, is then a wall in front of me? DAAD project Joint Course on OOP using Java 88 44
Methods: turnleft and turnright public void turnleft() { printoutmove( turn to the left ); direction = (direction + 3) % 4; } public void turnright() { printoutmove( turn to the right ); direction = (direction + 1) % 4; } Think about these formulas. DAAD project Joint Course on OOP using Java 89 Method: stepforward public void stepforward() { switch (direction) { case NORTH: location.y--; break; case EAST: location.x++; break; case SOUTH: location.y++; break; case WEST: location.x--; break; } printoutmove( step forward ); } DAAD project Joint Course on OOP using Java 90 45
Search algorithm: class MouseMaze (1) Moves the mouse one step forward, if necessary with turns public static void main (... ) { Maze themaze = new Maze(); Mouse littlemouse = new Mouse(theMaze); printmaze(themaze); } //move the mouse step by step do{ makestep(littlemouse); } while (!littlemouse.outsidemaze()); DAAD project Joint Course on OOP using Java 91 Search algorithm: class MouseMaze (2) Visible attribute private static void makestep(mouse m){ if (m.started){ if (!m.outsidemaze()){ } m.turnright(); while (m.facingwall()){ m.turnleft(); } m.stepforward(); } } else { m.stepforward(); m.started = true; } Moves the mouse one step forward, if necessary with turns DAAD project Joint Course on OOP using Java 92 46
Critics of the implementation Constant NORTH = 0, repeatedly defined in three classes source of error better solution: define them in an interface only once Variable started visible outside instead of this: - private + additional access operation - modify the algorithm Data representation of the maze is error-prone true/false sequencies correct? Variables height, width, size may be in contradiction to ewall, swall better let them compute Strategy of the mouse may be a part of the mouse: Other mice may have other strategies: move at the left-hand wall (mice = plural of mouse) DAAD project Joint Course on OOP using Java 93 47