스타크래프트2 봇

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

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

다시금 스타크래프트 2 봇을 만들게 된 워커홀릭 개발자입니다.

저번에 너무 빨리 마무리를 지은 감이 있고, 저 역시 새로운 도전을 하고 어느 정도 목표를 이루고자 하는 마음이 있기에

새로 봇을 만들기로 하였습니다.

종족은 프로토스로 쉬운 종족을 택하였습니다.

먼저 가장 기본적인 틀은 필자의 깃허브를 참고하시길 바랍니다.

eschampstudio/python-sc2-bot-template 을 참고하였습니다.

 

워낙에 정보를 찾기 어려운 PySC2를 사용하지 않고

정보가 많은 sc2를 사용하기로 하였습니다.

 

먼저 가장 기초적인 작업부터 구현을 하고자 합니다.

바로 프로브 생산입니다.

일꾼을 많이 생산하여, 그만큼 자원을 모아야하기에 가장 기초적인 작업입니다.

먼저 코딩을 하기 앞서 세팅부터 합시다.

세팅은 매우 단순합니다.

위 링크를 참고하셔서 세팅하시길 바랍니다.

 

윈도우 cmd를 기준으로 설명합니다.

1) 위 링크에 들어가시면 초록색 "Use this template" 버튼을 누른 후, 새 리포지토리를 생성합니다.

2) 해당 리포지토리를 clone 합니다.

3) 해당 clone을 한 파일에 들어가 cmd창을 실행합니다.

4) cmd 창에서 python -m venv venv라는 명령어를 사용합니다. (이때 위치는 반드시 해당 clone 된 파일의 위치여야 합니다)

5) 위 명령어를 사용 후, venv\Scripts\activate.bat 명령어를 사용합니다.
6) pip install -r requirements.txt 명령어를 사용합니다.

7) python ./run.py 명령어를 사용합니다.

위와 동일하게 할 경우 가장 기본적인 봇이 생성됩니다.

 

위와 같이 세팅을 한 후, bot/bot.py에 들어가면 import에러가 나는 경우가 있습니다.

이를 해결하기 위해서는 sc2를 pip로 install 해주면 해결됩니다.

 

이제부터 본격적으로 개발을 시작하면 됩니다.

위에서 말한 것처럼 이번 할 일은

프로브 (일꾼) 생산입니다.

def __init__(self):
    # Initalize inherited class
    sc2.BotAI.__init__(self)

먼저 초기화를 시키기 위해서 봇을 초기화를 시킵니다.

그런 후 on_step()에서 

일꾼 분배와 함께 일꾼을 생산해줍니다.

먼저 일꾼 생산 코드를 작성합니다.

async def build_workers(self):
    nexus = self.townhalls.ready.random # 완성된 넥서스를 전부 가져옴
    if (
        self.can_afford(UnitTypeId.PROBE)
        and nexus.is_idle
        and self.workers.amount < self.townhalls.amount * 22
    ):
    	nexus.train(UnitTypeId.PROBE)

완성된 넥서스를 전부 가져와서

현재 프로브를 생산할 수 있는지 확인하고

동시에 넥서스가 놀고 있는지 확인하고

동시에 현재 보유하고 있는 일꾼 수가 모든 넥서스 수 * 22 보다 작을 때만 작동하도록 하였습니다.

그 이유는 가스 하나당 3기씩, 가스는 총 2개이고, 미네랄은 16기가 최적이므로

최대 22이기가 최대입니다.

await self.distribute_workers()
await self.build_workers()

위 코드를 on_step에 추가하여

일꾼 분배와 함께 일꾼을 생산합니다.

 

다음에는 파일런(수정탑)을 건설하도록 하겠습니다.