스타크래프트2 봇

스타크래프트 2 봇 개발 일지-1(Ocraft)

오잎 클로버 2022. 1. 1. 06:30
728x90

좋은 새해 아침입니다.

새해는 아침을 보기 위해 날을 새고 친구들과 디코 통화를 했습니다.

 

덕분에 카페인에 절여진 기분이 듭니다.

 

스타크래프트 2 봇을 개발 일지를 작성하기 전 확인해주세요!

먼저 언어는 C++로 할려고 했지만

아직 C++를 자세히 몰라서 JVM언어인 Java, Kotlin, Python으로 할 예정입니다.

C++는 나중에 기회가 된다면 시도해보도록 하겠습니다. 

(죄송합니다. (>人<;))

 

Jvm 같은 경우에는 Ocraft-s2client라는 블리자드의 공식 api인 s2client-api를 자바로 Wrapper 처리한 api를 사용합니다.

Python 같은 경우에는 구글의 deepmind팀의 api인 pysc2를 사용합니다.

 

일단 2가지 방식 둘 다 게시할 계획이기에

Ocraft-s2client 사용한 글일 경우 

스타크래프트 2 봇 개발 일지-N(Ocraft) 라고 게시할 예정이고

pysc2 를 사용한 경우 스타크래프트 2 봇 개발 일지-N(pysc2) 라고 게시할 예정입니다.

그리고 굳이 자바로 하였던 것을 다시 코틀린으로 또 게시하지 않을 것입니다.

자바를 아는 분들이 더 많을 것으로 보이기 때문에 자바로 보통 게시할 것 같습니다.

참고해주세요.

 

 

다시 본론으로 넘어와서

github을 보시면 아시겠지만

메이븐밖에 적혀있지 않아서 메이븐을 꼭 사용할 것처럼 해놨지만

그냥 그레이들을 사용할 것입니다.

저는 늘 그래왔듯이 인텔리제이를 사용할 것이고

버전은 JDK 9+이면 되기때문에 JDK11를 사용할 예정입니다.

 

프로젝트를 하나 생성합니다.

그리고 build.gradle에 위와 같이 종속성을 추가해줍니다.

 

그런다음 튜토리얼을 따라하되 개개인의 상황을 고려하여 설정을 적당히 해주면 됩니다.

import com.github.ocraft.s2client.bot.S2Agent;
import com.github.ocraft.s2client.bot.S2Coordinator;
import com.github.ocraft.s2client.protocol.game.Difficulty;
import com.github.ocraft.s2client.protocol.game.LocalMap;
import com.github.ocraft.s2client.protocol.game.Race;

import java.nio.file.Paths;

public class TutorialBot {

    private static class Bot extends S2Agent {
        @Override
        public void onGameStart() {
            System.out.println("Hello, World of StarCraft2 bots!");
        }

        @Override
        public void onStep() {
            System.out.println(observation().getGameLoop());
        }
    }

    public static void main(String[] args) {
        Bot bot = new Bot();
        S2Coordinator s2Coordinator = S2Coordinator.setup()
                .loadSettings(args)
                .setParticipants(
                        S2Coordinator.createParticipant(Race.TERRAN, bot),
                        S2Coordinator.createComputer(Race.ZERG, Difficulty.VERY_EASY)
                )
                .launchStarcraft()
                .startGame(LocalMap.of(Paths.get("2000AtmospheresAIE.SC2Map")));

        while (s2Coordinator.update()) {

        }

        s2Coordinator.quit();
    }
}

총 코드는 위와 같습니다.

 

공식 문서를 읽어보니 어떤 클래스와 메소드들이 어떤 기능들을 수행하는 지 얼추 감이 잡히더라고요

 

우선 private로 내부 static 클래스를 하나 만들었는 데

s2Agent를 상속하였습니다.

이라고 적혀있는 것으로 보아

기본적인 봇을 만들기 위해 상속을 하는 것처럼 보입니다.

그리고 onGameStart 메소드는 게임이 시작되었을 때 실행될 영역을 정하는 것처럼 보입니다.

onStep은 게임이 시작이 되고 나서 게임이 진행되면서 어떤 것을 꾸준히 실행할 것인지를 정하는 것처럼 보입니다.

얼추 맞는 것 같습니다.

 

 

observation이 이런 뜻이 있다는 것으로 보아

관측 보고, 관측 정도로 추측하여 

게임이 진행되는 모든것을 관측, 즉 스크린에 담기는 모든 데이터들을 저장한다는 것으로 추측이 가능합니다.

 

main 메소드에서

Bot을 인스턴스화 시켜 본격적으로 빌드를 합니다.

그러기 앞서 만약 이글을 보시면서 스타크래프트2 봇을 개발하실 거라면

이점을 확실하게 봐주세요.

먼저, 본인의 OS에 따라 코드가 조금 더 추가 될 수도 아니면 저기서 코드의 양이 멈출 지 정해집니다.

혹여나 본인의 OS가 리눅스라면

commandLine에 스타크래프트2의 위치를 수동으로 잡아줘야한다...고 하는 데

제가 리눅스 OS를 하지 않다보니 이점은 설명드리지 못할 것 같습니다.

혹여나 리눅스 OS를 사용하고 계신다면 스타크래프트2 디스코드 서버에 오셔서 한 번 찾아주세요.

링크: https://discordapp.com/invite/Emm5Ztz

그외 OS인 윈도우와 Mac 같은 경우에는 스타크래프트2를 설치하시고 코드를 실행하시면 자동으로 스타크래프트2 위치를 기억합니다.

 

그리고 튜토리얼 문서를 보신 분들은 아시겠지만

.startGame() 부분이 튜토리얼과 다르다는 점은 이미 파악하셨을 겁니다.

저 같은 경우에는 오늘 시작했다보니 해당 맵이 배틀넷이 없을 뿐더러

따로 로컬에서도 다운로드 하지 않아

따로 맵을 다운로드하여 지정하였습니다.

 

만일 배틀넷에 있는 맵을 사용하는 방법을 알아낸다면 즉시 내용 추가하도록 하겠습니다.

 

일단 제가 맵을 배틀넷에서 가져오는 법을 모르기에

수동으로 다운로드하여 추가하는 방법을 작성하자면

먼저 스타크래프트2를 설치한 곳으로 이동합니다.

대부분 C:\Program Files (x86)\StarCraft II 입니다.

그런다음 Maps이라는 디렉토리를 생성합니다.

그 디렉토리에 스타2 맵을 추가해주면 됩니다.

저같은 경우에는 이 링크에서 맵을 찾아 다운로드 받았습니다.

 

스타크래프트 II 2021-12-31 23-39-54.mp4
12.72MB

위 영상과 같이 실행이 될 것입니다.

그리고 콘솔에 빨간 글씨와 더불어 하얀 글씨가 여러 보일 텐데

WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

이런 글같은 경우에는 Log4J에 대해 설정을 하지않아 발생하는 것으로 알고 있습니다.

 

실행이 되면

Hello, World of StarCraft2 bots!

이라는 메시지 이후 현재 게임이 진행된지 얼마나 되었는 지 카운트가 시작됩니다.

1
2
3
4
5
6
7
8
...

이상입니다.