Presentation is loading. Please wait.

Presentation is loading. Please wait.

Marine Biology Simulation Part II: Assignment, Milestone 1

Similar presentations


Presentation on theme: "Marine Biology Simulation Part II: Assignment, Milestone 1"— Presentation transcript:

1 Marine Biology Simulation Part II: Assignment, Milestone 1
Dung “Zung” Nguyen Mathias Ricken Stephen Wong TeachJava 2004! June 25, 2004

2 Rice MBS Assignment Target Audience Length of Assignment
Students at the end of an objects-first CS2 Length of Assignment Two milestones Approximately 10 hours of work Probably supported by one or two labs The Role of Programming: Vital skill Should be mastered early Usually taught imperative-first

3 Studying the Case Study
White-box Framework: Extension by Subclassing Re-implement as per given specs. Pedagogy: Modular design enables students to work on smaller pieces Give jar files of framework to start Students guided by unit test requirements Exercises: new fish, new environments add features (e.g. breeding, eating, etc) Re-implementation of initially supplied compiled classes. UnboundedEnv SimpleFish Unit tests guide the way Variant Environment Behavior Variant Fish Behavior

4 Studying the Case Study
Static Behavior! Separate the variants from the invariants + void move() Strategy Pattern Dynamic Behavior Change

5 Rice MBS Assignment Milestone 1 Milestone 2 Part 1: KnightFish
Add a new fish species to the simulation Part 2: WrappingEnv Add a new kind of environment Milestone 2 Part 3: Internals Re-implement parts of the simulation framework Part 4: Behavior Strategies Refactor framework to allow dynamic behavior changes

6 Preparation Read assignment document
Download materials for Milestone 1 milestone1.zip Unzip into empty directory Open DrJava Copy your drjava.jar into the project directory

7 Configuring DrJava Add RiceMBSfw.jar file to “Extra Classpath”
Edit, Preferences, Resource Locations Click on “Add” button Click on RiceMBSfw.jar file and “Select” Click on “OK” at the bottom of the dialog Now the framework has been added and can be used without source Make sure you run in “Full Java”

8 Running the Simulation
In the “Interactions” pane, type java controller.MBSController Play around with the simulation Create new environment Edit environment Add fish Run simulation

9 Part 1: KnightFish 1 2 8 3 7 4 6 5 Randomly pick one of 8 targets
Example: 3 1 2 8 3 7 4 6 5

10 Part 1: KnightFish 3 Turn into right direction
Attempt one step forward If blocked, done If open, go there 3

11 Part 1: KnightFish 3 Attempt a second step Turn into right direction
If blocked, done If open, go there Turn into right direction 3

12 Part 1: KnightFish 3 Attempt the third and last step If blocked, done
If open, go there 3

13 Part 1: KnightFish 3 Moves almost like a knight, except… No jumping
If blocked, might stop on the way 3 Stop here Stop here Stop here

14 Part 1: KnightFish Complicated behavior Delegation method
Procedural programming: many nested if-statements Delegation method Nested visitors Cannot forget to handle a situation (compiler error!) Process flow diagramming Makes designing complex algorithm a systematic process

15 Part 1: KnightFish Students do this assignment
Most of the code can be taken from existing examples For lack of time, we will do something simpler Fish attempts to move forward If blocked, turn around 180 degrees If open, go there Open TeachFish.java in model.fish

16 Part 1: KnightFish protected void move() tryMoveFwd( , ); }
Ask local environment to move forward protected void move() tryMoveFwd( , ); } new ILambda() { public Object apply(Object notUsed) { turnRight(Math.PI); return null; } Command to execute if blocked new ILambda() { public Object apply(Object moveCmd) { ((ILambda)moveCmd).apply(null); return null; } ((ILambda)moveCmd).apply(null); Tell the local environment to actually move the fish Command to execute if unblocked

17 New fish class loaded at runtime!
Part 1: KnightFish Compile the file Run the simulation Create a new environment, and edit it Add a fish Select “Add…” Enter model.fish.TeachFish and hit “Create” Click somewhere on the map New fish class loaded at runtime!

18 Part 2: WrappingEnv Grid-based, bounded, and rectangular environment
If the fish leaves on one side, it re-enters from the other side Topology: torus (donut)

19 Part 2: WrappingEnv Very similar to BoundedEnv
In BoundedEnv, the Location class computes a neighboring location by adding a direction vector to its own coordinates. The new coordinates might be inside or outside the environment. Can new coordinates ever be outside in WrappingEnv? No! It wraps around!

20 If you go from 0 to the left, you end up at (width-1)!
Part 2: WrappingEnv The leftmost x-coordinate that is still inside the environment is 0. The rightmost one is (width-1). In BoundedEnv, the x-coordinate of the neighbor from there to the left is -1. What’s the x-coordinate of the left neighbor in WrappingEnv? If you go from 0 to the left, you end up at (width-1)!

21 Inheritance! Let WrappingEnv extend BoundedEnv
Part 2: WrappingEnv The necessary changes are centralized in a single method, WrappingEnv.Location.getNeighbor. Since BoundedEnv and WrappingEnv are so similar, what OO technique can we apply to maximize code-reuse? Inheritance! Let WrappingEnv extend BoundedEnv

22 Part 2: WrappingEnv Need to write constructors
The framework uses factory methods Abstract creation To complete the environment, we have to override the factory methods WrappingEnv.makeLocation WrappingEnv.makeEnvFactory (code provided for makeEnvFactory) Students’ code is still based on existing code, but cannot simply be copied and modified anymore

23 Part 2: WrappingEnv Open WrappingEnv.java in sysModel.env
The project was split into “model” and a “sysModel” packages to clearly separate system code (environments) from user code (fish) Fish more likely to get changed than environments Edit the WrappingEnv.Location.getNeighbor method Students would have to do a little bit more

24 Part 2: WrappingEnv public ASquareEnv.Location getNeighbor(Direction dir) { double newX = getX() + dir.getDeltaX(); double newY = getY() + dir.getDeltaY(); if (newX < 0) { newX = _width + newX; } else if (newX >= _width) { newX = newX - _width; if (newY < 0) { newY = _height + newY; else if (newY >= _height) { newY = newY - _height; return makeLocation(newX,newY);

25 Part 2: WrappingEnv Compile the file Run the simulation
Create a new environment Select “Add…” Enter sysModel.env.WrappingEnv and hit “Create” Pick a size and create the environment Add fish

26 End of Milestone 1 Students submit code for Part 1 and Part 2
Material for Milestone 2 gets released after submission deadline Contains solutions for Milestone 1


Download ppt "Marine Biology Simulation Part II: Assignment, Milestone 1"

Similar presentations


Ads by Google