Build Marine! and Attack!

이 μž₯μ—μ„œ λ°°μšΈκ²ƒ

μžμ›μ΄ 되면, supply depot을 μ§“κ³ , Barrack을 지은 λ’€, κ³΅κ²©κ°€λŠ” 것을 λͺ©ν‘œλ‘œ ν•˜κ² μŠ΅λ‹ˆλ‹€.

Let's Start!

사싀, μ„œν”ŒλΌμ΄ λ””νŒŸ ν•˜λ‚˜ μ§“κ²Œν•˜λŠ”λ°λ„ μ€κ·Όνžˆ 생각해볼 것듀이 λ§ŽμŠ΅λ‹ˆλ‹€.

  1. μ„œν”ŒλΌμ΄λ””νŒŸμ„ μ§“λŠ”λ‹€.

    • 인ꡬ수 체크!

    • μ§€κΈˆ μ„œν”ŒλΌμ΄λ””νŒŸμ„ μ§“κ³ μžˆλŠ”μ§€ 확인!

    • SCVκ°€ λ…ΈλŠ”μ§€ 체크!

    • μžμ› 확인!(μ§€κΈˆ κ°€λŠ₯ν•œν–‰λ™μΈμ§€ν™•μΈ!)

    • SCVλ₯Ό 선택해 μ λ‹Ήν•œ μœ„μΉ˜μ— μ§“κΈ° μ‹œμž‘ν•΄μ•Όν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ rule-basedκ°€ μ–΄λ ΅μŠ΅λ‹ˆλ‹€ γ…œγ…œ. ν•œκΊΌλ²ˆμ— μ μš©ν•œ 슀크립트λ₯Ό 보고 λΉ λ₯΄κ²Œ λ„˜μ–΄κ°€λ„λ‘ν•˜μ£ !

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()

λ§Œμ•½ μ„œν”ŒλΌμ΄λ””νŒŸμ„ μ§“λ‹€κ°€ ν™”λ©΄λ°–μœΌλ‘œ λ²—μ–΄λ‚˜λ©΄ μ΄λŸ¬ν•œ rule-based AgentλŠ” μ§“κ³ μžˆλŠ” μ„œν”ŒλΌμ΄ λ””νŒŸμ— λŒ€ν•œ μ •λ³΄λŠ” 얻을 μˆ˜κ°€ μ—†μ–΄ μΈκ΅¬μˆ˜κ°€ λ§‰νžˆμ§€ μ•Šμ•˜λ”λΌλ„ μƒˆ μ„œν”ŒλΌμ΄λ””νŒŸμ„ 지을 κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€!(μžμ›μ΄ λ§Žλ‹€λ©΄ APM이 300μ΄λ‹ˆκΉŒ μž μ‹œ λ‹€λ₯Έν™”λ©΄μœΌλ‘œ ν•œλˆˆμ„νŒ”μ•˜λ‹€κ°„ λͺ‡μ΄ˆλ§Œμ— λͺ¨λ“  일꾼이 μ„œν”ŒλΌμ΄ λ””νŒŸμ„ μ§“λŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.)

μ΄λ²ˆμ—” λ°°λŸ­μ„ μ§€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€!

이 μŠ€ν¬λ¦½νŠΈλ„ μŠ€ν¬λ¦°μ— 배럭이 λ³΄μ΄μ§€μ•ŠμœΌλ©΄ 와μž₯μ°½ μ§€μ–΄μ§€λŠ” λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€..γ…Žγ…Ž

이제 λ§ˆλ¦°μ„ κ³„μ†ν•΄μ„œ λ½‘μ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ²˜μŒμ— SCVλ₯Όμ„ νƒν• λ•Œ, λ°°λŸ­λ„ μ§€μΌœλ΄μ•Όν•˜κΈ°λ•Œλ¬Έμ— μ „μ²΄μ˜ μ½”λ“œλ₯Ό λ„£μ–΄ 바뀐점을 찾도둝 ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 그러면 μ΄λ ‡κ²Œλ˜λ©΄ 계속 λ§ˆλ¦°μ„ 뽑을 수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ 적의 κΈ°μ§€λ‘œ 곡격을 λ³΄λ‚΄κ² μŠ΅λ‹ˆλ‹€.

마린 λ„€κΈ°κ°€ λšœλ²…λšœλ²…κ±Έμ–΄κ°€ 적을 κ³΅κ²©ν•˜λŠ” λ³΄μ‹€μˆ˜ μžˆμ„ κ²ƒμž…λ‹ˆλ‹€!

Last updated