Jak začít s vývojem soutěžního bota?

Obsah stránky:

Instalace Starcraft II

Prvním krokem je stažení samotné hry StarCraft II. Základní verze je dostupná zdarma (tato verze je pro potřeby soutěže dostatečná). Stáhnout ji můžete na oficiální stránce.

StarCraft II je oficiálně podporován na platformách Windows a Mac OS. Je však možné jej hrát na linuxových distribucích za pomoci programu Wine.

Po instalaci doporučujeme absolvování základního tutoriálu hry. Především pak pokud nemáte s RTS hrami zkušenost. Komplexnosti hry se nebojte, pro potřeby soutěže jsme připravili zjednodušenou mapu.

Mapa pro ročník 2020

Pro potřeby soutěže jsme modifikovali originální mapu Agria Valley. Mapa obsahuje jednu hratelnou rasu - Terrany.

Mapu si můžete jednoduše zahrát s kamarády. Stačí ve hře StarCraft II vytvořit dle Custom, Melee a vyhledat mapu s názvem Sc2 AI Cup 2020. Poté vytvořte lobby (pozor, ověřte, že je v dropdown vybrána hodnota Legacy of the Void, jiné možnosti mají vliv na technologický strom).

Před psaním samotného bota doporučujeme mapu vyzkoušet buď s kamarády nebo s vestavěnou AI.

Staženou mapu vložte do adresáře Maps/ ve složce StarCraft II.

AgriaValley mapa

Omezený technologický strom

V rámci upravené mapy jsme rovněž omezili výchozí technologický strom Terranů.

Absence výběru rasy a omezenost technologického stromu způsobí, že programování bota je značně jednodušší. Základní principy hry jsou však stále zachovány.


Command Center

  • SCV je základní jednotka umožňující těžit suroviny a stavět budovy. Není sice primárně určena pro boj, ale v nejhorším případě se dokáže bránit (pouze na blízko).
Barracks
  • Marine slouží jako lehká pěchota. Jako jediná pozemní jednotka dokáže zacílit jak pozemní, tak i letecké jednotky.
  • Marauder plní roli těžké pěchoty. Narozdíl od mariňáka je mnohem odolnější, takže vydrží i pár zásahů tankem.
  • Reaper je lehká průzkumná pěchota. Díky svému jetpacku dokáže překonat nerovnosti terénu.
Factory
  • Hellion je lehké průzkumné vozidlo. Vyniká hlavně svou rychlostí a levnou pořizovací cenou.
  • Siege Tank je nejsilnější pozemní jednotka. Lze jej přepnout do obléhacího režimu, v němž se sice nemůže pohybovat, ale zato získá velký dostřel a ničivou sílu.
Starport
  • Viking je univerzální jednotka. Po svém postavení je v leteckém módu, ale lze jej kdykoliv transformovat na pozemního robota.
  • Medivac slouží jako podpůrná letecká jednotka, která dokáže léčit pěchotní jednotky a také umí vzduchem převážet libovolné pozemní jednotky.

Pro detailnější informace o jednotkách a budovách doporučujeme StarCraft II wikipedii.

Vytvoření prvního bota

Implementace základního bota je jednoduchá. Níže naleznete postup pro operační systém Windows 10.

  1. Nainstalujte Python 3. Návod naleznete například na docs.python-guide.org/starting/install3/win/.
  2. Ověřte, že máte správně nainstalovaný balíčkovač pip, případně jej doinstalujte.
  3.   
      $ pip -V
      pip 20.0.2 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
      
      
  4. Nainstalujte knihovnu pro tvorbu StarCraft II botů Python-Sc2. Pozor, existuje rovněž starší verze Dentosal/python-sc2. Používejte pouze BurnySc2/python-sc2.
  5.   
      $ pip install --upgrade burnysc2
      
      
  6. Stáhněte si zdrojový kód jednoduchého bota.
  7. Ověřte, zda máte správně nainstalovanou mapu a spusťte ukázkového bota.
  8.   
      $ python sample-bot.py
      
      

Po provedení těchto kroků by mělo dojít k automatickému spuštění hry dvou hráčů na mapě Sc2 AI Cup 2020.

Zdrojový kód ukázkového bota


import sc2
from sc2.bot_ai import BotAI
from sc2.player import Bot, Computer
from sc2.ids.unit_typeid import UnitTypeId


class MarineRush(BotAI):
    '''
    Ukázkový bot pro Sc2 Ai Cup.

    Bot staví 6x Barracks a posílá vlny 15 jednotek Marine do útoku.
    '''

    async def on_step(self, iteration):
        '''Metoda provedena každou iterací hry'''

        # Jestliže mám Command Center
        if self.townhalls:
            # První Command Center
            command_center = self.townhalls[0]

            # Trénování SCV
            # Bot trénuje nová SCV, jestliže je jich méně než 17
            if self.can_afford(UnitTypeId.SCV) and self.supply_workers <= 16 and command_center.is_idle:
                command_center.train(UnitTypeId.SCV)

            # Postav Supply Depot, jestliže zbývá méně než 6 supply a je využito více než 13
            if self.supply_left < 6 and self.supply_used >= 14 and not self.already_pending(UnitTypeId.SUPPLYDEPOT):
                if self.can_afford(UnitTypeId.SUPPLYDEPOT):
                    # Budova bude postavena poblíž Command Center směrem ke středu mapy
                    # SCV pro stavbu bude vybráno automaticky viz dokumentace
                    await self.build(
                        UnitTypeId.SUPPLYDEPOT,
                        near=command_center.position.towards(self.game_info.map_center, 8))

            # Stavba Barracks
            # Bot staví tak dlouho, dokud si může dovolit stavět Barracks a jejich počet je menší než 6
            if self.tech_requirement_progress(UnitTypeId.BARRACKS) == 1:
                # Je jich méně než 6 nebo se již nějaké nestaví
                if self.structures(UnitTypeId.BARRACKS).amount < 6:
                    if self.can_afford(UnitTypeId.BARRACKS) and not self.already_pending(UnitTypeId.BARRACKS):
                        await self.build(
                            UnitTypeId.BARRACKS,
                            near=command_center.position.towards(self.game_info.map_center, 8))

            # Trénování jednotky Marine
            # Pouze, má-li bot postavené Barracks a může si jednotku dovolit
            if self.structures(UnitTypeId.BARRACKS) and self.can_afford(UnitTypeId.MARINE):
                # Každá budova Barracks trénuje v jeden čas pouze jednu jednotku (úspora zdrojů)
                for barrack in self.structures(UnitTypeId.BARRACKS).idle:
                    barrack.train(UnitTypeId.MARINE)

            # Útok s jednotkou Marine
            # Má-li bot více než 15 volných jednotek Marine, zaútočí na náhodnou nepřátelskou budovu nebo se přesune na jeho startovní pozici
            idle_marines = self.units(UnitTypeId.MARINE).idle
            if idle_marines.amount > 15:
                target = self.enemy_structures.random_or(
                    self.enemy_start_locations[0]).position
                for marine in idle_marines:
                    marine.attack(target)

            # Zbylý SCV bot pošle těžit minerály nejblíže Command Center
            for scv in self.workers.idle:
                scv.gather(self.mineral_field.closest_to(command_center))
        else:
            print("GG")


sc2.run_game(sc2.maps.get("sc2-ai-cup-2020"), [
    Bot(sc2.Race.Terran, MarineRush()),
    Computer(sc2.Race.Terran, sc2.Difficulty.Medium)
], realtime=False)


Více informací o knihovně Python-Sc2 naleznete na stránce burnysc2.github.io/python-sc2/.

Podpora ostatních knihoven

Seznam aktuálně podporovaných a otestovaných knihoven (na testování ostatních usilovně pracujeme):

Komunita

StarCraft II má širokou AI komunitu, níže naleznete seznam doporučených zdrojů: