def _compute_dist(self, env): scout = env.scout() home = env.owner_base() enemy_base = env.enemy_base() home_dist = sm.calculate_distance(scout.float_attr.pos_x, scout.float_attr.pos_y, home[0], home[1]) enemy_dist = sm.calculate_distance(scout.float_attr.pos_x, scout.float_attr.pos_y, enemy_base[0], enemy_base[1]) return (home_dist + enemy_dist)
def in_range(self, pos): dist = sm.calculate_distance(pos[0], pos[1], self._center[0], self._center[1]) if dist > DEST_RANGE: return False else: return True
def check_enter(self, pos): if self.enter: return dist = sm.calculate_distance(pos[0], pos[1], self._center[0], self._center[1]) if dist < self._dest_range: self.enter = True
def check_hit(self, pos): if self.hit: return dist = sm.calculate_distance(pos[0], pos[1], self._center[0], self._center[1]) if dist < self._hit_range: self.hit = True
def _compute_dist(self, env): scout = env.scout() enemy_base = env.enemy_base() dist = sm.calculate_distance(scout.float_attr.pos_x, scout.float_attr.pos_y, enemy_base[0], enemy_base[1]) return dist
def _compute_curr_dist(self, env): scout = env.unwrapped.scout() enemy_pos = env.unwrapped.enemy_base() dist = sm.calculate_distance(scout.float_attr.pos_x, scout.float_attr.pos_y, enemy_pos[0], enemy_pos[1]) return dist - self._target_range
def act(self, observation, reward, done): queen = None enemy = None for u in observation.observation['units']: if (u.int_attr.unit_type == UNIT_TYPEID.ZERG_QUEEN.value and u.int_attr.alliance == sm.AllianceType.SELF.value): queen = u elif (u.int_attr.unit_type == UNIT_TYPEID.ZERG_OVERLORD.value and u.int_attr.alliance == sm.AllianceType.ENEMY.value): enemy = u if queen is None: print('ZergBotAgent cannot find queue') return [self._noop()] dist = sm.calculate_distance(queen.float_attr.pos_x, queen.float_attr.pos_y, self._target[0], self._target[1]) if self._check_defense(dist): #print('ZergBotAgent queen on defense') return [self._defense(queen)] if self._check_out_of_range(dist): #print('ZergBotAgent queen defense while out of range') return [self._defense(queen)] if enemy is None: #print('ZergBotAgent queen random') return [self._random(queen)] diff_dist = sm.calculate_distance(queen.float_attr.pos_x, queen.float_attr.pos_y, enemy.float_attr.pos_x, enemy.float_attr.pos_y) if diff_dist < self._attack_range: #print('ZergBotAgent queen attack') return [ self._attack_target( queen, [enemy.float_attr.pos_x, enemy.float_attr.pos_y]) ] else: #print('ZergBotAgent queen catch-up') return [ self._move_to_target( queen, [enemy.float_attr.pos_x, enemy.float_attr.pos_y]) ]
def _in_range(self, env): scout = env.unwrapped.scout() dist = sm.calculate_distance(scout.float_attr.pos_x, scout.float_attr.pos_y, self._target[0], self._target[1]) if dist <= self._range_width: return True else: return False
def check_leave(self, pos): if not self.enter: return if self.leave: return dist = sm.calculate_distance(pos[0], pos[1], self._center[0], self._center[1]) if dist > self._dest_range: self.leave = True
def _check_view(self, env, unit): scout = env.unwrapped.scout() dist = sm.calculate_distance(scout.float_attr.pos_x, scout.float_attr.pos_y, unit.float_attr.pos_x, unit.float_attr.pos_y) if dist <= MAX_VIEW_RANGE: return True else: return False
def _find_furthest_target(self): furthest_dist = 0.0 furthest_base = None for key, value in self._target_bases.items(): dist = sm.calculate_distance(self._owner_base_pos[0], self._owner_base_pos[1], value[0], value[1]) if furthest_dist < dist: furthest_dist = dist furthest_base = key return furthest_base
def get_id_by_pos(self, pos): min_dist = None min_base_gap = 5 base_id = None for key, value in self._target_bases.items(): dist = sm.calculate_distance(pos[0], pos[1], value[0], value[1]) if min_dist is None: min_dist = dist base_id = key elif min_dist > dist: min_dist = dist base_id = key if min_dist > min_base_gap: return None else: return base_id
def _compute_dist(self, scout): dist = sm.calculate_distance(scout.float_attr.pos_x, scout.float_attr.pos_y, self._home[0], self._home[1]) return dist
def _dist(self, base): pos = base.pos dist = sm.calculate_distance(self._owner_base_pos[0], self._owner_base_pos[1], pos[0], pos[1]) return dist