diff --git a/car.c b/car.c index 22c7cb6..553c383 100644 --- a/car.c +++ b/car.c @@ -14,24 +14,34 @@ struct CarData { Color color; double fill_level; double acceleration_rate; - int speed; + double speed; }; +static struct CarData aixam = {AIXAM, RED, 16.0, 0.0, -1}; +static struct CarData fiat_multipla_green = {FIAT_MULTIPLA, GREEN, 65.0, 0.0, -1}; +static struct CarData fiat_multipla_blue = {FIAT_MULTIPLA, BLUE, 65.0, 0.0, -1}; +static struct CarData fiat_multipla_orange = {FIAT_MULTIPLA, ORANGE, 65.0, 0.0, -1}; +static struct CarData jeep_silver = {JEEP, SILVER, 80.0, 0.0, -1}; +static struct CarData jeep_black = {JEEP, BLACK, 80.0, 0.0, -1}; + +// Create a local array car_park to store all cars +static struct CarData* car_park[] = { + &aixam, + &fiat_multipla_green, + &fiat_multipla_blue, + &fiat_multipla_orange, + &jeep_silver, + &jeep_black +}; + +#define TOTAL_CARS (sizeof(car_park) / sizeof(car_park[0])) + + Car get_car(CarType carType) { - static struct CarData car_park[] = { - {AIXAM, RED, 16.0, 0.0, -1}, - {FIAT_MULTIPLA, GREEN, 65.0, 0.0, -1}, - {FIAT_MULTIPLA, BLUE, 65.0, 0.0, -1}, - {FIAT_MULTIPLA, ORANGE, 65.0, 0.0, -1}, - {JEEP, SILVER, 80.0, 0.0, -1}, - {JEEP, BLACK, 80.0, 0.0, -1} - }; - int length = sizeof(car_park) / sizeof(car_park[0]); - for (int i = 0; i < length; i++) { - if (car_park[i].type == carType && car_park[i].speed == -1) { - Car carToReturn = &car_park[i]; - car_park[i].speed = 0; - return carToReturn; + for (int i = 0; i < TOTAL_CARS; i++) { + if (car_park[i]->type == carType && car_park[i]->speed == -1) { + car_park[i]->speed = 0; + return car_park[i]; } } return 0; @@ -54,17 +64,70 @@ double get_acceleration_rate(Car car) { } int get_speed(Car car) { - return car->speed; + if (car->speed - (int)car->speed >= 0.5) { + return (int)car->speed + 1; + } + return (int)car->speed; } void set_acceleration_rate(Car car, double acceleration_rate) { - car->acceleration_rate = acceleration_rate; + double max_accel; + double min_accel = -8.0; + + switch (get_type(car)) { + case AIXAM: + max_accel = 1.0; + break; + case FIAT_MULTIPLA: + max_accel = 2.26; + break; + case JEEP: + max_accel = 3.14; + break; + default: + max_accel = 0.0; + break; + } + + if (acceleration_rate > max_accel) { + car->acceleration_rate = max_accel; + } else if (acceleration_rate < min_accel) { + car->acceleration_rate = min_accel; + } else { + car->acceleration_rate = acceleration_rate; + } } void accelerate(Car car) { - car->speed += 4; + if (car->speed == -1) { + return; + } + double max_speed; + switch(get_type(car)) { + case AIXAM: + max_speed = 45; + break; + case FIAT_MULTIPLA: + max_speed = 170; + break; + case JEEP: + max_speed = 196; + break; + default: + max_speed = 0; + break; + } + double calc_speed = car->speed + car->acceleration_rate * 3.6061946903; + if (calc_speed >= max_speed) { + car->speed = max_speed; + return; + } + car->speed = calc_speed; } void init() { - return; + for (int i = 0; i < TOTAL_CARS; i++) { + car_park[i]->speed = -1; + car_park[i]->acceleration_rate = 0.0; + } } \ No newline at end of file