aboutsummaryrefslogtreecommitdiff
path: root/Week14 Route 66/src/OO14route66/Car.java
blob: 6ebb863856809a9dcaaff628ee1035e0060ac4d1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package OO14route66;

import com.camilstaps.route66.Driver;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

/**
 * OO1route66 initial class
 * @author Pieter Koopman
 *
 * Class for an individual car
 */
public class Car
{
    public static final int
    CARWIDTH    = 20,
    CARLENGTH   = 40,
    MINCARSPACE = 5,
    MINCARSPEED = 2,
    MAXCARSPEED = 4;
    public static final Color[] carColors={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 color;          // color of this car
    private final Random random;        // here to ensure that every car gets a new 
    private final Driver driver;
    private final Model model;

    /**
     * The constructor
     * @param number of the car
     */
    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);
        color = carColors[number % carColors.length];
        driver = new Driver(this);
        this.model = model;
    }
    
    public Driver getDriver() {
        return driver;
    }
    
    public Direction getDirection() {
        return direction;
    }
    
    public int getNumber() {
        return number;
    }
    
    public int getNewLocation() {
        return (location + speed) % RoadView.WINDOWSIZE;
    }

    /**
     * move this car one step
     */
    public void step() {
        location = getNewLocation();
        Regelaar.getInstance().setLocation(this, location);
        model.update();
    }

    /**
     * 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(color);
        g.fillRect(x, y, w, h);
        g.setColor(Color.WHITE);
        g.drawString(String.valueOf(number), x + w / 6, y + h / 2 + 4);
    }

    /**
     * yield the current location of this car
     * @return
     */
    public int getLocation() {
        return location;
    }
}