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
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
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
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
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
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