ticket-to-campaign/data-generator.py

132 lines
4.0 KiB
Python

# 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)