티스토리 뷰
자바로 스타크래프트 봇(이하 스타봇)을 개발하고자 하는 분, 그리고 스타봇이 어떤 매커니즘으로 개발되는지 궁금한 분들을 위해 글을 작성합니다.
우선 개발 환경부터 설정해야합니다. 에디터는 어떤 것을 사용하여도 좋으나, 개인적으로 인테리제이를 추천합니다.
(개인차는 있으나, 자동완성 및 지원해주는 것들이 많아 추천드립니다.)
그리고 스타크래프트를 설치해야하는 데, 일반적인 플러그인이나 봇들은 실제 돌아가는 서비스에 추가하는 것이 일반적이나, 블리자드 측에서 스타크래프트 1은 허락을 해주지 않아 직접 1.16.1 버전을 설치해야 합니다.
하지만 이를 직접 구하기에는 다소 번거롭기 때문에 스타봇을 직접 만들어 C++ 오픈 프레임워크로 만들어주신 Dave Churchill의 해당 주소를 통해 스타크래프트 1.16.1 버전을 설치할 수 있습니다.
http://www.cs.mun.ca/~dchurchill/startcraft/scbw_bwapi440.zip
참고로 해당 스타크래프트와 연결을 해주는 커넥터(리스너)는 BWAPI라고 불리는 BroodWarAPI입니다.
이를 기반으로 개발을 할 수 있습니다. 위 스타크래프트는 BWAPI 버전을 4.4.0을 사용하고 있으므로 아래 깃허브 링크로 들어가서 BWAPI를 설치해주시길 바랍니다. BWAPI_Setup.exe 파일을 다운로드하면 됩니다.
https://github.com/bwapi/bwapi/releases/tag/v4.4.0
보통 스타봇은 C++로 보통 개발을 합니다. 자료도 훨씬 많고, 물어볼 사람도 굉장히 많습니다.
하지만 저는 자바로 개발해보고자 합니다. 왜냐하면 저는 C++에 대해 잘 모릅니다. 대신 Java는 그보다는 많이 안다고 생각해서 자바로 개발을 할 것입니다.
다시 본론으로 넘어와 자바 New Project로 Gradle를 선택하신 다음 새로 프로젝트를 생성해주세요.
Maven과 Gradle 중 편리하게 다룰 수 있는 것은 Gradle이기에 선택하였습니다.
그 후 라이브러리를 하나 추가해야 합니다. Java는 C++과 달리 BWAPI에서 보내는 데이터를 바로바로 해석하여 처리할 수 없습니다. 그렇기에 라이브러리를 추가하여 BWAPI에서 보내는 데이터를 Java형식으로 바꾸어주는 방식으로 스타크래프트와 소통할 수 있도록 해주어야합니다. 저 같은 경우에는 다음과 같이 되어 있습니다. (참고로 JDK는 11버전을 사용하였는 데, JBWAPI 2.0.0 미만의 버전을 사용하시는 경우, JDK 1.8 (32bit)버전을 사용하시는 것을 추천드립니다. 호환이 안되는 경우가 종종 있습니다.)
plugins {
id 'java'
}
group 'com.tistory.iqpizza6349'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
allprojects {
repositories {
maven {
url 'https://jitpack.io'
}
}
}
dependencies {
implementation 'com.github.JavaBWAPI:JBWAPI:2.0.0'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
}
test {
useJUnitPlatform()
}
implementation 'com.github.JavaBWAPI:JBWAPI:2.0.0'를 추가해줍니다.
(JBWAPI 2.0.0는 Overview도 제대로 작성되지 않아서 공식문서가 따로 없습니다. 그렇기에 1.5.1 버전의 공식문서를 참고해서 개발을 해야합니다. 다행히도 바뀐 점이 엄청 많지는 않습니다.)
여기까지 하셨다면 개발 환경은 다 설정한 것입니다.
우선 간단하게 스타크래프트와 제대로 연결이 되는지부터 확인해보기 위해 간단하게 스타크래프트 화면에
"Hello, StarCraft!"정도를 출력하는 것으로 글을 마무리 짓겠습니다.
import bwapi.BWClient;
import bwapi.DefaultBWListener;
import bwapi.Game;
public class HelloStartCraft extends DefaultBWListener {
private Game game;
private BWClient bwClient;
@Override
public void onFrame() {
game.drawTextScreen(100, 100, "Hello, StarCraft!");
}
@Override
public void onStart() {
game = bwClient.getGame();
}
public void startGame() {
bwClient = new BWClient(this);
bwClient.startGame();
}
public static void main(String[] args) {
new HelloStartCraft().startGame();
}
}
매우 단순하게 출력을 할 수 있습니다.
간단하게 코드를 살펴보자면 BWClient라는 클래스는 스타봇 그 자체를 의미합니다.
BW(BroodWar)에 참여하는 Client(유저/봇)라고 생각하면 편합니다.
Game 클래스는 스타크래프트 자체를 의미합니다. 스타크래프트 게임에서 발생하는 각종 데이터를 사용할 수 있도록 해주는 클래스입니다. 그리고 해당 스타크래프트 게임 내에서 screen(화면)에서 x: 100, y: 100 위치에 "Hello, StarCraft!"를 출력하도록 합니다.
그리고 main 메소드를 실행하게 되면,
이 문구는 스타크래프트가 현재 Background에 실행되고 있지 않다는 의미이다.
이제 스타크래프트를 실행해주면 된다. 되는 데, 그냥 StarCraft.exe 파일을 실행하여 스타크래프트를 실행하지 않고
BWAPI를 통해 스타크래프트를 실행해주면 된다.
아까 다운로드한 BWAPI 파일 내에는 수많은 디렉토리들과 파일들이 존재하는 데, 그중 ChaosLauncher 디렉토리에서
Chaoslauncher - Multiinstance.exe 파일을 관리자 권한으로 실행해주면 된다. (간혹 BWAPI와의 연결이 끊길 경우, 크게 3가지 원인으로 발생하는 데, 그중 하나가 관리자 권한이 아니기에 발생한다.)
이제 실행한 다음 Single Player -> Expansion -> Ok -> Play Custom -> (아무 맵 설정) -> OK의 순서대로 진행하게 되면 다음과 같은 사진처럼 Hello, StarCraft!라는 문구가 스크린(화면)에 나오게 된다.
다음에는 자원 채취하는 방법에 대해서 다룰 것인데, 총 3가지 파트로 나누어 진행할 예정입니다.
1. 단순 튜토리얼 방식의 미네랄 채취
2. 가장 효율적으로 미네랄 채취
3. 가스 채취
'스타크래프트 봇' 카테고리의 다른 글
[스타크래프트 봇] 스타크래프트 봇을 자바로 개발해보자 (3) (0) | 2022.07.30 |
---|---|
[스타크래프트 봇] 스타크래프트 봇을 자바로 개발해보자 (2) (0) | 2022.07.23 |
[스타크래프트 봇] 스타크래프트 봇을 자바로 개발해보자 (1) (0) | 2022.07.16 |