import random class City: def __init__(self, name, neighbors): self.name = name self.neighbors = neighbors # Returns the length of the shortest way between the city and another one (target) def distance(self, target): if self == target: return 0 dist = 1 cities = [self] for city in cities: for neighbor in city.neighbors: depth = 1 if target in city.neighbors: return dist class Board: def __init__(self): self.cities = [] # NorthEast neighbors = "Quebec", "Montreal", "Boston" self.cities.append(City("Bangor", neighbors)) neighbors = "Bangor", "Montreal" self.cities.append(City("Quebec", neighbors)) neighbors = "Quebec", "Bangor", "Boston", "Albany", "Buffalo" self.cities.append(City("Montreal", neighbors)) neighbors = "Bangor", "Montreal", "Albany", "New York" self.cities.append(City("Boston", neighbors)) neighbors = "Buffalo", "Montreal", "Boston", "New York" self.cities.append(City("Albany", neighbors)) neighbors = "Detroit", "Montreal", "Albany", "New York", "Philadelphia", "Pittsburgh" self.cities.append(City("Buffalo", neighbors)) neighbors = "Buffalo", "Albany", "Boston", "Philadelphia" self.cities.append(City("New York", neighbors)) neighbors = "Buffalo", "New York", "Norfolk", "Baltimore", "Pittsburgh" self.cities.append(City("Philadelphia", neighbors)) def getCityByName(self, name): for city in self.cities: if city.name == name: return city return 0 class MamaOConnel: def __init__(self): self.board = Board() # TODO Board should be a "static" or "constant" class, see what we can do self.location = self.board.cities[random.randint(0, len(self.board.cities) - 1)] # We need at least 3 accesses to the city, to provide hints through different axes (but even cities with 3 accesses # can generate a triangle (like Bangor or Tampa), hence the need for 4 accesses) # It could be more proper to have a dedicated method to check if a city can be the location (using distance?) while len(self.location.neighbors) < 4: self.location = self.board.cities[random.randint(0, len(self.board.cities) - 1)] # # Set first hint # hint1distance = 3 # hint1list = [] # hint1list.append(self.location.neighbors[random.randint(0, len(self.location.neighbors))]) # for i in range(0, hint1distance - 2): # tmp = hint1list[i].neighbors[random.randint(0, len(hint1list[i].neighbors))] # while tmp.distance(self.location) < i + 1: # tmp = hint1list[i].neighbors[random.randint(0, len(hint1list[i].neighbors))] # hint1list.append(tmp) # self.hint1 = hint1list[hint1distance - 1] # # # Set second hint # hint2distance = 3 # hint2list = [] # tmp = self.location.neighbors[random.randint(0, len(self.location.neighbors))] # while tmp == hint1list[0]: # tmp = self.location.neighbors[random.randint(0, len(self.location.neighbors))] # hint2list.append(tmp) # for i in range(0, hint2distance - 2): # tmp = hint2list[i].neighbors[random.randint(0, len(hint2list[i].neighbors))] # while tmp.distance(self.location) < i + 1 or tmp == hint1list[i + 1]: # tmp = hint2list[i].neighbors[random.randint(0, len(hint2list[i].neighbors))] # hint2list.append(tmp) # self.hint2 = hint2list[hint2distance - 1] hints = [], [], [] hintsDistance = 3, 3, 2 for h in range(0, 2): city = self.board.getCityByName(self.location.neighbors[random.randint(0, len(self.location.neighbors) - 1)]) if h == 1: while city in hints[0]: city = self.board.getCityByName(self.location.neighbors[random.randint(0, len(self.location.neighbors) - 1)]) if h == 2: while city in hints[0] or city in hints[1]: city = self.board.getCityByName(self.location.neighbors[random.randint(0, len(self.location.neighbors) - 1)]) hints[h].append(city) for i in range(0, hintsDistance[h] - 2): city = self.board.getCityByName(hints[h][i].neighbors[random.randint(0, len(hints[h][i].neighbors) - 1)]) while city.distance(self.location) < i + 1 or h >= 1 and city in hints[0] or h == 2 and city in hints[1]: city = self.board.getCityByName(hints[h][i].neighbors[random.randint(0, len(hints[h][i].neighbors) - 1)]) hints[h].append(city) print(self.location) print(hints) # at the end of generation, board and cities should be dropped (no use to keep them in saved data) myMama = MamaOConnel()