# 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()