/pysc2-minigame-ai

Rule based AI for StarCraft 2 Minigames

Primary LanguagePythonMIT LicenseMIT

StarCraft II Minigames

  • Rule based game AI for 5 StarCraft II Minigames
    • max score achieved for these agents:
      • CollectMineralShards: 125
      • CollectMineralsAndGas: 5010
      • DefeatRoaches: 91
      • DefeatZerglingsAndBanelings: 220
      • BuildMarines: 132
  • Author

TOC

[TOC]

 

 

Usage

  • Files

    final_agent_lzh.py
    tactics.py
  • Install

    • Install StarcraftII from battle.net (or link for linux)
    • download minigame map in link, extract and put in to your StarcraftII/Maps/ directory
    • install pysc2, numpy as instructed (pip install pysc2, numpy)
    • put final_agent_lzh.py and tactics.py in your installed site-packages pysc2/agents path
      • for example ~\Anaconda3\Lib\site-packages\pysc2\agents\ (if you are using Anaconda)
  • Usage

    # CollectMineralShards
    python -m pysc2.bin.agent --map CollectMineralShards --agent pysc2.agents.final_agent_lzh.CollectMineralShards --use_feature_units
    
    # CollectMineralsAndGas
    python -m pysc2.bin.agent --map CollectMineralsAndGas --agent pysc2.agents.final_agent_lzh.CollectMineralsAndGas --use_feature_units
    
    # DefeatRoaches
    python -m pysc2.bin.agent --map DefeatRoaches --agent pysc2.agents.final_agent_lzh.DefeatRoaches --use_feature_units
    
    # DefeatZerglingsAndBanelings
    python -m pysc2.bin.agent --map DefeatZerglingsAndBanelings --agent pysc2.agents.final_agent_lzh.DefeatZerglingsAndBanelings --use_feature_units
    
    # BuildMarines
    python -m pysc2.bin.agent --map BuildMarines --agent pysc2.agents.final_agent_lzh.BuildMarines --use_feature_units

 

 

Overall Agent Structure

  • Overall structure pysc2

    • Definition
      • Tactic: one complete movement (e.g. train an SCV by a CommandCenter)
    • We notice that most tactic should contain 3 steps
      • check if this tactic should be used (e.g. check if we have a CommandCenter , and have enough minerals to train an SCV)
      • select the executor of this tactic, click one unit on the screen, e.g. select the CommandCenter)
      • execute the tactic (use the selected CommandCenter to train an SCV)
    • So we build a basic pipeline for every AI (shown in the figure above)
      • select_new_tactic: for each step, we first make a decision if we want to start a new tactic, or we are in the execution of a tactic.
      • select_tactic: if we want to start a new tactic, then we iteratively go through the tactics' criterion (check_available_func()) to select one.
      • choose_executer: After we choose the tactic, we return a select op (select_executer_func()) to select the executor we want to execute this tactic.
      • exec_selected_tactic: If we are in the execution of a tactic (i.e. we have chosen a tactic and select an executer in the previous step()), we return the execution function (exec_func()) to finally execute the tactic.
  • How to write a new agent?

    • Overall:

      • We have a base class TacticAgent in final_agent_lzh.py, which is inherited by other agents.
      • If you want to write a new agent, you need to inherit TacticAgent and rewrite the variable self.possible_tactic_list in the setup() function.
      • Items in self.possible_tactic_list are instances from class Tactic in tactics.py.
    • Example:

      import tactics
      tactic_no_op = tactics.Tactic(
          lambda *argv: True, # check_func
          lambda *argv: FUNCTIONS.no_op(), # select_executor_func
          lambda *argv: FUNCTIONS.no_op()  # execute_func
      )
      
      class NewAgent(TacticAgent):
          def setup(self, obs_spec, action_spec):
              super(NewAgent, self).setup(obs_spec, action_spec)
              self.posible_tactic_list = [
                  tactic_no_op,
                  ... # other tactics
              ]

Strategy

  • Strategy for each game: (Here we briefly summarize them. The code in final_agent_lzh.py is extremely clear and self-documented.)
    • CollectMineralShards
      • Let the two marine collect different mineral shards one by one
    • CollectMineralsAndGas
      • build a new CommandCenter
      • if SupplyDepot count < 3 and CommandCenter count >=2 and food_cap == food_used, then build SupplyDepot
      • if there is idle SCV, then let it harvest mineral
      • train SCV
    • DefeatRoaches
      • Defeat the one with the largest y pos
    • DefeatZerglingsAndBanelings
      • send 3 marines to kill Zerglings (be bait/pioneer to let Baneling explode)
      • After all Banelings are gone, send all army to attack all Zerglings
    • BuildMarine
      • if there is idle SCV, then let it harvest mineral
      • if food_cap == food_used, then build supply depot
      • if Barracks count < 7, then build Barracks
      • if Barracks count >= 7, then train marine
      • if SCV count < 20, then train SCV

 

 

Results

For each game, we run 10 times and record the results. We can see that we outperform DeepMind's best baseline in [1] in terms of mean score across 4 games (except DefeatRoaches) and some of our scores are very competitive compared to human players'.

  • CollectMineralShards

    Mean Std Max
    StarCraft GrandMaster in [1] 177 N/A 179
    DeepMind Human Player in [1] 133 N/A 142
    DeepMind best baseline in [1] 104 N/A 137
    Ours 113 6 125
  • CollectMineralsAndGas

    Mean Std Max
    StarCraft GrandMaster in [1] 7566 N/A 7566
    DeepMind Human Player in [1] 6880 N/A 6952
    DeepMind best baseline in [1] 3978 N/A 4130
    Ours 4802 100 5010
  • DefeatRoaches

    Mean Std Max
    StarCraft GrandMaster in [1] 215 N/A 363
    DeepMind Human Player in [1] 41 N/A 81
    DeepMind best baseline in [1] 101 N/A 373
    Ours 25 24 91
  • DefeatZerglingsAndBanelings

    Mean Std Max
    StarCraft GrandMaster in [1] 727 N/A 848
    DeepMind Human Player in [1] 729 N/A 757
    DeepMind best baseline in [1] 96 N/A 444
    Ours 108 41 220
  • BuildMarine

    Mean Std Max
    StarCraft GrandMaster in [1] 133 N/A 133
    DeepMind Human Player in [1] 138 N/A 142
    DeepMind best baseline in [1] 6 N/A 62
    Ours 127 5 132

Reference

[1] StarCraft II: A New Challenge for Reinforcement Learning. in ArXiv

Useful links

Some of the API usage is learned from the following links

License

MIT