스타봇

스타크래프트 봇 동아리, 내전용 봇 개발 (#4)

오잎 클로버 2021. 7. 12. 16:01
728x90

스타크래프트를 복잡하게 생각하지 않고 단순하게 생각하자면

공·수 게임이다.

공격과 수비를 번갈아가며 플레이를 하는 게임이다.

저자가 생각한 바로는

상대방이 빠른 러쉬를 한다면 그에 맞대응하기위해 저글링으로 방어를 하고 어느정도 병력이 쌓이면 공격을 간다라는 것은 스타크래프트를 해본 플레이어라면 모두가 아는 사실일 것 이다.

또, 대부분의 유닛을 집결시키는 곳은 앞마당 혹은 본진 길목이다.

봇 역시 길목에 배치를 시키되, 조건을 하나 추가하자면

앞마당을 먹었다면 앞마당 길목로 집결시키고, 본진뿐이라면 본진 길목으로 집결시킨다.

이를 구현하고자 기존 코드를 뜯어고쳤다.

// 공격 모드가 아닐 때에는 전투유닛들을 아군 진영 길목에 집결시켜서 방어
if (!isFullScaleAttackStarted) {
	Chokepoint chokePoint = BWTA.getNearestChokepoint(InformationManager.Instance().getMainBaseLocation(InformationManager.Instance().selfPlayer).getTilePosition());

	if (MyBotModule.Broodwar.self().completedUnitCount(UnitType.Zerg_Hatchery) <= 2 || MyBotModule.Broodwar.getFrameCount() >= 15000)
		chokePoint = BWTA.getNearestChokepoint(InformationManager.Instance().getSecondChokePoint(InformationManager.Instance().selfPlayer).getCenter().toTilePosition());

	for (Unit unit : MyBotModule.Broodwar.self().getUnits()) {
		if (!unit.getType().isWorker() && !unit.getType().isBuilding() && unit.getType().canAttack() && unit.isIdle()) {
			commandUtil.attackMove(unit, chokePoint.getCenter());
		}
	}
...
}

사실 초반 방어는 길목만 잘 막아도 방어가 충분히 가능하다.