See Class website for links to Gridworld Code, installation and student manual http://staff.rentonschools.us/hhs/apcomp-science/gridworld-links About ¼ of the AP Exam will be related to the case study ◦ Roughly 6-8 multiple choice questions and 1 free response question For some classes you are only expected to know the API For others, you are expected to know the implementation You will be asked to: ◦ Demonstrate understanding of the existing code ◦ Describe changes to existing code to get new behavior ◦ Extend existing classes to get new types of Actors ◦ Use GridWorld classes to implement other programs (such as games) Single constructor: ◦ Location(int r, int c) Accessors: ◦ int getRow() ◦ int getCol() ◦ Location getAdjacentLocation(int direction) Gets the Location next to this one in the given direction ◦ int getDirectionToward(Location target) Gets the direction in which target lies from this Location Uses only compass directions Constant fields - Directions: ◦ ◦ ◦ ◦ ◦ ◦ ◦ ◦ int int int int int int int int NORTH = 0 EAST = 90 SOUTH = 180 WEST = 270 NORTHEAST = SOUTHEAST = SOUTHWEST = NORTHWEST = 45 135 225 315 Constant fields - Angles: ◦ ◦ ◦ ◦ ◦ ◦ ◦ int int int int int int int LEFT = -90 RIGHT = 90 HALF_LEFT = -45 HALF_RIGHT = 45 FULL_CIRCLE = 360 HALF_CIRCLE = 180 AHEAD = 0 Actor is the base class which all things that…act will extend Most of the work you do will be extending or changing Actor or one of its subclasses You will want to be very comfortable with the Actor API Single, default constructor Accessors: ◦ ◦ ◦ ◦ Color getColor() int getDirection() Grid<Actor> getGrid() Location getLocation() Modifiers: ◦ setColor(Color newColor) Color class contains public final fields for a bunch of colors ◦ setDirection(int newDirection) Directions are integers with 0 <= d <= 359 Working in Grids ◦ putSelfInGrid(Grid<Actor> gr, Location loc) ◦ removeSelfFromGrid() Do not try to add Actors to Grids directly– use these methods ◦ moveTo(Location newLocation) Acting ◦ act() By default, just reverses direction (rotates 180 degrees) Will be override in almost all subclasses of Actor The Rock class ◦ Two constructors: Rock() Creates a black rock Rock(Color rockColor) Creates a rock of the given color ◦ act() overriden to do nothing! (Yes, you can do that.) The Flower class ◦ Two constructors: Flower() Creates a pink flower Flower(Color initialColor) Creates a flower of the given color ◦ act() overriden to darken the flower’s color Exercise 1: Extend the Flower class by creating SpinningFlower which rotates half a turn to the right each time it acts (in addition to darkening) Exercise 2: Create a DyingFlower class that extends Flower and acts like a flower, except after a given number of actions, it “dies” by removing itself (lifetime specified in constructor) ◦ Hint: you will need a variable to track the number of actions performed Bugs are Actors that move around the Grid in various ways As they move, Bugs leave behind Flowers ◦ The Flower will be the same color as the Bug Two constructors ◦ default and with a single Color argument act() overridden to: ◦ Check if the Bug can move straight ahead ◦ If so, move and leave a Flower behind ◦ Otherwise, turn New methods ◦ canMove() Determines if the Bug can move forward (space ahead is empty or contains a Flower) ◦ move() Moves the Bug forward and leaves a Flower in the previously occupied location ◦ turn() Turns the Bug 45 degrees to the right (half-turn right) We can create new types of Bugs by extending the Bug class BoxBug draws a square with the Flowers it leaves behind Two new instance variables: ◦ int sideLength ◦ int steps One new constructor: ◦ BoxBug(int n) Creates a BoxBug that will draw a square of the given size Overrides act() ◦ Does not override or add any other methods! Exercise 3: Create a CircleBug class extending Bug that works like BoxBug, but draws a circle instead of a square Exercise 4: Create a ZigZagBug class extending Bug that walks in a zig-zag pattern Critters are Actors that interact with other Actors in the Grid ◦ The specific way they interact can vary by the type of Critter Critters can also move non-deterministically ◦ That is, the Critter might not move the same way even though the circumstances are the same You are discouraged from overriding act() ◦ If you need to modify act(), you probably shouldn’t extend Critter Exercise 5: Without looking at the source code try to figure out what each of getActors(), processActors(), getMoveLocations(), selectMoveLocation(), and makeMove() do in the Critter class getActor(): gets all neighboring Actors processActors(): “eats” (removes) all neighbors (except Rocks or Critters) getMoveLocations(): gets all empty neighboring locations selectMoveLocation(): chooses an empty neighbor randomly makeMove(): moves to selected location A ChameleonCritter is a Critter except that: ◦ Instead of “eating” its neighbors, it picks one at random and changes its color to match that neighbor ◦ It turns to face the direction in which it moves Which methods does ChameleonCritter override? ◦ processActors() and makeMove() Exercise 6: Write a class HungryCritter that acts like a ChameleonCritter except that it eats any neighbors that have the same color it does after changing color Exercise 7: Write a class RockCritter that acts like a Critter, except that instead of eating neighbors, it turns them all into Rocks of the same color