233 lines
7.9 KiB
Python
233 lines
7.9 KiB
Python
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()
|