스타크래프트2 봇

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

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

이번에 구현하고자 하는 것은 어시밀레이터(융화소) 건설입니다.

미네랄(광물) 외에도 스타크래프트에 존재하는 또 다른 자원이 하나 있습니다. 바로 '가스'입니다. 가스로 더 강력한 유닛을 생산하고 테크를 가는 데에 있어 필수입니다. 한 마디로 요약하자면, 가스 없이는 고급 테크를 가지 못하고, 고급 테크를 가지 못한다면 고급 유닛을 생산할 수 없다는 의미입니다.

 

간단한 로직부터 세워보자면

넥서스 가까이에 존재하는 두 간헐천에 건설하도록 하는 것이 목표입니다.

먼저 가스의 경우에는 어떠한 제약도 없습니다.

미리 먼저 어떤 건물이 있어야 건설된다거나 하는 조건이 없다는 의미입니다.

또, 연결체, 수정탑과 더불어 동력 없이 건설되는 건물 중 하나입니다.

위 로직대로 작성한 코드는 아래와 같습니다.

async def build_gas(self):
    if self.structures(UnitTypeId.GATEWAY):
        for nexus in self.townhalls.ready:
            vespenes = self.vespene_geyser.closer_than(15, nexus)
            for gas in vespenes:
                if not self.can_afford(UnitTypeId.ASSIMILATOR):
                    break
                worker = self.select_build_worker(gas.position)
                if worker is None:
                    break
                if not self.gas_buildings or not self.gas_buildings.closer_than(1, gas):
                    worker.build(UnitTypeId.ASSIMILATOR, gas)
                    worker.stop(queue=True)

로직을 설명하 기는 하였으나, 추가적으로 설명을 하자면

개인적으로 가스는 게이트가 존재할 때에 건설하고 싶었기에 조건을 걸었습니다.

완성된 넥서스들을 담은 리스트를 상대로 for-each 문을 사용하여 각 넥서스 주변에 존재하는 간헐천을 찾습니다.

각 간 혈천은 넥서스와 근접한 간헐천만을 찾습니다.

해당 간헐천에 이미 추출장(융화소)가 지어져 있다면 해당 간헐천에 더 이상 추출장을 건설할 수 없기에 break 합니다.

간헐천 근처에 있는 일꾼 하나를 잡은 후, 해당 일꾼에게

가스 건물 (추출장)이 없거나, 간헐천과 추출장과의 거리가 1 이상 나지 않을 경우 건설하도록 합니다.

또, worker.stop(queue=True)는 가스 건설 이후 가만히 있게 만들어 

일꾼 분배 코드인 distribute_workers 메서드를 통해 다시 일하게 만들고자 추가였습니다.

 

다음엔 사이버네틱스 코어 (인공 제어소)를 건설하도록 하겠습니다.