kards-env/interactive/test_scenarios.py

213 lines
8.0 KiB
Python
Raw Permalink Normal View History

2025-09-05 17:05:43 +08:00
"""
预设测试场景
提供各种预配置的战场状态用于测试
"""
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)