Esempio n. 1
0
 def change_of_plans(self):
     if not self.is_battery_prepped():
         self.pick_battery()
         self.sequence = PrepBattery2(self.battery_slot, self.pain_slot, self.observer_slot, self.gauge_slot)
     elif not self.is_pain_bearable():
         self.pick_pain()
         self.sequence = SetToValue(self.pain_slot, self.pain)
     elif not self.is_target_painted():
         self.pick_target()
         self.pick_observer()
         self.sequence = SetToValue(self.observer_slot, MAX_SLOT - self.target_slot)
     elif not self.is_gauge_set():
         self.pick_target()
         self.pick_gauge()
         self.sequence = SetToValue(self.gauge_slot, self.gauge)
     self.sequence.set_game(self.game)
Esempio n. 2
0
class KickAss2(Bot):
    def __init__(self):
        self.sequence = None
        self.battery_slot = -1
        self.pain_slot = -1
        self.observer_slot = -1
        self.gauge_slot = -1
        self.target_slot = -1
        self.gauge = -1
        self.pain = -1
        self.battery_prepped = False

    def set_game(self, game):
        super(KickAss2, self).set_game(game)
        self.pick_battery()
        self.pick_target()
        self.pick_pain()
        self.pick_observer()
        self.pick_gauge()
        self.change_of_plans()

    def choose_move(self):
        if self.is_battery_prepped() and self.is_pain_bearable() and self.is_target_painted() and self.is_gauge_set():
            # print>>sys.stderr, ('everything prepped up -- firing mah lazor!')
            # print>>sys.stderr, (str(self.game.proponent.values[self.gauge_slot]))
            # print>>sys.stderr, (self.gauge)
            move = (RIGHT_APP, self.battery_slot, cards.I)
        else:
            try:
                move = self.get_next_move()
            except BatteryPrepped:
                self.battery_prepped = True
                move = None
            if move == None:
                self.change_of_plans()
                move = self.get_next_move()
        if move == None:
            move = (RIGHT_APP, self.battery_slot, cards.I)
        return move

    def get_next_move(self):
        return self.sequence.choose_move()

    def pick_battery(self):
        old_battery_slot = self.battery_slot
        # self.battery_slot = reduce(lambda x, y: y if (y[1] > x[1] and
        #                                              y[0] != self.pain_slot and
        #                                              y[0] != self.observer_slot and
        #                                              y[0] != self.gauge_slot) else x, zip(range(SLOTS), self.game.proponent.vitalities), (0, 0))[0]
        cands = zip(range(SLOTS), self.game.proponent.vitalities)
        bat_cand, cand_vit = reduce(
            lambda x, y: y
            if (y[1] > x[1] and y[0] != self.pain_slot and y[0] != self.observer_slot and y[0] != self.gauge_slot)
            else x,
            cands,
            (0, 0),
        )
        # cands_f = filter(lambda x: x[1] >= cand_vit * 4 / 5 and (x[0] in [128, 64, 32, 16, 8, 4, 2, 1]), cands)
        cands_f = filter(lambda x: x[1] >= cand_vit * 4 / 5 and (x[0] in [32, 16, 8, 4, 2, 1]), cands)
        if len(cands_f) > 0:
            self.battery_slot = reduce(lambda x, y: y[0] if y[0] > x else x, cands_f, 0)
        else:
            self.battery_slot = bat_cand
        if old_battery_slot != self.battery_slot:
            self.battery_prepped = False
        # print>>sys.stderr, ('battery ' + str(self.battery_slot))

    def pick_pain(self):
        old_pain_slot = self.pain_slot
        self.pain_slot = reduce(
            lambda x, y: y
            if (y[1] > x[1] and y[0] != self.battery_slot and y[0] != self.observer_slot and y[0] != self.gauge_slot)
            else x,
            zip(range(SLOTS), self.game.proponent.vitalities),
            (0, 0),
        )[0]
        if old_pain_slot != self.pain_slot:
            self.battery_prepped = False
        self.pain = self.recommend_pain()
        # print>>sys.stderr, ('pain slot ' + str(self.pain_slot))
        # print>>sys.stderr, ('pain ' + str(self.pain))

    def pick_observer(self):
        old_observer_slot = self.observer_slot
        self.observer_slot = reduce(
            lambda x, y: y
            if (y[1] > x[1] and y[0] != self.battery_slot and y[0] != self.pain_slot and y[0] != self.gauge_slot)
            else x,
            zip(range(SLOTS), self.game.proponent.vitalities),
            (0, 0),
        )[0]
        if old_observer_slot != self.observer_slot:
            self.battery_prepped = False
        # print>>sys.stderr, ('observer ' + str(self.observer_slot))

    def pick_gauge(self):
        old_gauge_slot = self.gauge_slot
        self.gauge_slot = reduce(
            lambda x, y: y
            if (y[1] > x[1] and y[0] != self.battery_slot and y[0] != self.pain_slot and y[0] != self.observer_slot)
            else x,
            zip(range(SLOTS), self.game.proponent.vitalities),
            (0, 0),
        )[0]
        if old_gauge_slot != self.gauge_slot:
            self.battery_prepped = False
        self.gauge = self.recommend_gauge()
        # print>>sys.stderr, ('gauge slot ' + str(self.gauge_slot))
        # print>>sys.stderr, ('gauge ' + str(self.gauge))

    def pick_target(self):
        self.target_slot = reduce(
            lambda x, y: y if y[1] < x[1] and y[1] != 0 else x,
            zip(range(SLOTS), self.game.opponent.vitalities),
            (0, 100500),
        )[0]
        # self.target_slot = reduce(lambda x, y: y if len(str(y[1])) > len(str(x[1])) and y[2] != 0 else x, zip(range(SLOTS), self.game.opponent.values, self.game.opponent.vitalities), (0, '', 0))[0]
        # print>>sys.stderr, ('attacking ' + str(self.target_slot))
        self.pick_gauge()

    def recommend_gauge(self):
        gauge = self.game.opponent.vitalities[self.target_slot]
        if gauge > (self.game.proponent.vitalities[self.battery_slot] - 10000) / 2:
            gauge = number_term_with_min_seq_cost(
                (self.game.proponent.vitalities[self.battery_slot] - 10000) * 3 / 8,
                (self.game.proponent.vitalities[self.battery_slot] - 10000) * 4 / 8,
            )
        if self.game.proponent.vitalities[self.battery_slot] < 60000:
            gauge = 8
        if gauge < 10:
            gauge = 8
        return gauge

    def recommend_pain(self):
        return number_term_with_min_seq_cost(
            self.game.proponent.vitalities[self.battery_slot] * 99 / 100,
            self.game.proponent.vitalities[self.battery_slot] * 90 / 100,
        )

    def change_of_plans(self):
        if not self.is_battery_prepped():
            self.pick_battery()
            self.sequence = PrepBattery2(self.battery_slot, self.pain_slot, self.observer_slot, self.gauge_slot)
        elif not self.is_pain_bearable():
            self.pick_pain()
            self.sequence = SetToValue(self.pain_slot, self.pain)
        elif not self.is_target_painted():
            self.pick_target()
            self.pick_observer()
            self.sequence = SetToValue(self.observer_slot, MAX_SLOT - self.target_slot)
        elif not self.is_gauge_set():
            self.pick_target()
            self.pick_gauge()
            self.sequence = SetToValue(self.gauge_slot, self.gauge)
        self.sequence.set_game(self.game)

    def is_battery_prepped(self):
        return self.battery_prepped

    def is_pain_bearable(self):
        return (
            self.game.proponent.vitalities[self.pain_slot] > 100
            and self.game.proponent.values[self.pain_slot] == self.pain
            and self.game.proponent.vitalities[self.battery_slot] > self.pain
            and self.pain >= self.recommend_pain() * 1 / 2
        )

    def is_target_painted(self):
        return (
            self.game.proponent.vitalities[self.observer_slot] > 100
            and self.game.proponent.values[self.observer_slot] == MAX_SLOT - self.target_slot
            and self.game.opponent.vitalities[self.target_slot] > 0
        )

    def is_gauge_set(self):
        return (
            self.game.proponent.vitalities[self.gauge_slot] > 100
            and isinstance(self.game.proponent.values[self.gauge_slot], IntValue)
            and self.game.proponent.values[self.gauge_slot] == self.gauge
            and (self.gauge >= self.recommend_gauge() * 1 / 2 and self.gauge <= self.recommend_gauge() * 2)
        )