""" 预设测试场景 提供各种预配置的战场状态用于测试 """ from typing import Dict, Callable from kards_battle.core.battle_engine import BattleEngine from kards_battle.units.unit_loader import load_unit from kards_battle.core.enums import LineType class TestScenarios: """测试场景管理器""" def __init__(self): self.scenarios = { 'basic': self.scenario_basic, 'frontline': self.scenario_frontline_battle, 'squeeze': self.scenario_squeeze_test, 'resources': self.scenario_resource_test, 'massive': self.scenario_massive_battle, 'blitz': self.scenario_blitz_units, 'artillery': self.scenario_artillery_test, 'air': self.scenario_air_combat, } def list_scenarios(self) -> Dict[str, str]: """列出所有可用场景""" return { 'basic': '基础部署 - 每方2个单位', 'frontline': '前线争夺 - 前线战斗场景', 'squeeze': '挤压测试 - 测试挤压机制', 'resources': '资源管理 - 不同费用单位', 'massive': '大规模战斗 - 满编队伍', 'blitz': '闪击战术 - BLITZ关键词单位', 'artillery': '火炮测试 - 火炮vs步兵', 'air': '空战场景 - 战斗机和轰炸机', } def load_scenario(self, name: str, engine: BattleEngine) -> bool: """加载指定场景""" if name not in self.scenarios: return False scenario_func = self.scenarios[name] scenario_func(engine) return True def scenario_basic(self, engine: BattleEngine): """基础部署场景""" # 德军部署 infantry1 = load_unit("ger_infantry_grenadier") tank1 = load_unit("ger_tank_panzer_iv") engine.deploy_unit_to_support(infantry1, 0) engine.deploy_unit_to_support(tank1, 0) # 美军部署 infantry2 = load_unit("usa_infantry_gi") tank2 = load_unit("usa_tank_sherman") engine.deploy_unit_to_support(infantry2, 1) engine.deploy_unit_to_support(tank2, 1) # 设置资源 engine.debug_set_kredits(0, kredits=5, kredits_slot=5) engine.debug_set_kredits(1, kredits=5, kredits_slot=5) def scenario_frontline_battle(self, engine: BattleEngine): """前线争夺场景""" # 德军占领前线 infantry1 = load_unit("ger_infantry_grenadier") infantry2 = load_unit("ger_infantry_stormtrooper") engine.deploy_unit_to_support(infantry1, 0) engine.deploy_unit_to_support(infantry2, 0) # 移动到前线 engine.debug_set_kredits(0, kredits=10) engine.move_unit(infantry1.id, (LineType.FRONT, 0), 0) # 美军准备进攻 marine = load_unit("usa_infantry_marine") ranger = load_unit("usa_infantry_ranger") engine.deploy_unit_to_support(marine, 1) engine.deploy_unit_to_support(ranger, 1) # 设置资源 engine.debug_set_kredits(0, kredits=5, kredits_slot=5) engine.debug_set_kredits(1, kredits=5, kredits_slot=5) def scenario_squeeze_test(self, engine: BattleEngine): """挤压机制测试场景""" # 前线满编 for i in range(5): unit = load_unit("ger_infantry_grenadier") unit.name = f"Infantry {i+1}" engine.deploy_unit_to_support(unit, 0) if i < 5: # 前5个移到前线 engine.debug_set_kredits(0, kredits=10) engine.move_unit(unit.id, (LineType.FRONT, i), 0) # 准备挤压单位 squeeze_unit = load_unit("ger_tank_tiger") engine.deploy_unit_to_support(squeeze_unit, 0) # 设置资源 engine.debug_set_kredits(0, kredits=10, kredits_slot=10) engine.debug_set_kredits(1, kredits=5, kredits_slot=5) def scenario_resource_test(self, engine: BattleEngine): """资源管理测试场景""" # 部署不同费用的单位 cheap = load_unit("ger_infantry_grenadier") # 费用1 medium = load_unit("ger_tank_panzer_iv") # 费用2 expensive = load_unit("ger_tank_tiger") # 费用4 engine.deploy_unit_to_support(cheap, 0) engine.deploy_unit_to_support(medium, 0) engine.deploy_unit_to_support(expensive, 0) # 有限的资源 engine.debug_set_kredits(0, kredits=3, kredits_slot=3) engine.debug_set_kredits(1, kredits=2, kredits_slot=2) def scenario_massive_battle(self, engine: BattleEngine): """大规模战斗场景""" # 德军满编 units_ger = [ "ger_infantry_grenadier", "ger_infantry_stormtrooper", "ger_tank_panzer_iv", "ger_tank_tiger", "ger_artillery_88mm", ] for unit_id in units_ger: unit = load_unit(unit_id) engine.deploy_unit_to_support(unit, 0) # 美军满编 units_usa = [ "usa_infantry_gi", "usa_infantry_marine", "usa_tank_sherman", "usa_tank_pershing", "usa_artillery_howitzer", ] for unit_id in units_usa: unit = load_unit(unit_id) engine.deploy_unit_to_support(unit, 1) # 充足的资源 engine.debug_set_kredits(0, kredits=12, kredits_slot=12) engine.debug_set_kredits(1, kredits=12, kredits_slot=12) def scenario_blitz_units(self, engine: BattleEngine): """闪击单位测试场景""" # 部署带BLITZ关键词的单位 cavalry = load_unit("ger_infantry_15th_cavalry") # BLITZ panzer = load_unit("ger_tank_panzer_iv") # BLITZ ranger = load_unit("usa_infantry_ranger") # BLITZ sherman = load_unit("usa_tank_sherman") # BLITZ engine.deploy_unit_to_support(cavalry, 0) engine.deploy_unit_to_support(panzer, 0) engine.deploy_unit_to_support(ranger, 1) engine.deploy_unit_to_support(sherman, 1) # 设置资源 engine.debug_set_kredits(0, kredits=8, kredits_slot=8) engine.debug_set_kredits(1, kredits=8, kredits_slot=8) def scenario_artillery_test(self, engine: BattleEngine): """火炮测试场景""" # 德军火炮 flak = load_unit("ger_artillery_88mm") nebelwerfer = load_unit("ger_artillery_nebelwerfer") engine.deploy_unit_to_support(flak, 0) engine.deploy_unit_to_support(nebelwerfer, 0) # 美军步兵在前线 gi1 = load_unit("usa_infantry_gi") gi2 = load_unit("usa_infantry_gi") gi1.name = "GI Squad 1" gi2.name = "GI Squad 2" engine.deploy_unit_to_support(gi1, 1) engine.deploy_unit_to_support(gi2, 1) # 移动美军到前线 engine.end_turn() # 切换到美军 engine.debug_set_kredits(1, kredits=10) engine.move_unit(gi1.id, (LineType.FRONT, 0), 1) engine.move_unit(gi2.id, (LineType.FRONT, 1), 1) # 切回德军,准备火炮攻击 engine.end_turn() engine.debug_set_kredits(0, kredits=10, kredits_slot=10) def scenario_air_combat(self, engine: BattleEngine): """空战场景""" # 德军空军 bf109 = load_unit("ger_fighter_bf109") stuka = load_unit("ger_bomber_stuka") engine.deploy_unit_to_support(bf109, 0) engine.deploy_unit_to_support(stuka, 0) # 美军空军 p51 = load_unit("usa_fighter_p51") p47 = load_unit("usa_fighter_p47") b17 = load_unit("usa_bomber_b17") engine.deploy_unit_to_support(p51, 1) engine.deploy_unit_to_support(p47, 1) engine.deploy_unit_to_support(b17, 1) # 设置资源 engine.debug_set_kredits(0, kredits=8, kredits_slot=8) engine.debug_set_kredits(1, kredits=10, kredits_slot=10)