def print_planet(self, planet, fleets): def is_dest(fleet): return fleet.destination == planet.id def mine(x): return fleet.owner == planet.owner fleets = list(filter(is_dest, fleets)) old_planet = self.old_planets[planet.id] owner = "N " if planet.owner == 0 else "P%d" % planet.owner ships = "x%d" % planet.ships if planet.owner != old_planet.owner: owner += " (was P%d)" % old_planet.owner elif planet.ships != old_planet.ships: ships += " (%+d)" % (planet.ships - old_planet.ships) print("#%02d: %s %s" % (planet.id, owner, ships)) by_remaining = defaultdict(list) for fleet in fleets: by_remaining[fleet.remaining_turns].append(fleet) for r in sorted(by_remaining.keys()): friends, enemies = partition(mine, by_remaining[r]) friends_sum = sum(fleet.ships for fleet in friends) enemies_sum = sum(fleet.ships for fleet in enemies) if friends_sum > 0 and enemies_sum > 0: print(" ..in %d: +%d, -%d" % (r, friends_sum, enemies_sum)) elif friends_sum > 0: print(" ..in %d: +%d" % (r, friends_sum)) else: print(" ..in %d: -%d" % (r, enemies_sum))
def print_planet(self, planet, fleets): if self.quiet: return def is_dest(fleet): return fleet.destination == planet.id def mine(x): return fleet.owner == planet.owner fleets = list(filter(is_dest, fleets)) old_planet = self.old_planets[planet.id] owner = "N " if planet.owner == 0 else "P%d" % planet.owner ships = "x%d" % planet.ships if planet.owner != old_planet.owner: owner += " (was P%d)" % old_planet.owner elif planet.ships != old_planet.ships: ships += " (%+d)" % (planet.ships - old_planet.ships) print("#%02d: %s %s" % (planet.id, owner, ships)) by_remaining = defaultdict(list) for fleet in fleets: by_remaining[fleet.remaining_turns].append(fleet) for r in sorted(by_remaining.keys()): friends, enemies = partition(mine, by_remaining[r]) friends_sum = sum(fleet.ships for fleet in friends) enemies_sum = sum(fleet.ships for fleet in enemies) if friends_sum > 0 and enemies_sum > 0: print(" ..in %d: +%d, -%d" % (r, friends_sum, enemies_sum)) elif friends_sum > 0: print(" ..in %d: +%d" % (r, friends_sum)) else: print(" ..in %d: -%d" % (r, enemies_sum))
def execute_order(self, pid1, orders1, pid2, orders2): assert pid1 != pid2, "pids equal" # Departures for o1 in orders1: self.issue_order(pid1, o1) for o2 in orders2: self.issue_order(pid2, o2) # copied from game.py # Advancement for planet in self.planets: planet.generate_ships() for fleet in self.fleets: fleet.advance() # Arrival arrived_fleets, self.fleets = partition( lambda fleet: fleet.has_arrived(), self.fleets) for planet in self.planets: planet.battle([ fleet for fleet in arrived_fleets if fleet.destination == planet ])
def do_turn(self): """Performs a single turn of the game.""" # Get orders planets, fleets = self.freeze() player_orders = [] for i, player in enumerate(self.players): prev = time.time() player_orders.append(player(self.turn, i, planets, fleets)) t = time.time() - prev self.time_totals[i] += t if t > self.time_max[i]: self.time_max[i] = t self.turn += 1 # Departure for player, orders in enumerate(player_orders): # print "turn", self.turn, "player:", player, "orders:", orders for order in orders: self.issue_order(player, order) # Advancement for planet in self.planets: planet.generate_ships() for fleet in self.fleets: fleet.advance() # Collisions do before advancement? if self.collisions: oldfleets = self.fleets for fleet in oldfleets: fleet.destroy = False self.fleets = [] while len(oldfleets) > 0: fleet = oldfleets.pop(0) if fleet.destroy: continue fleetx, fleety = fleet.location() i = 0 while i < len(oldfleets): checkx, checky = oldfleets[i].location() if (fleetx - checkx)**2 + (fleety - checky)**2 < 1: #print "DESTROY", fleetx, fleety, checkx, checky oldfleets[i].destroy = True fleet.destroy = True i += 1 if not fleet.destroy: self.fleets.append(fleet) # Arrival arrived_fleets, self.fleets = partition( lambda fleet: fleet.has_arrived(), self.fleets) for planet in self.planets: planet.battle([ fleet for fleet in arrived_fleets if fleet.destination == planet ])
def generate_orders(self, pid): def mine(x): return x.owner == pid my_planets, other_planets = partition(mine, self.planets) res = [] for src in my_planets: for dst in other_planets: res.append(Order(src, dst, src.ships / 2)) return res
def execute_order(self, pid, order): # Departure self.issue_order(pid, order) # copied from game.py # Advancement for planet in self.planets: planet.generate_ships() for fleet in self.fleets: fleet.advance() # Arrival arrived_fleets, self.fleets = partition(lambda fleet: fleet.has_arrived(), self.fleets) for planet in self.planets: planet.battle([fleet for fleet in arrived_fleets if fleet.destination == planet])
def execute_order(self, pid, order): # Departure self.issue_order(pid, order) # copied from game.py # Advancement for planet in self.planets: planet.generate_ships() for fleet in self.fleets: fleet.advance() # Arrival arrived_fleets, self.fleets = partition( lambda fleet: fleet.has_arrived(), self.fleets) for planet in self.planets: planet.battle([ fleet for fleet in arrived_fleets if fleet.destination == planet ])
def do_turn(self): """Performs a single turn of the game.""" # Get orders planets, fleets = self.freeze() player_orders = [player.play(self.turn, i, planets, fleets) for i, player in enumerate(self.players)] self.turn += 1 # Departure for player, orders in enumerate(player_orders): for order in orders: self.issue_order(player, order) # Advancement for planet in self.planets: planet.generate_ships() for fleet in self.fleets: fleet.advance() # Arrival arrived_fleets, self.fleets = partition(lambda fleet: fleet.has_arrived(), self.fleets) for planet in self.planets: planet.battle([fleet for fleet in arrived_fleets if fleet.destination == planet])
def execute_order(self, pid1, orders1, pid2, orders2): assert pid1 != pid2, "pids equal" # Departures for o1 in orders1: self.issue_order(pid1, o1) for o2 in orders2: self.issue_order(pid2, o2) # copied from game.py # Advancement for planet in self.planets: planet.generate_ships() for fleet in self.fleets: fleet.advance() # Arrival arrived_fleets, self.fleets = partition(lambda fleet: fleet.has_arrived(), self.fleets) for planet in self.planets: planet.battle([fleet for fleet in arrived_fleets if fleet.destination == planet])