스타봇

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

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

이제부터 작업할 기능들은 꼭 필요한 기능들은 아니지만 있으면 쓸만한 기능들 중 하나인

'카이팅'을 구현해보고자 한다.

카이팅이란?  
'공격과 공격 사이에는 텀이 생긴다'는 게임 시스템을 이용한 것이다. 어차피 연타한다고 공격이 더 빨리 나가는 것도 아니니, 그 텀을 다음 공격을 하기 좋게, 상대의 공격을 회피하기 위해 이동하는 데 쓰는 것. 즉, 공격, 공격, 공격...이 아니라 공격, 이동, 공격, 이동...식으로 조종하는 것을 의미한다.

저그 유닛 가운데 카이팅을 할 만한 유닛은 두 가지뿐이다.

'히드라리스크'와 '뮤탈리스크'인데, 

그중 이번에 해볼 유닛은 '히드라리스크'이다.

먼저 코드부터 확인하자면

private void hydraKite(Unit unit, Unit target) {

	if (unit == null || target == null)
		return;

	double range = unit.getType().groundWeapon().maxRange();
	if (MyBotModule.Broodwar.self().getUpgradeLevel(UpgradeType.Grooved_Spines) != 0)
		range = 5*32;

	// 카이팅을 할 수 있는 지 없는 지 결정
	if (range <= target.getType().groundWeapon().maxRange()) {
		commandUtil.attackUnit(unit, target);
		return;
	}

	boolean canKite = true;
	double dist = unit.getDistance(target);
	double speed = unit.getType().topSpeed();

	// 카이팅 못 하면 카이팅 하지 말것
	double timeToEnter = Math.max(0.0, (dist - range) / speed);
	if ((timeToEnter >= unit.getGroundWeaponCooldown()))
		canKite = false;

	if (target.getType().isBuilding())
		canKite = false;

	if (canKite) {
		Position fleePosition = new Position(unit.getPosition().getX() - target.getPosition().getX() + unit.getPosition().getX(),
				unit.getPosition().getY() - target.getPosition().getY() + unit.getPosition().getY());
		commandUtil.move(unit, fleePosition);
	}
	else
		commandUtil.attackUnit(unit, target);
	}

가장 가까운 적을 상대로 카이팅을 하게 하였고, 히드라 사업을 하였다면 range 값을 변동시킨다.

자신보다 사거리가 긴 상대로 카이팅을 하는 것은 아무 의미가 없기에 자신보다 사거리가 같거나 크다면 

카이팅을 하지 않는다.

스타크래프트 유저들이 흔히 하는 카이팅 유닛들은 

테란 '마린', '벌처', '레이스'

저그 '히드라', '뮤탈'

토스 '드라군', '캐리어'

정도가 있다.

벌처를 제외한 유닛들은 공중 및 지상 공격이 모두 가능하다.

만일 벌처를 카이팅 시키고 싶다면 

if ((unit.isFlying() && !commandUtil.CanAttackAir(target)) || (!unit.isFlying() && !commandUtil.CanAttackGround(target)))
	canKite = false;

위 코드를 넣어 조건에 해당할 때만 공격하도록 한다.

또, 카이팅을 통한 이동을 언덕 쪽으로 간다면 비효율적이다.

평지에서는 꽤 좋은 이득을 취할 수 있다.

카이팅 유닛 중 가장 좋은 유닛은 당연 '드라군'이다.

사업 시, 사거리 6이라는 기본 유닛 중 가장 사거리가 길기 때문이다.

(물론, 대형이라는 단점이 있다)

 

기본 인공지능 테란의 공격 (유닛 약 19기) 대 사업된 히드라 약17기와 맞붙었을 때

마린 2기와 메딕 2기를 제외하여 다 잡은 것으로 보아,

오직 히드라로만 사용한 것 치곤 괜찮은 결과라고 생각이 든다.