from enum import Enum from random import randrange from time import sleep print("v1") class Stats(Enum): SPD = "SPEED" HND = "HANDLING" BRK = "BRAKING" class Skills(Enum): FM = "FUEL MANAGEMENT" TM = "TYRE MANAGEMENT" def roll(modifier = 0): rolled = randrange(1, 7, 1) + modifier if rolled < 1: rolled = 1 return rolled class Player(): def __init__(self, name, spd, hnd, brk, skill): self.name = name self.SPD = spd self.HND = hnd self.BRK = brk self.skill = skill self.SP = 0 def roll(self, stat, skill = None): rolled = roll(0) if stat == Stats.SPD: rolled += self.SPD elif stat == Stats.HND: rolled += self.HND elif stat == Stats.BRK: rolled += self.BRK if skill == self.skill: rolled += 1 return rolled def info(self): print(f"{self.name}:") print(f"\tSPD: {self.SPD}") print(f"\tHND: {self.HND}") print(f"\tBRK: {self.BRK}") print(f"\tSkill: {self.skill.value}") print(f"\tSkill Points: {self.SP}") class Obstacle(): def __init__(self, name, stat, skill): self.name = name self.stat = stat self.skill = skill def info(self): print(f"{self.name}") print(f"\tStat: {self.stat.value}") print(f"\tSkill: {self.skill.value}") class Track(): def __init__(self, name): self.name = name self.obstacles = [] def add_obstacle(self, obstacle): self.obstacles.append(obstacle) def info(self): print("---") print(f"{self.name}") for o in self.obstacles: o.info() print("---") class Game(): def __init__(self, player1, player2, track): self.p1 = player1 self.p2 = player2 self.track = track self.laps = 0 self.current_lap = 1 self.round = 0 self.leader = None self.lead = 0 def roll_laps(self): self.laps = roll(-2) def get_obstacle_index(self): return self.round % len(self.track.obstacles) def get_obstacle(self): return self.track.obstacles[self.get_obstacle_index()] def is_new_lap(self): return True if self.get_obstacle_index() == 0 and self.round != 0 else False def play_round(self): if self.is_new_lap(): self.current_lap += 1 if self.current_lap > self.laps: print("It's over!") print("") print("\tSUMMARY:") if self.leader: print(f"\t\tWINNER: {self.leader.name} by +{self.lead}") else: print(f"\t\tWINNER: A DRAW!") print(f"--- {self.p1.name} ---") print(f"SP: {self.p1.SP}") print("") print(f"--- {self.p2.name} ---") print(f"SP: {self.p2.SP}") else: print("========================================================") print(f"Round {self.round} | Lap {self.current_lap}/{self.laps}") print("--------------------------------------------------------") if self.round == 0: p1_roll = self.p1.roll(Stats.SPD) p2_roll = self.p2.roll(Stats.SPD) print("Green flag, the race has started") if p1_roll > p2_roll: print(f"{self.p1.name} gets a good start and takes the lead") self.p1.SP += 1 self.leader = self.p1 self.lead = 1 elif p2_roll > p1_roll: print(f"{self.p2.name} gets a good start and takes the lead") self.p2.SP += 1 self.leader = self.p2 self.lead = 1 else: print("Both drivers get a good start and they're neck and neck") else: obstacle = self.get_obstacle() print(obstacle.name) obstacle_roll = roll(4) p1_roll = self.p1.roll(obstacle.stat, obstacle.skill) p2_roll = self.p2.roll(obstacle.stat, obstacle.skill) print(f"{self.p1.name} vs {obstacle.name}") print(f"{p1_roll} vs {obstacle_roll}") if p1_roll > obstacle_roll: self.p1.SP += 1 print(f"> {self.p1.name} gains 1 SP for a total of {self.p1.SP}!") if self.leader == self.p1: self.lead += 1 print(f"> {self.p1.name}'s lead extends to +{self.lead}") elif self.leader == None: self.leader = self.p1 self.lead = 1 print(f"> {self.p1.name} takes the lead") elif self.leader == self.p2: self.lead -= 1 if self.lead == 0: self.leader = None print(f"> {self.p1.name} negates {self.p2.name}'s lead. It's neck and neck.") else: print(f"> {self.p1.name} reduces {self.p2.name}'s lead to +{self.lead}.") else: if self.leader == self.p1 and p2_roll > p1_roll: self.lead -= 1 if self.lead > 0: print(f"> {self.p1.name}'s lead drops to +{self.lead}") else: self.leader = None print(f"> {self.p1.name} loses their lead") print(f"{self.p2.name} vs {obstacle.name}") print(f"{p2_roll} vs {obstacle_roll}") if p2_roll > obstacle_roll: self.p2.SP += 1 print(f"> {self.p2.name} gain 1 SP for a total of {self.p2.SP}!") if self.leader == self.p2: self.lead += 1 print(f"> {self.p2.name}'s lead extends to +{self.lead}") elif self.leader == None: self.leader = self.p2 self.lead = 1 print(f"> {self.p2.name} takes the lead") elif self.leader == self.p1: self.lead -= 1 if self.lead == 0: self.leader = None print(f"> {self.p2.name} negates {self.p1.name}'s lead. It's neck and neck.") else: print(f"> {self.p2.name} reduces {self.p1.name}'s lead to +{self.lead}.") else: if self.leader == self.p2 and p1_roll > p2_roll: self.lead -= 1 if self.lead > 0: print(f"> {self.p2.name}'s lead drops to +{self.lead}") else: self.leader = None print(f"> {self.p2.name} loses their lead") #sleep(5) self.round += 1 self.play_round() player1 = Player("Player 1", 3, 2, 1, Skills.FM) player2 = Player("Player 2", 1, 3, 2, Skills.TM) track = Track("Track 1") start_finish_straight = Obstacle("Start Finish Straight", Stats.SPD, Skills.FM) turn1 = Obstacle("Turn 1", Stats.BRK, Skills.TM) turn2 = Obstacle("Turn 2", Stats.HND, Skills.FM) back_straight = Obstacle("Back Straight", Stats.BRK, Skills.TM) turn3 = Obstacle("Turn 3", Stats.HND, Skills.TM) turn4 = Obstacle("Turn 4", Stats.SPD, Skills.FM) track.add_obstacle(start_finish_straight) track.add_obstacle(turn1) track.add_obstacle(turn2) track.add_obstacle(back_straight) track.add_obstacle(turn3) track.add_obstacle(turn4) player1.info() player2.info() track.info() game = Game(player1, player2, track) game.roll_laps() print(f"Laps: {game.laps}") game.play_round()