스타크래프트2 봇 26

스타크래프트2 봇 대결 (개발예정)

현재 #code rest api가 어느정도 완성이 되어 열흘 뒤면 마무리되기때문에 그전에 한 번 시도해볼려고 했던 압생트봇 아주어려움 이기기 가 있었는 데, 다소 흐지부지가 되어 매우 아쉬웠기에 다시 한 번 더 해볼 예정인데 일단 계획은 총 2가지 봇을 만들 예정인데 우선 압생트 봇(P)를 하나 만들고 저그봇을 하나 더 만들어 이 둘을 붙여보는 것 역시 재미있겠다는 생각이 들어 만들어 볼 생각입니다. 프로토스 봇 이름은 압생트로 확실하게 지었는 데 저그 봇 이름은 아직 정하지 않아서 혹시라도 저그 봇 이름 아이디어가 있으신 분은 댓글로 적어주세요. 개발할 두 봇들은 다음과 같은 목표를 모두 포함하도록 할 것입니다. 핵심목표 공격가능 유닛(일꾼 제외) 최소 4종류이상 사용 주요 유닛종류마다 클래스를 따로 ..

Absinthe 개발 일지 (22/01/06)

스타크래프트2 봇 Absinthe를 다시 데리고 온 오잎 클로버입니다. 원래는 Java를 사용하는 프레임워크인 Ocraft로 개발을 할려고 했으나 정보도 너무나도 부족하고 시간도 많이 없기에 기존에 2주정도 시간을 들여 개발하였던 적이 있었던 pysc2로 개발하고자합니다. (시간이 남는다면 Ocraft로도 새로운 봇을 만들려고 시도해보도록 하겠습니다.) 먼저 기존 코드를 활용하였습니다. 기존 코드 링크 제가 구현하고자하는 중요한 기능들은 관문 (차원관문) 에서 생산할 수 있는 모든 유닛을 생산하는 것 관측선 및 불멸자 사용 광전사 돌진 업그레이드 추적자 점멸 업그레이드 및 사용 고위기사 사이오닉 폭풍 업그레이드 및 사용 인공지능 아주 어려움 (랜덤) 승리 위와 같습니다. 먼저 천천히 테크를 정해서 관문에..

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

지난 번에 건설 작업 후 놀고 있는 일꾼에게 다시 명령을 내리는 것을 했었습니다. 이번에는 배럭 건설 및 마린 생산, 그리고 최종적으로 공격이다. 필수 메소드 private int countUnitType(Units unitType) { return observation().getUnits(Alliance.SELF, UnitInPool.isUnit(unitType)).size(); } 위 메소드는 해당 유닛 종류가 몇 기나 있는 지 반환해주는 메소드이다. 병영 건설 private void tryBuildBarracks() { if (countUnitType(Units.TERRAN_SUPPLY_DEPOT) < 1) { return; } if (countUnitType(Units.TERRAN_BARRACKS..

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

지난 번에는 SCV 건설, 그리고 보급고 건설을 하였습니다. 이번에는 건설 직후, SCV가 노는 경우, 다시 작업에 착수하기 위한 코드를 작성할 것입니다. 일꾼 관리 스타크래프트2 같은 경우, 게임시작과 동시에 미네랄로 자동으로 보내주지만 그이후부터는 플레이어가 알아서 조절을 해야합니다. 그렇기때문에 건물 건설 등과 같은 미네랄 채취 외에 작업이 주어진 후에는 수동으로 다시 채취하도록 해야합니다. 보통 건물이 다 지어지면 자동으로 shift + 미네랄 우클릭을 해서 건물이 다 지어진 후 즉시 미네랄 채취 명령합니다. 이와 같이 개발하기 위해 제일 가까운 미네랄 하나를 찾아서 반환하여 놀고 있는 SCV에게 다시 미네랄을 채취하도록 합니다. private Optional findNearestMineralPa..

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

지난 번에는 기본적으로 스타크래프트2 봇을 테스트를 해보았습니다. 이번에는 일꾼 생산 및 보급고 건설을 해볼 겁니다. 일단 일꾼 생산 같은 경우에는 onUnitIdle 메소드를 오버라이딩하여 일하는 유닛들을 가져옵니다. UnitInPool 이라는 클래스가 어떤 클래스인지 그리고 어떤 방식으로 진행이 되어가는 지 잘 파악하지 못하였기때문에 원리를 제가 이해한 방식대로 한다면 UnitPool에 저장되고, UnitInPool에 인스턴스화된 것들을 가지고 오는 것 같습니다. SCV 생산 @Override public void onUnitIdle(UnitInPool unitInPool) { Unit unit = unitInPool.unit(); // 아직도 이해 못함 원리를 switch ((Units) unit...

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

좋은 새해 아침입니다. 새해는 아침을 보기 위해 날을 새고 친구들과 디코 통화를 했습니다. 덕분에 카페인에 절여진 기분이 듭니다. 스타크래프트 2 봇을 개발 일지를 작성하기 전 확인해주세요! 먼저 언어는 C++로 할려고 했지만 아직 C++를 자세히 몰라서 JVM언어인 Java, Kotlin, Python으로 할 예정입니다. C++는 나중에 기회가 된다면 시도해보도록 하겠습니다. (죄송합니다. (>人<;)) Jvm 같은 경우에는 Ocraft-s2client라는 블리자드의 공식 api인 s2client-api를 자바로 Wrapper 처리한 api를 사용합니다. Python 같은 경우에는 구글의 deepmind팀의 api인 pysc2를 사용합니다. 일단 2가지 방식 둘 다 게시할 계획이기에 Ocraft-s2c..

스타크래프트 2 봇 개발 일지-0

스타크래프트 봇 개발을 마무리 짓고 스타크래프트2 봇으로 다시 돌아왔습니다. 압생트 봇 글을 보신 분들은 알겠지만 Python을 사용해서 개발을 하였습니다. 이제부터 작성할 글인 스타크래프트2 봇 개발 일지는 파이썬 외에도 자유롭게 스타크래프트2 봇 개발과 관련된 글들을 올리는 개발 일지입니다. 겨울 방학 기간(2022-01-01 ~ 2022-02-01) 동안 하루에서 이틀 사이마다 제가 개발을 하며 맞추친 버그, 오류, 그리고 구현한 기능, 해결 등등 스타크래프트2 봇과 관련해서는 무엇이든지 올릴 계획입니다. 현재 스타크래프트 봇 동아리가 터진 이시점에서 정보가 부족한 스타1 보다는 스타2로 넘어갈도 생각 중에 있어 혹여나 스타크래프트2로 하게 된다면 좋은 글로 남기를 바랍니다. 그리고 개발 일지를 하..

압생트(Absinthe)봇 만들기 (#11)

방학이 끝나버려 더 이상 압생트 봇을 만들지 못하게 되었습니다. 그래도 나름대로 열심히 개발하고자 하였고, 지금 당장은 이번 글이 마지막이겠으나, 다음 방학인 겨울방학에 다시 개발을 하도록 하겠습니다. 이번이 마지막인 만큼 최대한 많은 것을 추가 및 구현하고자 하였습니다.먼저 시간 증폭입니다.현재 인공 제어소에서 차원관문을 업그레이드를 진행하고 있는 중이라면 시간 증폭을 인공 제어소에 사용하고그렇지 않지만, 수정탑이 건설 진행이거나 이미 완료된 적이 1번이라도 있다면 시간 증폭을 연결체에 사용하도록 하였습니다. async def chrono(self): if self.structures(UnitTypeId.PYLON): nexus = self.townhalls.ready.random if nexus.en..

압생트(Absinthe)봇 만들기 (#10)

이번에 구현하고자 하는 것은 영역 확장입니다. python_sc2에 이미 영역 확장하는 코드가 존재하기에 빠르게 마무리하고 이어서 공격에 관련하여 코드를 추가하도록 하겠습니다. python_sc2에 존재하는 파이썬 파일들 중 "bot_ai"라는 파일에서 expand_now라는 메소드에 이미 작성해야할 코드가 존재하기에 이를 메소드를 사용할 것입니다. 영역을 확장하는 데에 자원이 굉장히 많이 투자되고 그비용만큼 유닛을 생산하지 못하여 패배하는 경우가 있기에 적절한 영역확장이 필요합니다. 개인적으로 연결체는 3개 미만이고 자원이 충분할때에만 영역을 확장하도록 하였습니다. async def expand(self): if self.units(UnitTypeId.NEXUS).amount < 3 and self.c..

압생트(Absinthe)봇 만들기 (#9)

이번 글이 아마 스타크래프트 2 프로토스의 가장 기초적인 기능을 수행하도록 하는 데 있어 도움을 주는 글 중 마지막일 듯합니다. 여태까지 한 것을 요약하자면 1) 세팅 및 일꾼 생산 2) 수정탑 건설 3) 관문 건설 4) 융화소 건설 및 가스 채취 5) 인공 제어소 건설 6) 추적자 생산 7) 시간 증폭 사용 8) 차원관문 업그레이드 9) 공격 10) 차원관문 사용 11) 유닛 컨트롤 이번에 구현하고자 하는 기능은 10번과 11번입니다. 물론 아직도 남은 기능들은 굉장히 많으니 그건 나중에 진행하면서 천천히 설명드리겠습니다. 먼저 차원관문 사용입니다. 준비된 모든 차원관문들을 for-each를 하여, 해당 차원관문이 현재 당장 사용할 수 있는 능력을 확인합니다. (차원관문은 능력을 사용하여 유닛을 생산하..