스타크래프트2 봇

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

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

방학이 끝나버려 더 이상 압생트 봇을 만들지 못하게 되었습니다.

그래도 나름대로 열심히 개발하고자 하였고, 지금 당장은 이번 글이 마지막이겠으나,

다음 방학인 겨울방학에 다시 개발을 하도록 하겠습니다.

 

이번이 마지막인 만큼 최대한 많은 것을 추가 및 구현하고자 하였습니다.먼저 시간 증폭입니다.현재 인공 제어소에서 차원관문을 업그레이드를 진행하고 있는 중이라면 시간 증폭을 인공 제어소에 사용하고그렇지 않지만, 수정탑이 건설 진행이거나 이미 완료된 적이 1번이라도 있다면 시간 증폭을 연결체에 사용하도록 하였습니다.

async def chrono(self):
    if self.structures(UnitTypeId.PYLON):
        nexus = self.townhalls.ready.random

    if  nexus.energy >= 50:
        if self.structures(UnitTypeId.CYBERNETICSCORE).ready.amount > 0:
            cybercore = self.structures(UnitTypeId.CYBERNETICSCORE).ready.random
            if (
                0 < self.already_pending_upgrade(UpgradeId.WARPGATERESEARCH) < 1
            ):
                nexus(AbilityId.EFFECT_CHRONOBOOSTENERGYCOST, cybercore)
            elif self.structures(UnitTypeId.PYLON).amount > 0:
                 nexus(AbilityId.EFFECT_CHRONOBOOSTENERGYCOST, nexus)
         elif self.structures(UnitTypeId.PYLON).amount > 0:
                 nexus(AbilityId.EFFECT_CHRONOBOOSTENERGYCOST, nexus)

추가한 고급 유닛은 불멸자입니다.

큰 화력을 담당하기에 꼭 필요한 유닛이라 판단하여 추가하였습니다.

하지만 불멸자는 가격이 굉장히 많이 들기에 강제로 생산하도록 하였습니다.

차원관문 영역에 조건을 추가하였습니다.

immortal_count = self.units(UnitTypeId.IMMORTAL).ready.amount
stalker_count = self.units(UnitTypeId.STALKER).ready.amount
if (
    immortal_count <= stalker_count * 0.125
    and self.structures(UnitTypeId.ROBOTICSFACILITY)
):
    return

 

일일 설명하지 않아도 중복되는 코드가 있기에 설명을 하지 않도록 하겠습니다.

async def build_robotics(self):
    if (
        self.structures(UnitTypeId.PYLON).ready
        and self.structures(UnitTypeId.CYBERNETICSCORE).ready
        and self.can_afford(UnitTypeId.ROBOTICSFACILITY)
        and not self.structures(UnitTypeId.ROBOTICSFACILITY)
    ):
        pylon = self.structures(UnitTypeId.PYLON).ready.random
        await self.build(UnitTypeId.ROBOTICSFACILITY, near=pylon)

async def train_observer(self):
    observer_count = self.units(UnitTypeId.OBSERVER).amount
    if observer_count < 1:
        for rb in self.structures(UnitTypeId.ROBOTICSFACILITY).ready:
            if (
                self.can_afford(UnitTypeId.OBSERVER)
                and rb.is_idle
            ):
                rb.train(UnitTypeId.OBSERVER)

async def train_immortal(self):
    immortal_count = self.units(UnitTypeId.IMMORTAL).amount
    if immortal_count < 8:
        for rb in self.structures(UnitTypeId.ROBOTICSFACILITY).ready:
            if (
                self.can_afford(UnitTypeId.IMMORTAL)
                and rb.is_idle
            ):
                rb.train(UnitTypeId.IMMORTAL)

※옵저버는 테스트용으로 추가하였습니다.

 

불멸자의 컨트롤과 더불어 공격하는 것 역시 추적자와 동일하게 작업하면 끝납니다.

이상으로 압생트 봇 개발하는 것을 잠시 멈추도록 하겠습니다.