Esempio n. 1
0
 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))
Esempio n. 2
0
    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))
Esempio n. 3
0
    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
            ])
Esempio n. 4
0
    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
            ])
Esempio n. 5
0
    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
Esempio n. 6
0
    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
Esempio n. 7
0
    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])
Esempio n. 8
0
    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
            ])
Esempio n. 9
0
    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])
Esempio n. 10
0
    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])