스타크래프트2 봇

압생트(Absinthe)봇 만들기 (#9)

오잎 클로버 2021. 8. 18. 12:00
728x90

이번 글이 아마 스타크래프트 2 프로토스의 가장 기초적인 기능을 수행하도록 하는 데 있어 도움을 주는 글 중 마지막일 듯합니다.

여태까지 한 것을 요약하자면

1) 세팅 및 일꾼 생산

2) 수정탑 건설

3) 관문 건설

4) 융화소 건설 및 가스 채취

5) 인공 제어소 건설

6) 추적자 생산

7) 시간 증폭 사용

8) 차원관문 업그레이드

9) 공격

10) 차원관문 사용

11) 유닛 컨트롤

 

이번에 구현하고자 하는 기능은 10번과 11번입니다.

물론 아직도 남은 기능들은 굉장히 많으니 그건 나중에 진행하면서 천천히 설명드리겠습니다.

 

먼저 차원관문 사용입니다.

준비된 모든 차원관문들을 for-each를 하여, 해당 차원관문이 현재 당장 사용할 수 있는 능력을 확인합니다.

(차원관문은 능력을 사용하여 유닛을 생산하는 개념이기에 AbilityId도 사용해야 합니다)

 

차원관문으로 유닛을 생산하기 위해서는

적으로부터 가장 가까이에 있는 수정탑 주변에 유닛을 호출하기로 하였습니다.

적으로부터 가장 가까이에 있는 수정탑 주변에 유닛을 호출한다면, 적에게 공격을 가는 시간을 획기적으로 줄일 수 있습니다. 또, 상대방의 공격을 방어 혹은 정찰 역시 방해할 수 있습니다.

 

async def warp_stalkers(self):
    for warpgate in self.structures(UnitTypeId.WARPGATE).ready:
        abilities = await self.get_available_abilities(warpgate)
        pylon = self.structures(UnitTypeId.PYLON).closest_to(self.enemy_start_locations[0])
        if AbilityId.WARPGATETRAIN_STALKER in abilities and self.can_afford(UnitTypeId.STALKER):
            placement = pylon.position.random_on_distance(3)
            warpgate.warp_in(UnitTypeId.STALKER, placement)

closest_to 메소드를 사용하여 가장 가까운 수정탑을 확인할 수 있습니다.

또, 따로 위치를 정해주어야 하므로 예상치 못한 곳에 건물이 있을 가능성을 확인하여

수정탑 근처로 호출을 하되, 위치는 수정탑 범위 3 내에서 랜덤 한 위치로 설정한 뒤,

warp_in를 통하여 호출을 합니다.

 

이어서 바로 유닛 컨트롤을 구현하도록 하겠습니다.

봇이 사용할 유닛은 추적자뿐이므로 추적자만 컨트롤을 만들도록 하겠습니다.

아래 코드는 얼마든지 수정하셔도 괜찮습니다.

솔직히 전투 상황이 아닌 이상 좀 별로입니다.

async def mirco_stalkers(self):
    stalkers = self.units(UnitTypeId.STALKER)
    enemy_location = self.enemy_start_locations[0]

    if self.structures(UnitTypeId.PYLON):
        pylon = self.structures(UnitTypeId.PYLON).closest_to(enemy_location)

        for stalker in stalkers:
            if stalker.weapon_cooldown == 0:
                stalker.attack(enemy_location)
            elif stalker.weapon_cooldown < 0:
                stalker.move(pylon)
            else:
                stalker.move(pylon)

모든 추적자들을 가져온 후, for-each를 통해 

해당 추적자의 공격 쿨타임이 0이라면 (바로 다시 재공격을 할 수 있다면)

적 본진을 공격하도록 하고,

만일 해당 추적자의 공격 쿨타임이 0보다 작다면 (바로 다시 재공격을 할 수 없다면)

적 기지로부터 가장 가까운 수정탑으로 이동합니다. (대부분 자신의 기지 쪽)

그 외 상황들이 발생한다면 

적 기지로부터 가장 가까운 수정탑으로 이동합니다. (대부분 자신의 기지 쪽)

 

이상으로 마무리하겠습니다.

다음에는 영역 확장을 구현하도록 하겠습니다.