コード例 #1
0
def mineral_worker(agent):
    camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs)
    # print(camera_on_base)

    if not camera_on_base:
        return

    gas_pos = U.judge_gas_worker(agent.obs, agent.env.game_info)
    if gas_pos:
        probe = U.get_mineral_probe(agent.obs)
        probe_pos = T.world_to_screen_pos(agent.env.game_info, probe.pos,
                                          agent.obs) if probe else None
        move_worker(agent, gas_pos, probe_pos)

    if U.judge_gas_worker_too_many(agent.obs):
        probe = U.get_gas_probe(agent.obs)
        probe_pos = T.world_to_screen_pos(agent.env.game_info, probe.pos,
                                          agent.obs) if probe else None
        # print('probe_pos', probe_pos)

        mineral = U.find_unit_on_screen(agent.obs, C._MINERAL_TYPE_INDEX)
        mineral_pos = T.world_to_screen_pos(agent.env.game_info, mineral.pos,
                                            agent.obs) if mineral else None
        move_worker(agent, mineral_pos, probe_pos)

        # move_worker(agent, C.mineral_pos, probe_pos)
    else:
        # train_worker(agent, C.base_pos, C._TRAIN_PROBE)
        base = U.find_unit_on_screen(agent.obs, C._NEXUS_TYPE_INDEX)
        base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos,
                                         agent.obs) if base else None
        train_worker(agent, base_pos, C._TRAIN_PROBE)
コード例 #2
0
    def tech_step(self, tech_action):
        # to execute a tech_action
        # [pylon, gas1, gas2, gateway, cyber]

        if tech_action == 0:  # pylon
            no_unit_index = U.get_unit_mask_screen(self.obs, size=2)
            pos = U.get_pos(no_unit_index)
            M.build_by_idle_worker(self, C._BUILD_PYLON_S, pos)

        elif tech_action == 1 and not U.find_gas(self.obs, 1):  # gas_1
            gas_1 = U.find_geyser_pos(self.obs, 1)
            gas_1_pos = T.world_to_screen_pos(self.env.game_info, gas_1.pos,
                                              self.obs)
            M.build_by_idle_worker(self, C._BUILD_ASSIMILATOR_S, gas_1_pos)

        elif tech_action == 1 and not U.find_gas(self.obs, 2):  # gas_2
            gas_2 = U.find_geyser_pos(self.obs, 2)
            gas_2_pos = T.world_to_screen_pos(self.env.game_info, gas_2.pos,
                                              self.obs)
            M.build_by_idle_worker(self, C._BUILD_ASSIMILATOR_S, gas_2_pos)

        elif tech_action == 2:  # gateway
            power_index = U.get_power_mask_screen(self.obs, size=5)
            pos = U.get_pos(power_index)
            M.build_by_idle_worker(self, C._BUILD_GATEWAY_S, pos)

        elif tech_action == 3:  # cyber
            power_index = U.get_power_mask_screen(self.obs, size=3)
            pos = U.get_pos(power_index)
            M.build_by_idle_worker(self, C._BUILD_CYBER_S, pos)

        else:
            self.safe_action(C._NO_OP, 0, [])
コード例 #3
0
def gather_resource(agent, resource='gas'):
    camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs)

    if not camera_on_base:
        return
    if resource == 'gas':
        gas_pos = U.judge_gas_worker(agent.obs, agent.env.game_info)
        drone = U.get_mineral_drone(agent.obs)
        drone_pos = T.world_to_screen_pos(agent.env.game_info, drone.pos,
                                          agent.obs) if drone else None
        if gas_pos and drone_pos:
            agent.select(C._SELECT_POINT, C._SCV_TYPE_INDEX,
                         [C._CLICK, drone_pos])
            agent.safe_action(C._HARVEST_S, C._SCV_TYPE_INDEX,
                              [C._NOT_QUEUED, gas_pos])
    if resource == 'mineral':
        mineral_pos = U.find_mineral(agent.obs)
        mineral_pos = T.world_to_screen_pos(agent.env.game_info, mineral_pos,
                                            agent.obs)
        drone = U.get_gas_drone(agent.obs)
        drone_pos = T.world_to_screen_pos(agent.env.game_info, drone.pos,
                                          agent.obs) if drone else None
        if mineral_pos and drone_pos:
            agent.select(C._SELECT_POINT, C._SCV_TYPE_INDEX,
                         [C._CLICK, drone_pos])
            agent.safe_action(C._HARVEST_S, C._SCV_TYPE_INDEX,
                              [C._NOT_QUEUED, mineral_pos])

    return
コード例 #4
0
ファイル: option.py プロジェクト: liuruoze/Thought-SC2
def mineral_worker_only(agent):
    camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs)
    assert camera_on_base, 'not camera_on_base!'

    probe = U.get_gas_probe(agent.obs)
    probe_pos = T.world_to_screen_pos(agent.env.game_info, probe.pos,
                                      agent.obs) if probe else None
    mineral = U.find_unit_on_screen(agent.obs, C._MINERAL_TYPE_INDEX)
    mineral_pos = T.world_to_screen_pos(agent.env.game_info, mineral.pos,
                                        agent.obs) if mineral else None
    move_worker(agent, mineral_pos, probe_pos)
コード例 #5
0
    def mini_step(self, action):
        if action == ProtossAction.Build_probe.value:
            M.mineral_worker(self)

        elif action == ProtossAction.Build_zealot.value:
            M.train_army(self, C._TRAIN_ZEALOT)

        elif action == ProtossAction.Build_Stalker.value:
            M.train_army(self, C._TRAIN_STALKER)

        elif action == ProtossAction.Build_pylon.value:
            no_unit_index = U.get_unit_mask_screen(self.obs, size=2)
            pos = U.get_pos(no_unit_index)
            M.build_by_idle_worker(self, C._BUILD_PYLON_S, pos)

        elif action == ProtossAction.Build_gateway.value:
            power_index = U.get_power_mask_screen(self.obs, size=5)
            pos = U.get_pos(power_index)
            M.build_by_idle_worker(self, C._BUILD_GATEWAY_S, pos)

        elif action == ProtossAction.Build_Assimilator.value:
            if self._gases is not None:
                #U.find_gas_pos(self.obs, 1)
                gas_1 = self._gases[0]
                gas_2 = self._gases[1]

                if gas_1 is not None and not U.is_assimilator_on_gas(
                        self.obs, gas_1):
                    gas_1_pos = T.world_to_screen_pos(self.env.game_info,
                                                      gas_1.pos, self.obs)
                    M.build_by_idle_worker(self, C._BUILD_ASSIMILATOR_S,
                                           gas_1_pos)

                elif gas_2 is not None and not U.is_assimilator_on_gas(
                        self.obs, gas_2):
                    gas_2_pos = T.world_to_screen_pos(self.env.game_info,
                                                      gas_2.pos, self.obs)
                    M.build_by_idle_worker(self, C._BUILD_ASSIMILATOR_S,
                                           gas_2_pos)

        elif action == ProtossAction.Build_CyberneticsCore.value:
            power_index = U.get_power_mask_screen(self.obs, size=3)
            pos = U.get_pos(power_index)
            M.build_by_idle_worker(self, C._BUILD_CYBER_S, pos)

        elif action == ProtossAction.Attack.value:
            M.attack_step(self)

        elif action == ProtossAction.Retreat.value:
            M.retreat_step(self)

        elif action == ProtossAction.Do_nothing.value:
            self.safe_action(C._NO_OP, 0, [])
コード例 #6
0
    def mini_step(self, action):

        if action == TerranAction.Build_SCV.value:
            M.mineral_worker(self)

        elif action == TerranAction.Build_Refinery.value:
            if self._gases is not None:
                # U.find_gas_pos(self.obs, 1)
                gas_1 = self._gases[0]
                gas_2 = self._gases[1]

                if gas_1 is not None and not U.is_Refinery_on_gas(self.obs, gas_1):
                    gas_1_pos = T.world_to_screen_pos(self.env.game_info, gas_1.pos, self.obs)
                    M.build_by_idle_worker(self, C._BUILD_REFINERY_S, gas_1_pos)

                elif gas_2 is not None and not U.is_Refinery_on_gas(self.obs, gas_2):
                    gas_2_pos = T.world_to_screen_pos(self.env.game_info, gas_2.pos, self.obs)
                    M.build_by_idle_worker(self, C._BUILD_REFINERY_S, gas_2_pos)

        elif action == TerranAction.Gather_gas.value:
            M.gather_resource(self, 'gas')

        elif action == TerranAction.Gather_mineral.value:
            M.gather_resource(self, 'mineral')

        elif action == TerranAction.Build_Marine.value:
            M.train_army(self, C._TRAIN_MARINE)

        elif action == TerranAction.Build_Reaper.value:
            M.train_army(self, C._TRAIN_REAPER)

        elif action == TerranAction.Build_SupplyDepot.value:
            valid_index = U.get_valid_mask_screen(self.obs, size=3)
            pos = U.get_pos(valid_index)
            M.build_by_idle_worker(self, C._BUILD_SUPPLYDEPOT_S, pos)

        elif action == TerranAction.Build_Barracks.value:
            valid_index = U.get_valid_mask_screen(self.obs, size=3)
            pos = U.get_pos(valid_index)
            M.build_by_idle_worker(self, C._BUILD_BARRACKS_S, pos)

        elif action == TerranAction.Attack.value:
            self.is_attack = True

        elif action == TerranAction.Defend.value:
            M.retreat_step(self)

        else:
            self.safe_action(C._NO_OP, 0, [])

        if self.is_attack:
            M.attack_step(self)
コード例 #7
0
def mineral_worker(agent):
    camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs)
    # print(camera_on_base)

    if not camera_on_base:
        return

    # gas_pos = U.judge_gas_worker(agent.obs, agent.env.game_info)
    # if gas_pos:
    #     drone = U.get_mineral_drone(agent.obs)
    #     drone_pos = T.world_to_screen_pos(agent.env.game_info, drone.pos, agent.obs) if drone else None
    #     move_worker(agent, gas_pos, drone_pos)

    # if U.judge_gas_worker_too_many(agent.obs):
    #     drone = U.get_gas_drone(agent.obs)
    #     drone_pos = T.world_to_screen_pos(agent.env.game_info, drone.pos, agent.obs) if drone else None

    #     mineral = U.find_unit_on_screen(agent.obs, C._MINERAL_TYPE_INDEX)
    #     mineral_pos = T.world_to_screen_pos(agent.env.game_info, mineral.pos, agent.obs) if mineral else None
    #     move_worker(agent, mineral_pos, drone_pos)

    # move_worker(agent, C.mineral_pos, probe_pos)
    # else:
    # train_worker(agent, C.base_pos, C._TRAIN_PROBE)
    base = U.find_unit_on_screen(agent.obs, C._COMMANDCENTER_TYPE_INDEX)
    base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos,
                                     agent.obs) if base else None
    train_worker(agent, base_pos, C._TRAIN_SCV)
コード例 #8
0
ファイル: option.py プロジェクト: liuruoze/Thought-SC2
def set_source(agent):
    agent.safe_action(C._NO_OP, 0, [])
    base = U.find_unit_on_screen(agent.obs, C._NEXUS_TYPE_INDEX)
    base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos, agent.obs)

    agent.select(C._SELECT_POINT, C._NEXUS_TYPE_INDEX, [C._CLICK, base_pos])
    agent.safe_action(C._CONTROL_GROUP, C._NEXUS_TYPE_INDEX, [C._SET_GROUP, C._BASE_GROUP_ID])
コード例 #9
0
def judge_gas_worker(obs, game_info):
    gas_1 = find_gas(obs, 1)
    gas_2 = find_gas(obs, 2)
    if gas_1:
        a = gas_1.assigned_harvesters
        i = gas_1.ideal_harvesters
        if a < i:
            return T.world_to_screen_pos(game_info, gas_1.pos, obs)
            # return C.gas1_pos
    if gas_2:
        a = gas_2.assigned_harvesters
        i = gas_2.ideal_harvesters
        if a < i:
            return T.world_to_screen_pos(game_info, gas_2.pos, obs)
            # return C.gas2_pos

    return None
コード例 #10
0
ファイル: option.py プロジェクト: liuruoze/Thought-SC2
def train_worker_only(agent):
    camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs)
    assert camera_on_base, 'not camera_on_base!'

    # train_worker(agent, C.base_pos, C._TRAIN_PROBE)
    base = U.find_unit_on_screen(agent.obs, C._NEXUS_TYPE_INDEX)
    base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos,
                                     agent.obs) if base else None
    train_worker(agent, base_pos, C._TRAIN_PROBE)
コード例 #11
0
ファイル: utils.py プロジェクト: liuruoze/Thought-SC2
def get_back_pos(obs, game_info):
    # if have resources, back to base
    buff = None
    unit_set = obs.raw_observation.observation.raw_data.units
    for unit in unit_set:
        if unit.unit_type == C._PROBE_TYPE_INDEX and unit.is_selected == True:
            buff = unit.buff_ids
            # print('buff:', buff)

    if buff and buff[0] > 0:
        # return C.base_pos
        base = find_unit_on_screen(obs, C._NEXUS_TYPE_INDEX)
        base_pos = T.world_to_screen_pos(game_info, base.pos,
                                         obs) if base else None
        return base_pos

    base = find_unit_on_screen(obs, C._NEXUS_TYPE_INDEX)
    # number of probe for mineral and the ideal num
    if base:
        a = base.assigned_harvesters
        i = base.ideal_harvesters
        if a < i:
            mineral = find_unit_on_screen(obs, C._MINERAL_TYPE_INDEX)
            mineral_pos = T.world_to_screen_pos(game_info, mineral.pos,
                                                obs) if mineral else None
            return mineral_pos
            # return C.mineral_pos

    gas_1 = find_gas(obs, 1)
    gas_2 = find_gas(obs, 2)
    if gas_1:
        a = gas_1.assigned_harvesters
        i = gas_1.ideal_harvesters
        if a < i:
            return T.world_to_screen_pos(game_info, gas_1.pos, obs)
            # return C.gas1_pos
    if gas_2:
        a = gas_2.assigned_harvesters
        i = gas_2.ideal_harvesters
        if a < i:
            return T.world_to_screen_pos(game_info, gas_2.pos, obs)
            # return C.gas2_pos
    return T.world_to_screen_pos(game_info, base.pos, obs) if base else None
コード例 #12
0
ファイル: option.py プロジェクト: liuruoze/Thought-SC2
def inject_larva(agent):
    base = U.find_unit_on_screen(agent.obs, C._HATCHERY_TYPE_INDEX)
    queen_pos = select_unit(agent, C._QUEEN_TYPE_INDEX)

    camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs)
    if not camera_on_base or queen_pos is None or base is None:
        return
    base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos, agent.obs)    
    agent.select(C._SELECT_POINT, C._QUEEN_TYPE_INDEX, [C._CLICK, queen_pos])
    agent.safe_action(C._E_INJECT_LARVA, C._QUEEN_TYPE_INDEX, [C._NOT_QUEUED, base_pos])
コード例 #13
0
ファイル: option.py プロジェクト: liuruoze/Thought-SC2
def gas_worker_only(agent):
    camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs)
    assert camera_on_base, 'not camera_on_base!'

    gas_pos = U.judge_gas_worker(agent.obs, agent.env.game_info)
    if gas_pos:
        probe = U.get_mineral_probe(agent.obs)
        probe_pos = T.world_to_screen_pos(agent.env.game_info, probe.pos,
                                          agent.obs) if probe else None
        move_worker(agent, gas_pos, probe_pos)
コード例 #14
0
ファイル: option.py プロジェクト: liuruoze/Thought-SC2
def train_army(agent, train_action):
    base = U.find_unit_on_screen(agent.obs, C._HATCHERY_TYPE_INDEX)
    camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs)

    if (not camera_on_base) or (base is None):
        return

    base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos, agent.obs)
    agent.select(C._SELECT_POINT, C._HATCHERY_TYPE_INDEX, [C._DBL_CLICK, base_pos])
    if train_action != C._TRAIN_QUEEN:
        agent.select(C._SELECT_LARVA, C._LARVA_TYPE_INDEX, [])  
        agent.safe_action(train_action, C._LARVA_TYPE_INDEX, [C._NOT_QUEUED])
    else:
        agent.safe_action(C._TRAIN_QUEEN, C._HATCHERY_TYPE_INDEX, [C._NOT_QUEUED])
コード例 #15
0
def train_army(agent, train_action):
    # select multi building and train
    # count = U.get_unit_num(agent.obs, C._BARRACKS_TYPE_INDEX)
    # pos = selectGateway(agent)
    # camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs)
    # # print(camera_on_base)

    barracks = U.find_unit_on_screen(agent.obs, C._BARRACKS_TYPE_INDEX)
    camera_on_base = U.check_base_camera(agent.env.game_info, agent.obs)

    if (not camera_on_base) or (barracks is None):
        return

    barracks_pos = T.world_to_screen_pos(agent.env.game_info, barracks.pos,
                                         agent.obs)
    agent.select(C._SELECT_POINT, C._BARRACKS_TYPE_INDEX,
                 [C._DBL_CLICK, barracks_pos])
    # agent.safe_action(C._RALLY_UNITS_M, C._BARRACKS_TYPE_INDEX, [C._NOT_QUEUED, C.rally_pos])
    agent.safe_action(train_action, C._BARRACKS_TYPE_INDEX, [C._NOT_QUEUED])
コード例 #16
0
ファイル: utils.py プロジェクト: liuruoze/Thought-SC2
def get_back_pos(obs, game_info):
    # if have resources, back to base
    # buff = None
    # unit_set = obs.raw_observation.observation.raw_data.units
    # for unit in unit_set:
    #     if unit.unit_type == C._SCV_TYPE_INDEX and unit.is_selected is True:
    #         buff = unit.buff_ids
    #         # print('buff:', buff)
    #
    # # if buff and buff[0] > 0:
    #     # return C.base_pos
    #     # base = find_unit_on_screen(obs, C._COMMANDCENTER_TYPE_INDEX)
    #     # base_pos = T.world_to_screen_pos(game_info, base.pos, obs) if base else None
    #     # return base_pos
    #
    # base = find_unit_on_screen(obs, C._COMMANDCENTER_TYPE_INDEX)
    # # number of probe for mineral and the ideal num
    # if base:
    #     a = base.assigned_harvesters
    #     i = base.ideal_harvesters
    #     if a < i:
    mineral = find_unit_on_screen(obs, C._MINERAL_TYPE_INDEX)
    mineral_pos = T.world_to_screen_pos(game_info, mineral.pos, obs) if mineral else None
    return mineral_pos
コード例 #17
0
ファイル: option.py プロジェクト: liuruoze/Thought-SC2
def set_rally_point(agent, pos):
    base = U.find_unit_on_screen(agent.obs, C._HATCHERY_TYPE_INDEX)
    base_pos = T.world_to_screen_pos(agent.env.game_info, base.pos, agent.obs)
    agent.select(C._SELECT_POINT, C._HATCHERY_TYPE_INDEX, [C._DBL_CLICK, base_pos])
    agent.safe_action(C._RALLY_UNITS_M, C._HATCHERY_TYPE_INDEX, [C._NOT_QUEUED, C.rally_pos])
コード例 #18
0
def selectGateway(agent):
    # random select a Gateway
    gateway = U.get_best_gateway(agent.obs)
    pos = T.world_to_screen_pos(agent.env.game_info, gateway.pos,
                                agent.obs) if gateway else None
    return pos
コード例 #19
0
    def mini_step(self, action):

        if action == ZergAction.Build_drone.value:
            M.mineral_worker(self)

        elif action == ZergAction.Build_extractor.value:
            if self._gases is not None:
                #U.find_gas_pos(self.obs, 1)
                gas_1 = self._gases[0]
                gas_2 = self._gases[1]

                if gas_1 is not None and not U.is_extractor_on_gas(
                        self.obs, gas_1):
                    gas_1_pos = T.world_to_screen_pos(self.env.game_info,
                                                      gas_1.pos, self.obs)
                    M.build_by_idle_worker(self, C._BUILD_EXTRACTOR_S,
                                           gas_1_pos)

                elif gas_2 is not None and not U.is_extractor_on_gas(
                        self.obs, gas_2):
                    gas_2_pos = T.world_to_screen_pos(self.env.game_info,
                                                      gas_2.pos, self.obs)
                    M.build_by_idle_worker(self, C._BUILD_EXTRACTOR_S,
                                           gas_2_pos)

        elif action == ZergAction.Gather_gas.value:
            M.gather_resource(self, 'gas')

        elif action == ZergAction.Gather_mineral.value:
            M.gather_resource(self, 'mineral')

        elif action == ZergAction.Build_queen.value:
            M.train_army(self, C._TRAIN_QUEEN)

        elif action == ZergAction.Build_zergling.value:
            M.train_army(self, C._TRAIN_ZERGLING)

        elif action == ZergAction.Build_roach.value:
            M.train_army(self, C._TRAIN_ROACH)

        elif action == ZergAction.Build_overlord.value:
            M.train_army(self, C._TRAIN_OVERLORD)

        elif action == ZergAction.Build_spawningpool.value:
            creep_index = U.get_creep_mask_screen(self.obs, size=2)
            pos = U.get_pos(creep_index)
            M.build_by_idle_worker(self, C._BUILD_SPAWNINGPOOL_S, pos)

        elif action == ZergAction.Build_roachwarren.value:
            creep_index = U.get_creep_mask_screen(self.obs, size=2)
            pos = U.get_pos(creep_index)
            M.build_by_idle_worker(self, C._BUILD_ROACHWARREN_S, pos)

        elif action == ZergAction.Build_evolutionchamber.value:
            creep_index = U.get_creep_mask_screen(self.obs, size=2)
            pos = U.get_pos(creep_index)
            M.build_by_idle_worker(self, C._BUILD_EVOLUTIONCHAMBER_S, pos)

        elif action == ZergAction.Build_spinecrawler.value:
            creep_index = U.get_creep_mask_screen(self.obs, size=2)
            pos = U.get_pos(creep_index)
            M.build_by_idle_worker(self, C._BUILD_SPINECRAWLER_S, pos)

        elif action == ZergAction.Attack.value:
            self.is_attack = True

        elif action == ZergAction.Defend.value:
            M.retreat_step(self)

        else:
            self.safe_action(C._NO_OP, 0, [])

        if self.is_attack:
            M.attack_step(self)
        # if any queen exists, try to inject lavra to hatchery.
        M.inject_larva(self)