Build Marine! and Attack!
μ΄ μ₯μμ λ°°μΈκ²
Let's Start!
class Agent(base_agent.BaseAgent):
def unit_type_is_selected(self,obs,unit_type):
if (len(obs.observation.single_select) > 0 and obs.observation.single_select[0].unit_type == unit_type):
return True
elif (len(obs.observation.multi_select) > 0 and obs.observation.multi_select[0].unit_type == unit_type):
return True
else :
return False
def can_do(self,obs,action_id):
return action_id in obs.observation.available_actions
def selected_units_idle_check(self,obs):
selected_units = [x for x in obs.observation.feature_units if x.is_selected == 1]
if len(selected_units) == 0 :
print("not selected!")
return True
else:
selected_unit = [x.order_length for x in selected_units]
if sum(selected_unit) > 0:
return False
return True
def food_check(self,obs):
food_enough = obs.observation.player.food_cap - obs.observation.player.food_used
if food_enough > 4:
return False
else:
return True
def build_building_now(self,obs,building_id):
units = [unit.build_progress for unit in obs.observation.feature_units if \
(unit.unit_type == building_id)]
if len(units) > 0 :
return True
else:
return False
def step(self,obs):
super(Agent,self).step(obs)
if obs.first():
player_y, player_x = (obs.observation.feature_minimap.player_relative == PLAYER_SELF).nonzero()
xmean = player_x.mean()
ymean = player_y.mean()
if xmean <= MINIMAP_SIZE/2 and ymean <= MINIMAP_SIZE/2:
self.scout_coordinates = (40, 40)
else:
self.scout_coordinates = (20, 20)
scvs = [unit for unit in obs.observation.feature_units if unit.unit_type == units.Terran.SCV]
if len(scvs) > 0 and not self.unit_type_is_selected(obs,units.Terran.SCV):
#μ λ μ
λ
scv = scvs[0]
return actions.FUNCTIONS.select_point("select",(scv.x,scv.y))
elif self.can_do(obs,BUILD_SUPPLYDEPOT) and \
self.food_check(obs) and \
(not self.build_building_now(obs,units.Terran.SupplyDepot))\
and [x.order_id_0 for x in obs.observation.feature_units if x.is_selected == 1][0] == \
HARVEST_GATHER_SCV_UNIT:
x,y = random.randint(0,SCREEN_SIZE),random.randint(0,SCREEN_SIZE)
return actions.FunctionCall(BUILD_SUPPLYDEPOT,[NOT_QUEUED,[x,y]])
elif self.can_do(obs,BUILD_BARRACKS) and \
(not self.build_building_now(obs,units.Terran.Barracks)) and \
(len([x for x in obs.observation.feature_units if x.unit_type == units.Terran.Barracks]) == 0) and \
self.selected_units_idle_check(obs):
x,y = random.randint(0,SCREEN_SIZE),random.randint(0,SCREEN_SIZE)
return actions.FunctionCall(BUILD_BARRACKS,[NOT_QUEUED,[x,y]])
return actions.FUNCTIONS.no_op()Last updated