스타크래프트2 봇

스타크래프트2 인공지능 봇을 만들어보자 (#2)

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

스타크래프트 2 인공지능을 본격적으로 구현하고자

갈치와 서로 머리를 맞대어 생각한 결과

봇의 이름과 종족을 정하였습니다.

 

종족은 테란으로 하기로 결정하였습니다.

이름은 '실험용 기계', '더 봇 (The Bot)', '스타 플레티넘 봇'등의 안건이 나왔으나

어차피 재미로 만드는 봇이기도 하고, 구현하고 싶은 모든 기능들을 다 넣는 잡동사니처럼 만들 것 같기에

'하울의 움직이는 성'도 생각하였으나, 위 모든 안건들과 생각들을 잊어버리기 위해 술 이름으로 하기로 하였습니다.

소주나, 막걸리 같은 술도 생각하였으나, 테란 설정 상 제정신이 박혀있는 사람들이 거의 없다는 점을 참고하여

봇의 이름을 '압생트'로 결정하였다.

 

먼저 #1에서 설정한 것을 토대로 먼저 모듈을 불러오고

작업을 시작하겠습니다.

 

from pysc2.agents import base_agent
from pysc2.env import sc2_env
from pysc2.lib import actions, features
from absl import app

 

그런 다음 클래스를 정의를 해줘야하는 데, 심플하게 TerranAgent로 지었다.

class TerranAgent(base_agent.BaseAgent):

    def step(self, obs):
        super(TerranAgent, self).step(obs)

        return actions.FUNCTIONS.no_op()

미리 PySC2의 로직을 설명하다면, 매우 단순한 로직을 지니고 있다.

 

초기화 및 실행 → 실행 → 현재 상황 파악 → 액션 → 게임이 끝났는가? (예) → 초기화 및 종료. (아니요) → 현재 상황 파악으로 돌아감

 

그런다음 봇이 작동하는 메인을 작성할 것이다.

def main(unused_argv):
    agent = TerranAgent()

    try:
        while True:
            with sc2_env.SC2Env(
                    map_name="Automaton",  # 맵을 오토매이튼으로 세팅
                    players=[sc2_env.Agent(sc2_env.Race.terran),
                             sc2_env.Bot(sc2_env.Race.random,
                                         sc2_env.Difficulty.very_easy)
                             ],
                    # 상대방은 봇으로 할 것이며, 종족은 랜덤. 난이도 매우 쉬움
                    # 여기에 다른 agent 설정 가능
                    agent_interface_format=features.AgentInterfaceFormat(
                        feature_dimensions=features.Dimensions(screen=84, minimap=64)
                    ),
                    step_mul=16,
                    # 액션 설정. 8 -> 300APM. 16 -> 150APM
                    game_steps_per_episode=0,
                    # 기본값은 30분 이지만, 현재는 endless 로 설정
                    visualize=True
                    # 스크린 과 미니맵 해상도 설정
                    # PySC2 2.0에서는 RGB 레이어 를 추가할 수 있음
            ) as env:
                agent.setup(env.observation_spec(), env.action_spec())

                timeSteps = env.reset()
                agent.reset()

                while True:
                    step_actions = [agent.step(timeSteps[0])]
                    if timeSteps[0].last():
                        break
                    timeSteps = env.step(step_actions)

    except KeyboardInterrupt:
        pass

그런 다음 마지막으로 실행 코드를 2줄만 적으면 완료된다.

if __name__ == "__main__":
    app.run(main)

 

위 형식대로 작성을 한 후, 실행을 하면

오 토매 이튼으로 맵을 설정하고

아무런 기능을 하지않는 테란 봇이 완성된다.

전체 코드

 

다음은 건설로봇들을 사용하여, 보급고와 병영을 지은 후, 병영에서 해병들을 생산하는 것까지 구현하도록하겠다.