260 likes | 278 Views
Marine Biology Simulation Part II: Assignment, Milestone 1. Dung “Zung” Nguyen Mathias Ricken Stephen Wong. TeachJava 2004! June 25, 2004. Rice MBS Assignment. Target Audience Students at the end of an objects-first CS2 Length of Assignment Two milestones Approximately 10 hours of work
E N D
Marine Biology SimulationPart II: Assignment, Milestone 1 Dung “Zung” Nguyen Mathias Ricken Stephen Wong TeachJava 2004! June 25, 2004
Rice MBS Assignment • Target Audience • 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
Re-implement as per given specs. Re-implement as per given specs. SimpleFish UnboundedEnv Studying the Case Study White-box Framework: Extension by Subclassing Unit tests guide the way Variant Environment Behavior Variant Fish Behavior
+ void move() + void move() + void move() Studying the Case Study Static Behavior! Separate the variants from the invariants Strategy Pattern Dynamic Behavior Change
Rice MBS Assignment • Milestone 1 • 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
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
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”
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
Part 1: KnightFish • Randomly pick one of 8 targets • Example: 3 1 2 8 3 7 4 6 5
Part 1: KnightFish • Turn into right direction • Attempt one step forward • If blocked, done • If open, go there 3
Part 1: KnightFish • Attempt a second step • If blocked, done • If open, go there • Turn into right direction 3
Part 1: KnightFish • Attempt the third and last step • If blocked, done • If open, go there 3
Part 1: KnightFish • Moves almost like a knight, except… • No jumping • If blocked, might stop on the way 3 Stop here Stop here Stop here
Part 1: KnightFish • Complicated behavior • 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
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
Part 1: KnightFish 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
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 • Run the simulation New fish class loaded at runtime!
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)
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? Answer is part of class assignment and has been removed
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? Answer is part of class assignment and has been removed
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? Answer is part of class assignment and has been removed
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
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
Part 2: WrappingEnv Code is part of a class assignment and has been removed
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 • Run the simulation
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