스타봇

스타크래프트 봇 동아리, 내전용 봇 개발 (#12) | 디파일러 파트 (2)

오잎 클로버 2021. 7. 23. 12:00
728x90

파트1을 확인하고자하면

아래의 링크를 참고하시길 바란다.

디파일러 파트 (1)

파트1과 동일하게 영상을 시작으로 개선된 코드를 작성하겠다.

 

 

파트1에 작성되었던 코드 중 다크스웜은 문제가 아니었음을 파악하였다.

컨슘 파트가 문제였다.

컨슘파트도 메소드로 나누었다.

private Unit nearestMyUnit(Unit unit, UnitType unitType) {
	double minDist = Double.MAX_VALUE;
	Unit nearestType = null;
	for (Unit findType : MyBotModule.Broodwar.self().getUnits()) {
		if (findType.getType() == unitType) {
			if (unit.getDistance(findType) < minDist) {
				minDist = unit.getDistance(findType);
				nearestType = findType;
			}
		}
	}
	return nearestType;
}
	
private void consume(Unit defiler) {
	Unit nearestZergling = nearestMyUnit(defiler, UnitType.Zerg_Zergling);
	
	if (nearestZergling != null && nearestZergling.exists()) {
		if (defiler.getDistance(nearestZergling) <= 32) {
			commandUtil.useTech(defiler, TechType.Consume, nearestZergling);
		}
		else {
			commandUtil.move(defiler, nearestZergling.getPosition());
		}
	}
	else {
		if (Config.DrawGameInfo)
			System.out.println("저글링 부족");
	}
		
	// 한 번 컨슘 후 더이상 이동을 하지않는다.
	// 이미 충분히 그외 저글링들과 가까이 있으니까
	// 그러면 컨슘을 해야하는 데 컨슘을 하지않음
	// 너무 가까워서 컨슘을 하지않는 것 같기도 하고 잘 모르겠음
			
}

nearestMyUnit메소드는 아군 중 특정 UnitType들 중 가장 가까운 유닛을 찾는 메소드이다.

기존 getSelfUnit메소드는 딜레이의 문제등의 여러 문제들 때문에 안전하지않을 수 있기에게임 전체를 가져와서 사용을 하였다.하지만 정상적인 유닛이 아닐 수 도 있다는 단점이 있다.컨슘의 사거리는 1로 근접이다.

더보기
(근접마다 내부적인 사거리의 차이(픽셀 게임인 만큼 여러 변수에 따라 변동이 되기도 한다)는 존재하나, 편의상 1로 작성하였다)

컨슘이 리서치되었다면 에너지 150미만이라면 위 메소드인 consume를 사용한다.

기존 에너지 175미만이면 컨슘을 사용하도록하였지만

현재는 최대에너지의 3/4만큼 미만이면 컨슘을 하도록 개선할 예정이다.

 

시연 영상에서도 다크스웜을 로직에 따라 이행하지않는 것으로 보이지만

이는 적과의 거리가 너무 짧아 발생하는 문제인것으로 확인되었다.

(시연영상은 저 하나의 영상이지만 테스트를 여러가지를 시도하였다.

거리를 멀리 띄운다면 잘 작동하는 것을 확인하였다.)

 

그리고 추가로 현재 BWAPI 버전은 412이며, 스타크래프트 버전1.16.1를 사용한다.

애시당초에 필자가 bwapi를 오래된 버전을 사용하기에 발생하는 문제가 여러 있다.

현재 가장 최신 버전은 4.4.0이다.

하지만 없어져버린 메소드들이 많기때문에 버전을 옮기지않고 있다.

현재 개발하고 있는 내전용 봇이 완성되고 나면 최신 버전을 사용하도록하겠다.

 

발생하는 문제들 중에 제일 심각한 문제는 

Java Runtime Environment 에러가 발생하여

JVM Crash가 나타난다.

필자는 JVM Crash 때문에 고생을 하였다.

고생을 덜 하고싶다면 최신 버전을 사용하길 바란다.