diff --git a/main.py b/main.py index cd8bcd2..ebb63fc 100644 --- a/main.py +++ b/main.py @@ -2,118 +2,13 @@ # Imports import os -import random import jsonpickle + +from src.Circus import Circus +from src.TreasureCard import TreasureCard +from src.Player import Player, ConcessionCard from src.MamaOConnel import MamaOConnel -class Circus: - # There are: - # 4 wagons of each colors (until 2 players' stop) - # 2 wagons of each colors (until 3 players' stop) - # 2 wagons of each colors (until 4 players' stop) - # 2 wagons of each colors (until 5 players' stop) - # NOTE: In the original distribution, the same color never appears twice in a row - # We chose to remove this constraint, for the sake of simplicity - - def __init__(self, playersNb): - wagonsPerColors = 2 * playersNb - colors = "blue", "green", "black", "red", "yellow" - remaining = {"blue": wagonsPerColors, "green": wagonsPerColors, "black": wagonsPerColors, "red": wagonsPerColors,\ - "yellow": wagonsPerColors} - self.wagons = [] - for n in range(0, 5 * wagonsPerColors): - color = colors[random.randint(0, 4)] - while remaining[color] == 0: - color = colors[random.randint(0, 4)] - self.wagons.append(color) - remaining[color] = remaining[color] - 1 - self.state = 0 # 0 means Circus is not used in game yet, 1 means next wagon in list is #1, and so on - - def enable(self): - if self.state > 0: - print("Circus is already in game.") - return False - self.state = 1 - - def getNextColor(self): - return self.wagons[self.state - 1] - - def takeWagon(self): - if self.state == 0: - print("Circus is not or no longer in game.") - return False - print("Player obtained a " + self.wagons[self.state - 1] + " circus sticker!") - self.state = self.state + 1 - if self.state > len(self.wagons): - print("Circus stickers are now depleted.") - self.state = 0 # effectively disable circus - -class TreasureCard: - - def __init__(self): - self.treasures = [36, 33, 29, 27, 24] - self.state = -1 # disabled - - def enable(self): - self.state = 0 # 0 means 0 treasures have been found - - def getFoundNumber(self): - if self.state == -1: - print("Treasure hunt has not started yet or is completed.") - return False - return self.state - - def takeTreasure(self): - if self.state == -1: - print("Treasure hunt has not started yet or is completed.") - return False - print("Congrats! You obtained $" + str(self.treasures[self.state])) - self.state = self.state + 1 - if self.state == 5: - print("All treasures have been found.") - self.state = -1 # effectively disable treasure card - - -class ConcessionCard: - # Each card contains: - # 6 cities to connect to the player's concession. There is no need to implement those. - # 7 gold nuggets, as rewards when the player succefully connects a city to their concession. The player can choose - # which nugget to earn, and then discovers the associated reward (between 11 and 17 coins). - # A ConcessionCard is then composed of 7 nuggets, with the rewards randomly distributed. - - def __init__(self): - availableValues = [11, 12, 13, 14, 15, 16, 17] - nuggetsNb = len(availableValues) - 1 - self.nuggets = [] - for n in range(0, 7): - choice = random.randint(0, nuggetsNb - n) - self.nuggets.append(availableValues[choice]) - availableValues.pop(choice) - self.taken = set() - - def getRemainingPepites(self): - return {1, 2, 3, 4, 5, 6, 7} - self.taken - - def takeReward(self, choice): - if not choice.isdigit(): - print("Please choose a number.") - return False - choice = int(choice) - if choice not in range(1, 8): - print("This is not a valid number") - return False - if choice in self.taken: - print(str(choice) + " has already been obtained.") - return False - self.taken.add(choice) - print("Congrats! You obtained $" + str(self.nuggets[choice - 1])) - -class Player: - - def __init__(self, color): - self.color = color - self.concession = ConcessionCard() - class Game: # initGame() is used to generate all data for a campaign and initialize status variables diff --git a/src/Circus.py b/src/Circus.py new file mode 100644 index 0000000..fa83640 --- /dev/null +++ b/src/Circus.py @@ -0,0 +1,43 @@ +import random + +class Circus: + # There are: + # 4 wagons of each colors (until 2 players' stop) + # 2 wagons of each colors (until 3 players' stop) + # 2 wagons of each colors (until 4 players' stop) + # 2 wagons of each colors (until 5 players' stop) + # NOTE: In the original distribution, the same color never appears twice in a row + # We chose to remove this constraint, for the sake of simplicity + + def __init__(self, playersNb): + wagonsPerColors = 2 * playersNb + colors = "blue", "green", "black", "red", "yellow" + remaining = {"blue": wagonsPerColors, "green": wagonsPerColors, "black": wagonsPerColors, "red": wagonsPerColors,\ + "yellow": wagonsPerColors} + self.wagons = [] + for n in range(0, 5 * wagonsPerColors): + color = colors[random.randint(0, 4)] + while remaining[color] == 0: + color = colors[random.randint(0, 4)] + self.wagons.append(color) + remaining[color] = remaining[color] - 1 + self.state = 0 # 0 means Circus is not used in game yet, 1 means next wagon in list is #1, and so on + + def enable(self): + if self.state > 0: + print("Circus is already in game.") + return False + self.state = 1 + + def getNextColor(self): + return self.wagons[self.state - 1] + + def takeWagon(self): + if self.state == 0: + print("Circus is not or no longer in game.") + return False + print("Player obtained a " + self.wagons[self.state - 1] + " circus sticker!") + self.state = self.state + 1 + if self.state > len(self.wagons): + print("Circus stickers are now depleted.") + self.state = 0 # effectively disable circus diff --git a/src/Player.py b/src/Player.py new file mode 100644 index 0000000..7d8559e --- /dev/null +++ b/src/Player.py @@ -0,0 +1,41 @@ +import random + +class ConcessionCard: + # Each card contains: + # 6 cities to connect to the player's concession. There is no need to implement those. + # 7 gold nuggets, as rewards when the player succefully connects a city to their concession. The player can choose + # which nugget to earn, and then discovers the associated reward (between 11 and 17 coins). + # A ConcessionCard is then composed of 7 nuggets, with the rewards randomly distributed. + + def __init__(self): + availableValues = [11, 12, 13, 14, 15, 16, 17] + nuggetsNb = len(availableValues) - 1 + self.nuggets = [] + for n in range(0, 7): + choice = random.randint(0, nuggetsNb - n) + self.nuggets.append(availableValues[choice]) + availableValues.pop(choice) + self.taken = set() + + def getRemainingPepites(self): + return {1, 2, 3, 4, 5, 6, 7} - self.taken + + def takeReward(self, choice): + if not choice.isdigit(): + print("Please choose a number.") + return False + choice = int(choice) + if choice not in range(1, 8): + print("This is not a valid number") + return False + if choice in self.taken: + print(str(choice) + " has already been obtained.") + return False + self.taken.add(choice) + print("Congrats! You obtained $" + str(self.nuggets[choice - 1])) + +class Player: + + def __init__(self, color): + self.color = color + self.concession = ConcessionCard() diff --git a/src/TreasureCard.py b/src/TreasureCard.py new file mode 100644 index 0000000..c82ef90 --- /dev/null +++ b/src/TreasureCard.py @@ -0,0 +1,24 @@ +class TreasureCard: + + def __init__(self): + self.treasures = [36, 33, 29, 27, 24] + self.state = -1 # disabled + + def enable(self): + self.state = 0 # 0 means 0 treasures have been found + + def getFoundNumber(self): + if self.state == -1: + print("Treasure hunt has not started yet or is completed.") + return False + return self.state + + def takeTreasure(self): + if self.state == -1: + print("Treasure hunt has not started yet or is completed.") + return False + print("Congrats! You obtained $" + str(self.treasures[self.state])) + self.state = self.state + 1 + if self.state == 5: + print("All treasures have been found.") + self.state = -1 # effectively disable treasure card