commit eec19ec229fb7b747ce73d18dc5202b068226912 Author: The-Tysonator Date: Sun Apr 23 15:26:18 2023 +0100 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bc6664a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_STORE +venv/ \ No newline at end of file diff --git a/assets/music.mp3 b/assets/music.mp3 new file mode 100644 index 0000000..d0cee17 Binary files /dev/null and b/assets/music.mp3 differ diff --git a/car_simulator.py b/car_simulator.py new file mode 100755 index 0000000..a44e0d5 --- /dev/null +++ b/car_simulator.py @@ -0,0 +1,182 @@ +# Imports +import pygame +import random + +# Pygame Setup +pygame.init() +WINDOW_WIDTH = 1000 +WINDOW_HEIGHT = 500 +screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) +clock = pygame.time.Clock() + +# Assets +pygame.mixer.music.load("assets/music.mp3") + +# Render Background +def render_backround(screen): + # Grass + screen.fill((22,135,0)) + # Roads + for y in range(5): + pygame.draw.rect(screen, (102, 92, 92), (0, 20 + y * 100, 1000, 60)) + # Yellow Lines + for y in range(5): + for x in range(10): + pygame.draw.rect(screen, (204, 204, 0), (10 + x * 100, (20 + y * 100) + 25, 75, 10)) + +# Car +class Car(): + # Class Variables + cars = [] + # Constructor Method + def __init__(self, top_speed, acceleration, color): + # Variable Checks + if type(top_speed) != type(0): + raise TypeError("TypeError - top_speed must be an integer") + elif top_speed <= 0: + raise ValueError("ValueError - top_speed must be positive") + if type(acceleration) != type(0): + raise TypeError("TypeError - acceleration must be an integer") + elif acceleration <= 0: + raise ValueError("ValueError - acceleration must be positive") + if type(color) != type(()): + raise TypeError("TypeError - color must be a tuple") + elif len(color) != 3: + raise ValueError("ValueError - color must contain three values") + elif color[0] < 0 or color[0] > 255 or color[1] < 0 or color[1] > 255 or color[2] < 0 or color[2] > 255: + raise ValueError("ValueError - color value must be between 0 and 255") + # Variables + self.__top_speed = top_speed + self.__acceleration = acceleration / 160 + self.__color = color + self.__speed = 0 + self.__distance = 0 + # Add Car + self.cars.append(self) + # Drive Method + def drive(self): + # Update Acceleration + if self.__speed < self.__top_speed: + self.__speed += self.acceleration + if self.__speed > self.__top_speed: + self.__speed = self.__top_speed + # Update Distance + self.__distance += self.__speed / 64 + # Class Methods + @classmethod + def number_of_cars(cls): + return len(cls.cars) + # Static Methods + @staticmethod + def i_am_a_car(): + print("I am a Car!") + # Getters + @property + def top_speed(self): + return self.__top_speed + @property + def acceleration(self): + return self.__acceleration + @property + def color(self): + return self.__color + @property + def speed(self): + return self.__speed + @property + def distance(self): + return self.__distance + # Setters + @top_speed.setter + def top_speed(self, value): + if type(value) != type(0): + raise TypeError("TypeError - top_speed must be an integer") + elif not value > 1: + raise ValueError("ValueError - top_speed must be positive") + else: + self.__top_speed = value + @acceleration.setter + def acceleration(self, value): + if type(value) != type(0): + raise TypeError("TypeError - acceleration must be an integer") + elif not value > 1: + raise ValueError("ValueError - acceleration must be positive") + else: + self.__acceleration = value + @color.setter + def color(self, value): + if type(value) != type(()): + raise TypeError("TypeError - color must be a tuple") + elif len(value) != 3: + raise ValueError("ValueError - color must contain three values") + elif value[0] < 0 or value[0] > 255 or value[1] < 0 or value[1] > 255 or value[2] < 0 or value[2] > 255: + raise ValueError("ValueError - color value must be between 0 and 255") + else: + self.__color = value + @speed.setter + def speed(self, value): + if type(value) != type(0) or type(value) != type(0.0): + raise TypeError("TypeError - speed must be a number") + else: + self.__speed = value + @distance.setter + def distance(self, value): + if type(value) != type(0) or type(value) != type(0.0): + raise TypeError("TypeError - distance must be a number") + else: + self.__distance = value + # Add Cars + def __add__(self, car): + Car.cars.remove(self) + Car.cars.remove(car) + return Car(int(self.__top_speed + car.top_speed), int(self.acceleration * 160 + car.acceleration * 160), (255, 255, 255)) + + +# Sports Car +class SportsCar(Car): + # Constructor Method + def __init__(self, top_speed, acceleration, color): + # Variables + top_speed = top_speed * 2 + acceleration = acceleration * 2 + color = color + # Create Object + super().__init__(top_speed, acceleration, color) + +# Create Cars +for car in range(5): + type_of_car = random.randint(1, 100) + if type_of_car == 1: + SportsCar(random.randint(10, 40), random.randint(10, 100), (random.randint(1, 255), random.randint(1, 255), random.randint(1, 255))) + SportsCar(random.randint(10, 40), random.randint(1, 100), (random.randint(1, 255), random.randint(1, 255), random.randint(1, 255))) + elif type_of_car > 60: + Car(random.randint(10, 40), random.randint(10, 100), (random.randint(1, 255), random.randint(1, 255), random.randint(1, 255))) + else: + SportsCar(random.randint(10, 40), random.randint(10, 100), (random.randint(1, 255), random.randint(1, 255), random.randint(1, 255))) + +# Music +pygame.mixer.music.play(-1) + +# Game Loop +winner = False +run = True +while run: + # Tick + clock.tick(60) + # Race + if winner == False: + # Background + render_backround(screen) + # Cars + for car_number, car in enumerate(Car.cars): + pygame.draw.rect(screen, car.color, (car.distance, 40 + car_number * 100, 50, 20)) + car.drive() + if car.distance >= 1000: + print(f"Car {car_number + 1} won! It was a {type(car).__name__}!") + winner = True + # Event Handler + for event in pygame.event.get(): + # Quit + if event.type == pygame.QUIT: + run = False + # Update Display + pygame.display.update() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..49f851d --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pygame==2.3.0