initial commit
commit
eec19ec229
@ -0,0 +1,2 @@
|
|||||||
|
.DS_STORE
|
||||||
|
venv/
|
Binary file not shown.
@ -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()
|
@ -0,0 +1 @@
|
|||||||
|
pygame==2.3.0
|
Loading…
Reference in New Issue