# Generation of data for a campaign of Ticket to Ride Legacy Legends of the West # Imports import os import random import jsonpickle 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 getWagon(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) - 1: print("Circus stickers are now depleted.") self.state = 0 class ConcessionCard: # name may be different in English # Each card contains: # 6 cities to connect to the player's concession. There is no need to implement those. # 7 gold "pepites", as rewards when the player succefully connects a city to their concession. The player can choose # which "pepite" to earn, and then discovers the associated reward (between 11 and 17 coins). # A ConcessionCard is then composed of 7 pepites, with the rewards randomly distributed. def __init__(self): availableValues = [11, 12, 13, 14, 15, 16, 17] pepitesNb = len(availableValues) - 1 self.pepites = [] for n in range(0, 7): choice = random.randint(0, pepitesNb - n) self.pepites.append(availableValues[choice]) availableValues.pop(choice) self.taken = [] def getReward(self, choice): if choice in self.taken: print(str(choice) + " has already been obtained.") return False self.taken.append(choice) print("Congrats! You obtained $" + str(self.pepites[choice])) return True 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 def initGame(self, playersNb): # Game status self.year = 1858 # General data to generate self.circus = Circus(playersNb) # Mama O'Connell # Treasures # Players self.players = [] for n in range(0, playersNb): color = input("Enter the player's color: ") self.players.append(Player(color)) # TODO: print status of the game (year, players (color, concession pepites), circus next wagon, treasures remaining to find) #def printStatus(self): def saveData(self): savefile = open('./savefile.json', 'w+') savefile.write(jsonpickle.encode(self)) savefile.close() def loadData(): with open('./savefile.json', 'r') as savefile: content = savefile.read() data = jsonpickle.decode(content) return data # TESTS playersNb = 3 # Test of data generation # myGame = Game() # myGame.initGame(playersNb) # myGame.saveData() # Test of data loading # myGame = loadData() # print(myGame.year) # print(myGame.circus.wagons) # Test of ConcessionCard cc = ConcessionCard() userChoice = 3 print(cc.pepites) cc.getReward(userChoice - 1) print(cc.pepites) print(cc.taken) cc.getReward(userChoice - 1) print(cc.pepites) print(cc.taken) # Test of Player # myGame = Game() # myGame.initGame(playersNb) # print(myGame.players[1].color) # print(myGame.players[1].concession.pepites)