일하기싫은 워커홀릭 개발자 12

압생트(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를 하여, 해당 차원관문이 현재 당장 사용할 수 있는 능력을 확인합니다. (차원관문은 능력을 사용하여 유닛을 생산하..

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

드디어 공격을 구현하고자합니다. 공격은 단순하게 상대 진영을 공격하게 만드는 것으로 마무리할 것입니다. 먼저 저 같은 경우에는 추적자만을 사용하였기때문에 추적자만 관리하여 공격을 하면 됩니다. 추적자가 최소 4마리이상은 되야 공격을 가도록 하였습니다. async def attack(self): stalker_count = self.units(UnitTypeId.STALKER).amount stalkers = self.units(UnitTypeId.STALKER).ready.idle if stalker_count < 4: return for stalker in stalkers: stalker.attack(self.enemy_start_locations[0]) 이렇게만 구현 및 추가하더라도 정예까지는 매우 ..

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

이번에 구현하고자 하는 것은 차원관문 업그레이드입니다. 차원관문은 스2에서만 존재하는 특별한 기능 중 하나입니다.관문을 통하여 생산하는 유닛이고, 동력이 통하는 곳이라면 어디서든지 생산이 가능하게 만드는 기능입니다.또, 생산속도 역시 빨라집니다. 차원관문을 업그레이드 중이 아니고 인공제어소가 있다면 업그레이드하도록 하는 것이 로직입니다. async def warpgate_research(self): if ( self.structures(UnitTypeId.CYBERNETICSCORE).ready and self.can_afford(AbilityId.RESEARCH_WARPGATE) and self.already_pending_upgrade(UpgradeId.WARPGATERESEARCH) == 0 ): ..

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

이번에 구현하고자 하는 것은 시간 증폭입니다. 시간증폭은 건물에 적용하여 일정시간동안 빠르게 가동시키는 능력으로연결체에서 사용가능합니다.에너지는 50이 사용되지만 약 20초(보통 시간 기준으로는 28초입니다)정도 시간을 빠르게 흐르게 하는 능력입니다.초반에는 탐사정을 더욱 빠르게 생산가능하므로 연결체에게 사용하도록 하였습니다.추후 코드는 충분히 변경될 수 있습니다.(업그레이드등을 하여야할 때에는 빠르게 진행하는 것이 중요하기 때문입니다.) async def chrono(self): if self.structures(UnitTypeId.PYLON): nexus = self.townhalls.ready.random if ( self.structures(UnitTypeId.PYLON).amount > 0 ):..

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

이번에 구현하고자 하는 것은 유닛 생산입니다. 사실 유닛 생산하는 것과 공격하는 것까지 구현했다면 스타크래프트에서는 반은 완성했다고 생각하면 됩니다. 개인적으로 광전사들을 뽑기를 생각하였으나, 난이도 어려움을 이기기에서 광전사들로 만 하여 이기는 것은 꽤 어려움이 있을 것이라고 판단하였습니다.(물론 광전사의 돌진과 컨트롤들을 만들면 안 될 거야 없긴 하지만 귀찮으니까요) 그래서 어떤 유닛을 생산할지를 고민하다가 가장 적절한 유닛이 떠올랐습니다. 추적자입니다. 원거리 유닛이고 중장갑한테도 나름 큰 피해를 줄 수 있기 때문에 추적자만을 뽑도록 하였습니다.(귀차니즘이 위험한 이유) 로직도 대충 생각하는 데로 적어도 작동하는 데에는 큰 문제가 없습니다. 게이트가 있고, 게이트가 아무것도 생산 중이 아니라면 추적..

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

이번에 구현하고자 하는 것은 사이버네틱스 코어 (인공 제어소) 건설입니다. 테크를 진행하는 건물 중 하나이자, 스타크래프트 2에서 프로토스를 더 포크로 만들어준 기능을 업그레이드를 할 수 있는 건물입니다. 공중 업그레이드와 차원관문을 업그레이드할 수 있습니다. 간단한 로직을 세워봅시다. 먼저 인공 제어소는 수정탑과 관문이 있어야지만 건설 가능한 건물입니다. 역시 당연하게도 주변에 동력이 공급되어야지만 건설 가능합니다. 이를 토대로 한 코드가 아래와 같습니다. async def build_core(self): if self.structures(UnitTypeId.PYLON).ready: pylons = self.structures(UnitTypeId.PYLON).ready.random if self.str..

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

이번에 구현하고자 하는 것은 어시밀레이터(융화소) 건설입니다. 미네랄(광물) 외에도 스타크래프트에 존재하는 또 다른 자원이 하나 있습니다. 바로 '가스'입니다. 가스로 더 강력한 유닛을 생산하고 테크를 가는 데에 있어 필수입니다. 한 마디로 요약하자면, 가스 없이는 고급 테크를 가지 못하고, 고급 테크를 가지 못한다면 고급 유닛을 생산할 수 없다는 의미입니다. 간단한 로직부터 세워보자면 넥서스 가까이에 존재하는 두 간헐천에 건설하도록 하는 것이 목표입니다. 먼저 가스의 경우에는 어떠한 제약도 없습니다. 미리 먼저 어떤 건물이 있어야 건설된다거나 하는 조건이 없다는 의미입니다. 또, 연결체, 수정탑과 더불어 동력 없이 건설되는 건물 중 하나입니다. 위 로직대로 작성한 코드는 아래와 같습니다. async d..

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

이번에 구현하고자 하는 것은 게이트웨이(관문) 건설입니다. 공격 유닛을 생산하는 가장 기본적인 건물인 게이트웨이는 질럿(광전사), 파수기, 추적자, 사도 등 기본적인 유닛을 생산할 수 있는 건물입니다. 주변에 동력을 공급해주는 파일런(수정탑)이 있어야 합니다. 간단한 로직을 세워보자면 먼저 게이트웨이를 짓기 위해서는 넥서스(연결체)와 파일런(수정탑)이 각각 1개씩 있어야 건설할 수 있습니다. 또, 미네랄(광물)이 150이 요구되며, 해당 건물을 지을 프로브(탐사정)가 1기 요구됩니다. 건설 위치에는 반드시 동력이 공급되는 위치여야 합니다. 현재는 게이트웨이를 하나만 건설하도록 게이트웨이가 건설된 적이 없을 때에만 건설하도록 하였습니다. 위 로직대로 작성한 최종 코드는 이러합니다. async def bui..