스타크래프트2 봇

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

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

이번에 구현하고자 하는 것은 영역 확장입니다.

python_sc2에 이미 영역 확장하는 코드가 존재하기에

빠르게 마무리하고 이어서 공격에 관련하여 코드를 추가하도록 하겠습니다.

 

python_sc2에 존재하는 파이썬 파일들 중 "bot_ai"라는 파일에서

expand_now라는 메소드에 이미 작성해야할 코드가 존재하기에 이를 메소드를 사용할 것입니다.

 

영역을 확장하는 데에 자원이 굉장히 많이 투자되고 그비용만큼 유닛을 생산하지 못하여 패배하는 경우가 있기에

적절한 영역확장이 필요합니다.

개인적으로 연결체는 3개 미만이고 자원이 충분할때에만 영역을 확장하도록 하였습니다.

async def expand(self):
    if self.units(UnitTypeId.NEXUS).amount < 3 and self.can_afford(UnitTypeId.NEXUS):
        await self.expand_now()

 

이어서 공격에 관한 것들 가운데

적군을 찾는 것과 관련하여 작성할 예정이다.

이전에는 본진과 파괴하고 나서 아무것도 못하는 상태가 되어, 적군이 앞마당을 공격할 수 없었지만

적군의 건물를 한 번이라도 본 적이 있다면 공격하도록 하였다.

(적군의 모든 건물를 파괴하거나 상대가 게임을 나가면 승리하기때문)

def find_target(self):
    if self.enemy_structures:
        return random.choice(self.enemy_structures).position
    return self.enemy_start_locations[0]

상대의 건물이 하나라도 남아있다면

그 건물들 중 하나의 위치를 가져오도록 한 후,

만일 확인한 건물이 하나도 없는 경우, 본진을 공격하도록 합니다.

 

위 메소드를 만들어 attack메소드 역시 약간의 변화가 생겼습니다.

async def attack(self):
    stalker_count = self.units(UnitTypeId.STALKER).amount
    stalkers = self.units(UnitTypeId.STALKER).ready.idle

    if stalker_count > 3:
        for s in stalkers:
            s.attack(self.find_target())

이로써 발견한 모든 건물들을 파괴하도록 하였습니다.

다음번엔 시간 증폭를 더 효율적으로 사용하도록 하는 것과 더불어 로봇공학 시설을 건설 및 유닛 생산하는 것을 구현할 예정입니다.