class_docstr: A Starcraft II environment.
  
  The implementation details of the action and observation specs are in
  lib/features.py
code: def _launch_game(self):
      # Reserve a whole bunch of ports for the weird multiplayer implementation.
      if self._num_agents > 1:
          self._ports = portspicker.pick_unused_ports(
              self._num_agents * 2
          )
          logging.info("Ports used for multiplayer: %s", self._ports)
      else:
          self._ports = []
  
      # Actually launch the game processes.
      self._sc2_procs = [
          self._run_config.start(
              extra_ports=self._ports,
              want_rgb=interface.HasField("render"),
          )
          for interface in self._interface_options
      ]
      self._controllers = [p.controller for p in self._sc2_procs]
  
      if self._battle_net_map:
          available_maps = self._controllers[0].available_maps()
          available_maps = set(available_maps.battlenet_map_names)
          unavailable = [
              m.name
              for m in self._maps
              if m.battle_net not in available_maps
          ]
          if unavailable:
              raise ValueError(
                  "Requested map(s) not in the battle.net cache: %s"
                  % ",".join(unavailable)
              )
  
imports: import collections
  import copy
  import random
  import time
  from absl import logging
  from pysc2 import maps
  from pysc2 import run_configs
  from pysc2.env import enums
  from pysc2.env import environment
  from pysc2.lib import actions
  from pysc2.lib import features
  from pysc2.lib import metrics
  from pysc2.lib import portspicker
  from pysc2.lib import renderer_human
  from pysc2.lib import run_parallel
  from pysc2.lib import stopwatch
  from s2clientprotocol import sc2api_pb2
label_desc: Use image node_id 4 for calling the SC2Env obj's underlying member method code with example usage: obj._launch_game() without return types