def _check_attributes(self, team: Team): utils.check_type("team", team, Team) self._check_team_attribute(team, "name") self._check_team_attribute(team, "units") self._check_team_attribute(team, "num_units") self._check_team_attribute(team, "num_positions") for unit in team: if unit is None: continue self._check_unit_type(unit) self._check_unit_attribute(unit, "HP") self._check_unit_attribute(unit, "ATT") self._check_unit_attribute(unit, "ARM") self._check_unit_attribute(unit, "EVS") self._check_unit_attribute(unit, "name") self._check_unit_attribute(unit, "pos") self._check_unit_attribute(unit, "hp") self._check_unit_attribute(unit, "att") self._check_unit_attribute(unit, "arm") self._check_unit_attribute(unit, "evs")
def update(self, obj: Unit): utils.check_type("obj", obj, Unit) self.name = obj.name self.hp = obj.hp self.att = obj.att self.arm = obj.arm self.evs = obj.evs
def _check_types(self, team: Team): utils.check_type("team", team, Team) for unit in team: if unit is None: continue self._check_unit_type(unit)
def attack(self, target: Unit): utils.check_type("target", target, Unit) write_log( "Before attack, %s.%s.HP=%.2f, %s.%s.HP=%.2f"% ( self.team.name, self.name, self.hp, target.team.name, target.name, target.hp ) ) target.hp = max(0, target.hp - max(1, self.att - target.arm)) self.hp = max(0, self.hp - max(1, 0.5*target.att - self.arm)) write_log("%s.%s attacks %s.%s"%(self.team.name, self.name, target.team.name, target.name)) write_log( "After attack, %s.%s.HP=%.2f, %s.%s.HP=%.2f"% ( self.team.name, self.name, self.hp, target.team.name, target.name, target.hp ) )
def _check_types(self, team: Team): utils.check_type("team", team, Team) for unit in team: if not isinstance(unit, Unit): err_msg = "An element of Team should be Unit type, "\ "not %s"%(type(unit)) raise TypeError(err_msg)
def play(self, team1: Team, team2: Team, num_turns: int = 10, num_repeats: int = 10): utils.check_type("team1", team1, Team) utils.check_type("team2", team2, Team) if len(team1) != len(team2): err_msg = "The sizes of team1 and team2 dost not match!" write_log(err_msg) raise ValueError(err_msg) num_wins_team1 = 0 num_wins_team2 = 0 num_draws = 0 for i in range(num_repeats): team1_cpy = copy.deepcopy(team1) team2_cpy = copy.deepcopy(team2) if i % 2 == 0: offense, defense = team1_cpy, team2_cpy else: offense, defense = team2_cpy, team1_cpy for t in range(num_turns): write_log("[%s vs %s - Repeat #%d Turn #%d]" % (team1.name, team2.name, i + 1, t + 1)) self._examiner.check_play(offense, defense, self._league_round) # Arrange defense_cpy = copy.deepcopy(defense) offense.arrange(defense_cpy) # Attack self._apply_attack(offense, defense) self._clear_dead_units(offense) self._clear_dead_units(defense) write_log("#Units in %s=%d, #Units in %s=%d" % (team1.name, len(team1), team2.name, len(team2))) if len(offense) == 0 or len(defense) == 0: break offense, defense = defense, offense # end of for if len(team1_cpy) > len(team2_cpy): # Team #1 wins. num_wins_team1 += 1 elif len(team1_cpy) < len(team2_cpy): num_wins_team2 += 1 else: # Draw num_draws += 1 # end of for return num_wins_team1, num_wins_team2, num_draws
def __init__(self, name: str, units: List[Unit] = None): utils.check_type("name", name, str) self._name = name if units: utils.check_type("units", units, list) if len(units) != 0: utils.check_type("units[0]", units[0], Unit) else: units = [] self._units = units self.initialize()
def __init__(self, name: str, units: List[Unit] = None, init=True): utils.check_type("name", name, str) self._name = name if units: utils.check_type("units", units, list) if len(units) != 0: for i, unit in enumerate(units): utils.check_type("units[%d]" % (i), units[i], Unit, allow_none=True) else: units = [] self._units = units if init: self.initialize()
def name(self, val): utils.check_type("name", val, str) self._name = val
def team(self, team): from loa import Team utils.check_type("team", team, Team) self._team = team
def play(self, team1: Team, team2: Team, num_turns: int = 10, num_repeats: int =10, judge: Judge = None): utils.check_type("team1", team1, Team) utils.check_type("team2", team2, Team) utils.check_type("judge", judge, Judge, allow_none=True) if not judge: judge = MaxSurvivalJudge() if len(team1) != len(team2): err_msg = "The sizes of team1 and team2 dost not match!" write_log(err_msg) raise ValueError(err_msg) num_wins_team1 = 0 num_wins_team2 = 0 num_draws = 0 for i in range(num_repeats): team1_cpy = copy.deepcopy(team1) team2_cpy = copy.deepcopy(team2) if i % 2 == 0: offense, defense = team1_cpy, team2_cpy else: offense, defense = team2_cpy, team1_cpy judge.initialize() for t in range(num_turns): write_log("[%s vs %s - Repeat #%d Turn #%d]"%(team1.name, team2.name, i+1, t+1)) self._examiner.check_play(offense, defense, self._league_round) # Arrange defense_cpy = copy.deepcopy(defense) offense.arrange(defense_cpy) # Attack self._apply_attack(offense, defense) self._clear_dead_units(offense) self._clear_dead_units(defense) write_log("#Units in %s=%d, #Units in %s=%d"%(team1.name, len(team1_cpy), team2.name, len(team2_cpy))) judge.update(t, team1_cpy, team2_cpy) if len(offense) == 0 or len(defense) == 0: break offense, defense = defense, offense # end of for winner = judge.decide(team1_cpy, team2_cpy) if winner == team1.name: num_wins_team1 += 1 elif winner == team2_cpy.name: num_wins_team2 += 1 else: # Draw num_draws += 1 # end of for return num_wins_team1, num_wins_team2, num_draws