diff options
Diffstat (limited to 'Week14 Route 66/src/com/camilstaps/route66/Car.java')
-rw-r--r-- | Week14 Route 66/src/com/camilstaps/route66/Car.java | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/Week14 Route 66/src/com/camilstaps/route66/Car.java b/Week14 Route 66/src/com/camilstaps/route66/Car.java new file mode 100644 index 0000000..b118a3c --- /dev/null +++ b/Week14 Route 66/src/com/camilstaps/route66/Car.java @@ -0,0 +1,179 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.camilstaps.route66; + +import java.awt.Color; +import java.awt.Graphics; +import java.util.Random; + +/** + * Class for an individual car + * + * @author Pieter Koopman, Camil Staps + */ +public class Car { + public static final int + CARWIDTH = 20, + CARLENGTH = 40, + MINCARSPACE = 5, + MINCARSPEED = 2, + MAXCARSPEED = 4; + + public static final Color[] carColours = {Color.red, Color.blue, Color.black, Color.gray, Color.green, + Color.pink, Color.orange, Color.magenta, Color.lightGray}; + + private final int speed, number; // speed and car-number + private final Direction direction; // driving direction, used by paint + private int location; // current location on the road + private final Color colour; // colour of this car + private final Random random; // here to ensure that every car gets a new + private final Driver driver; // this car's driver + private final Model model; // the model the car is in + + /** + * The constructor: + * - choose a random speed + * - set right location, direction and colour + * - create new Driver object + * + * @param number of the car + * @param model the model the car is in + */ + public Car(int number, Model model) { + this.number = number; + random = new Random(); + speed = MINCARSPEED + random.nextInt(MAXCARSPEED - MINCARSPEED + 1); + direction = Direction.intToDirection(number); + location = RoadView.WINDOWSIZE - 2 - (number/Model.DIRECTIONS) * (CARLENGTH + MINCARSPACE); + colour = carColours[number % carColours.length]; + this.model = model; + driver = new Driver(this, model); + } + + /** + * Get the driver + * @return + */ + public Driver getDriver() { + return driver; + } + + /** + * Get the direction + * @return + */ + public Direction getDirection() { + return direction; + } + + /** + * Get the number of this car + * @return + */ + public int getNumber() { + return number; + } + + /** + * Get the current location of this car + * @return + */ + public int getLocation() { + return location; + } + + /** + * Get the location the car would move to if it would move + * @return + */ + public int getNewLocation() { + return (location + speed) % RoadView.WINDOWSIZE; + } + + /** + * Move the car one step + */ + public void step() { + location = getNewLocation(); + //System.err.println("Car "); + model.update(); + } + + /** + * Is the car in front of the crossing? That is, is the car now not on the + * crossing but would it be there after the next step? + * @return + */ + public boolean isInFrontOfCrossing() { + return location < RoadView.getStartCrossing() && getNewLocation() >= RoadView.getStartCrossing(); + } + + /** + * Is the car on the crossing? + * @return + */ + public boolean isOnCrossing() { + return location > RoadView.getStartCrossing() && location - CARLENGTH < RoadView.getEndCrossing(); + } + + /** + * Paint this car + * @param g + */ + public void paint(Graphics g) { + int x, y, w, h; + switch (direction) { + case North: + x = RoadView.WINDOWSIZE / 2 + 1; + y = RoadView.WINDOWSIZE - location; + w = Car.CARWIDTH; + h = Car.CARLENGTH; + break; + case East: + x = location - Car.CARLENGTH; + y = RoadView.WINDOWSIZE / 2 + 1; + w = Car.CARLENGTH; + h = Car.CARWIDTH; + break; + case South: + x = RoadView.WINDOWSIZE / 2 - Car.CARWIDTH - 1; + y = location - Car.CARLENGTH; + w = Car.CARWIDTH; + h = Car.CARLENGTH; + break; + case West: + x = RoadView.WINDOWSIZE - location - 1; + y = RoadView.WINDOWSIZE / 2 - Car.CARWIDTH - 1; + w = Car.CARLENGTH; + h = Car.CARWIDTH; + break; + default: + x = y = w = h = 10; + } + g.setColor(colour); + g.fillRect(x, y, w, h); + g.setColor(Color.WHITE); + g.drawString(String.valueOf(number), x + w / 6, y + h / 2 + 4); + } +} |