예제 #1
0
    def genShootAction(self, bop_attacker, bop_obj):
        '''
        判断能否射击
        :param bop_attacker:
        :param bop_obj:
        :return: (True,wp_index)/(能射击,武器编号),(False,None)/(不能射击,None)
        '''
        try:
            list_g_stage = self.dic_metadata['l_stage']
            flag_str_shooting = wgruler.Shooting(list_g_stage, bop_attacker,
                                                 bop_obj)

            if flag_str_shooting != 'N' and flag_str_shooting != 'TS':
                ser_att = wgobject.bop2Ser(bop_attacker)
                ser_obj = wgobject.bop2Ser(bop_obj)
                flag_success, wp_index = self.obj_interface.chooseWeaponIndex(
                    ser_att, ser_obj)  # 获取武器编号
                if flag_success == 0:
                    return (True, wp_index)
            return (False, None)
        except Exception as e:
            common.echosentence_color(" " + str(e))
            self.__del__()
            raise
        except KeyboardInterrupt as k:
            common.echosentence_color(" " + str(k))
            self.__del__()
            raise
예제 #2
0
    def doSoldierMoveAction(self, soldier_bop):
        ''' 步兵在机动环节动作为若当前主要争夺点没有我方旗子且没有我方旗子目标是它,则向其移动一步'''
        try:
            res = False
            # 夺控动作
            #print(common.getBopIdentity(soldier_bop)," do some actions.")
            if self.genOccupyAction(soldier_bop):  #判断是否可以夺控
                self.obj_interface.setOccupy(soldier_bop.ObjID)  #调用接口执行夺控动作
                res = True

            main_city = wgsdata.mainCity(self.dic_metadata['l_cities'])
            bopId = common.getBopIdentity(soldier_bop)
            #设定目标
            self.dic_metadata['l_ubops'] = self.dic_metadata['l_ubops']  #敌方棋子
            cur_ser = wgobject.bop2Ser(soldier_bop)
            flag_move = True
            for ubop in self.dic_metadata['l_ubops']:
                obj_ser = wgobject.bop2Ser(ubop)
                _, flag_see = self.obj_interface.flagISU(cur_ser, obj_ser)
                _, distance = self.obj_interface.getMapDistance(
                    soldier_bop.ObjPos, ubop.ObjPos)
                if flag_see and distance <= 2:
                    flag_move = False
                    break

            if main_city not in self.dic_targets.values() and flag_move:
                self.dic_targets[bopId] = main_city
            else:
                self.dic_targets[bopId] = soldier_bop.ObjPos
            #移动
            us = common.getAllBopByPos(self.dic_metadata['l_obops'], main_city)
            enemy = common.getAllBopByPos(self.dic_metadata['l_ubops'],
                                          main_city)
            flag_occupy = enemy == None or (us != None and enemy != None
                                            and len(us) <= len(enemy))
            flag, l_path = self.genMoveAction(soldier_bop,
                                              self.dic_targets[bopId])
            if flag and l_path and flag_occupy and not wgruler.haveMoved(
                    soldier_bop, self.dic_metadata['l_stage']):
                self.obj_interface.setMove(soldier_bop.ObjID,
                                           l_path[:])  #调用接口函数执行机动动作
                res = True
            return res

        except Exception as e:
            print('error in doSoldierMoveAction(): ' + str(e))
            self.__del__()
            raise
        except KeyboardInterrupt as k:
            print('error in doSoldierMoveAction(): ' + str(k))
            self.__del__()
            raise
예제 #3
0
 def genMoveAction(self, cur_bop, obj_pos):
     '''
     判断是否机动,若机动,返回机动路线
     :param cur_bop: 机动算子
     :param obj_pos: 目标位置
     :return: (True,list)/(需要机动,机动路线),(False,None)/(不机动,None)
     '''
     try:
         list_g_stage = self.dic_metadata['l_stage']
         flag_str_moving = wgruler.Moving(list_g_stage, cur_bop)
         assert flag_str_moving in ['N', 'M', 'O']
         if flag_str_moving == 'M':
             series = wgobject.bop2Ser(cur_bop)
             flag_result, list_movepath = self.obj_interface.getMovePath(
                 series, obj_pos)
             if (flag_result == 0):
                 return True, list_movepath
         return False, None
     except Exception as e:
         common.echosentence_color(" " + str(e))
         self.__del__()
         raise
     except KeyboardInterrupt as k:
         common.echosentence_color(" " + str(k))
         self.__del__()
         raise
예제 #4
0
    def doVehicleMoveAction(self, vehicle_bop):
        ''' 战车在机动环节动作为若当前主要争夺点没有我方旗子且没有我方旗子目标是它,则向其移动'''
        try:
            res = False
            # 夺控动作
            #print(common.getBopIdentity(vehicle_bop)," do some actions.")
            if self.genOccupyAction(vehicle_bop):  #判断是否可以夺控
                self.obj_interface.setOccupy(vehicle_bop.ObjID)  #调用接口执行夺控动作
                res = True

            main_city = wgsdata.mainCity(self.dic_metadata['l_cities'])
            bopId = common.getBopIdentity(vehicle_bop)

            #设定目标
            self.dic_metadata['l_ubops'] = self.dic_metadata['l_ubops']  #敌方棋子
            cur_ser = wgobject.bop2Ser(vehicle_bop)
            flag_move = True
            for ubop in self.dic_metadata['l_ubops']:
                obj_ser = wgobject.bop2Ser(ubop)
                _, flag_see = self.obj_interface.flagISU(cur_ser, obj_ser)
                _, distance = self.obj_interface.getMapDistance(
                    vehicle_bop.ObjPos, ubop.ObjPos)
                if flag_see and distance <= 4:
                    flag_move = False
                    break

            #是否帮助同格的己方棋子
            flag_help = False
            tonggeTarget = None
            for ubop in self.dic_metadata['l_ubops']:
                us = common.getAllBopByPos(self.dic_metadata['l_obops'],
                                           ubop.ObjPos)
                enemy = common.getAllBopByPos(self.dic_metadata['l_ubops'],
                                              ubop.ObjPos)
                if us != None and enemy != None and len(us) <= len(enemy):
                    flag_help = True
                    tonggeTarget = ubop.ObjPos

            if self.moveToSecondary():  #占领次要目标地扩大比分
                self.dic_targets[bopId] = wgsdata.secondaryCity(
                    self.dic_metadata['l_cities'])
                res = self.doMove(vehicle_bop) or res
            elif flag_help:
                self.dic_targets[bopId] = tonggeTarget  #帮助同格本方棋子
            elif main_city not in self.dic_targets.values() and flag_move:
                self.dic_targets[bopId] = main_city  #设定目标为主要目标地
            else:
                if vehicle_bop.ObjSonNum == 1:
                    self.dic_targets[bopId] = main_city
                else:
                    if self.flag_color == 0:
                        self.dic_targets[bopId] = main_city + 3
                    else:
                        self.dic_targets[bopId] = main_city

            _, dis_to_main = self.obj_interface.getMapDistance(
                vehicle_bop.ObjPos, main_city)
            if self.main_city_occupied:
                if self.flag_color == 0:
                    self.dic_targets[bopId] = main_city - 2
                else:
                    self.dic_targets[bopId] = main_city + 1

            #下车
            if vehicle_bop.ObjSonNum == 1:  # 载人车辆
                _, dis = self.obj_interface.getMapDistance(
                    vehicle_bop.ObjPos, self.dic_targets[bopId])  # 距离夺控点的距离
                if dis <= 1 or not flag_move:  # 距离目标<1
                    if self.genGetOffAction(vehicle_bop):  #判断是否满足下车条件
                        self.obj_interface.setGetoff(
                            vehicle_bop.ObjID)  # 调用接口执行下车动作
                        res = True

            #移动
            if flag_move or flag_help:
                res = self.doMove(vehicle_bop) or res
            # #掩蔽
            # elif len(self.dic_metadata['l_ubops']) == 0:
            #     self.obj_interface.setState(att_bop.ObjID,2)
            return res

        except Exception as e:
            print('error in doVehicleMoveAction(): ' + str(e))
            self.__del__()
            raise
        except KeyboardInterrupt as k:
            print('error in doVehicleMoveAction(): ' + str(k))
            self.__del__()
            raise
예제 #5
0
    def doTankMoveAction(self, tank_bop):
        ''' 坦克在机动环节动作为若当前主要争夺点没有我方旗子且没有我方旗子目标是它,则向其移动
        如果路途中遇到其它敌方棋子,则攻击对方'''
        try:
            res = False
            #print(common.getBopIdentity(tank_bop)," do some actions.")
            # 夺控动作
            if self.genOccupyAction(tank_bop):  #判断是否可以夺控
                self.obj_interface.setOccupy(tank_bop.ObjID)  #调用接口执行夺控动作
                res = True

            #  self.dic_metadata['l_ubops'] = self.dic_metadata['l_ubops'] #敌方棋子
            main_city = wgsdata.mainCity(self.dic_metadata['l_cities'])
            bopId = common.getBopIdentity(tank_bop)

            #设定目标
            _, dis_to_main = self.obj_interface.getMapDistance(
                tank_bop.ObjPos, main_city)
            self.updateSDData()

            if self.moveToSecondary():  #占领次要目标地扩大比分
                self.dic_targets[bopId] = wgsdata.secondaryCity(
                    self.dic_metadata['l_cities'])
                res = self.doMove(tank_bop) or res
            elif dis_to_main == 0 or main_city not in self.dic_targets.values(
            ) and not self.main_city_occupied:
                self.dic_targets[bopId] = main_city
                #移动
                res = self.doMove(tank_bop) or res
            elif len(self.dic_metadata['l_ubops']) > 0:
                cur_ser = wgobject.bop2Ser(tank_bop)
                ubop_target = None
                min_dis = 10
                for ubop in self.dic_metadata[
                        'l_ubops']:  #找个最近的非同格目标进行行进间射击,优先堆叠的对象
                    if ubop.ObjTongge == 0 and (
                            ubop_target == None
                            or self.obj_interface.getMapDistance(
                                tank_bop.ObjPos, ubop.ObjPos)[1] <= min_dis):
                        if ubop.ObjBlood < 3 or len(
                                common.getAllBopByPos(
                                    self.dic_metadata['l_ubops'],
                                    ubop.ObjPos)) >= 2:
                            min_dis = 0
                        else:
                            _, min_dis = self.obj_interface.getMapDistance(
                                tank_bop.ObjPos, ubop.ObjPos)
                        ubop_target = ubop

                # obj_ser = wgobject.bop2Ser(ubop_target)
                # _,flag_see = self.obj_interface.flagISU(cur_ser,obj_ser)
                if tank_bop.ObjAttack == 0 and ubop_target:
                    res = self.doMoveShootAction(tank_bop, ubop_target) or res
                #掩蔽
                score = self.obj_interface.getScore()
                if (self.flag_color == 0
                        and score["BlueScore"][0] + 30 < score["RedScore"][0]
                        or self.flag_color == 1
                        and score["BlueScore"][0] > score["RedScore"][0] + 30
                    ) and len(self.dic_metadata['l_ubops']) == 0:
                    self.obj_interface.setState(tank_bop.ObjID, 2)
                self.updateSDData()

                if tank_bop.ObjAttack == 1:
                    res = self.doMove(tank_bop) or res

            else:
                if self.flag_color == 0:
                    self.dic_targets[bopId] = main_city - 1
                else:
                    self.dic_targets[bopId] = main_city + 2
                #移动
                res = self.doMove(tank_bop) or res
            # else:
            #     self.dic_targets[bopId] = main_city
            #     res = self.doMove(tank_bop) or res
            return res

        except Exception as e:
            print('error in doTankMoveAction(): ' + str(e))
            self.__del__()
            raise
        except KeyboardInterrupt as k:
            print('error in doTankMoveAction(): ' + str(k))
            self.__del__()
            raise
예제 #6
0
    def doAction(self):
        try:
            res = False
            # 当前态势
            l_ourbops = self.dic_metadata['l_obops']  #我方算子
            l_enemybops = self.dic_metadata['l_ubops']  #敌方算子
            l_cities = self.dic_metadata['l_cities']  #夺控点列表
            # 夺控动作
            for cur_bop in l_ourbops:
                if self.genOccupyAction(cur_bop):  #判断是否可以夺控
                    self.obj_interface.setOccupy(cur_bop.ObjID)  #调用接口执行夺控动作
                    res = True
            # 射击动作
            for att_bop in l_ourbops:
                for obj_bop in l_enemybops:
                    flag, weaponID = self.genShootAction(
                        att_bop, obj_bop)  #判断是否可以射击,若可以射击,返回最佳射击武器
                    if flag:  #可以射击
                        exe_success, _ = self.obj_interface.setFire(
                            att_bop.ObjID, obj_bop.ObjID,
                            (int)(weaponID))  #调用接口执行射击动作
                        if exe_success == 0:  # 执行成功
                            res = True

            l_cityloc = [
                l_cities[i] for i in range(len(l_cities)) if i % 3 == 0
            ]  # 所有夺控点坐标
            # 人员下车
            for cur_bop in l_ourbops:
                if cur_bop.ObjTypeX == 1 and cur_bop.ObjSonNum == 1:  # 载人车辆
                    for city_loc in l_cityloc:
                        _, dis = self.obj_interface.getMapDistance(
                            cur_bop.ObjPos, city_loc)  # 距离夺控点的距离
                        if dis <= 3:  # 距离<3下车
                            if self.genGetOffAction(cur_bop):  #判断是否满足下车条件
                                self.obj_interface.setGetoff(
                                    cur_bop.ObjID)  # 调用接口执行下车动作
                                res = True

            city_loc = random.sample(l_cityloc, 1)[0]  #随机选择一个夺控点机动
            # 机动
            for cur_bop in l_ourbops:
                flag_move = True
                if cur_bop.ObjTypeX in [1, 2]:
                    ''',人和战车能观察到敌方算子且距离小于10,放弃机动机会'''
                    cur_ser = wgobject.bop2Ser(cur_bop)
                    for ubop in l_enemybops:
                        obj_ser = wgobject.bop2Ser(ubop)
                        _, flag_see = self.obj_interface.flagISU(
                            cur_ser, obj_ser)
                        _, distance = self.obj_interface.getMapDistance(
                            cur_bop.ObjPos, ubop.ObjPos)
                        if flag_see and distance <= 10:
                            flag_move = False
                            break
                if flag_move:
                    if cur_bop.ObjPos != city_loc:
                        flag, l_path = self.genMoveAction(
                            cur_bop, city_loc)  # 判断能否执行机动动作,如果能,返回机动路径
                        if flag and l_path:
                            self.obj_interface.setMove(cur_bop.ObjID,
                                                       l_path)  #调用接口函数执行机动动作
                            res = True
            return res  #没有动作执行返回False
        except Exception as e:
            print('error in run_onestep(): ' + str(e))
            self.__del__()
            raise
        except KeyboardInterrupt as k:
            print('error in run_onestep(): ' + str(k))
            self.__del__()
            raise