""" 参数化卡牌系统演示 展示新的参数化卡牌功能 """ from kards_battle.cards.card_params import ( ParameterDefinition, ParameterType, TargetType, ZoneType, FilterType, CardParameterValidator, CardParameterHelper ) from kards_battle.cards.card import UnitCard from kards_battle.core.enums import Nation, Rarity def demo_parameter_definitions(): """演示参数定义创建""" print("=== 参数定义演示 ===") # 1. 槽位参数 slot_param = ParameterDefinition( name="position", param_type=ParameterType.SLOT, slot_range=[0, 4], required=False, description="Deploy position (0-4)" ) print(f"1. 槽位参数: {slot_param.name} - {slot_param.description}") # 2. HQ目标参数 hq_param = ParameterDefinition( name="target_hq", param_type=ParameterType.TARGET, target_type=TargetType.HQ, target_filter=FilterType.ANY, required=True, description="Select any HQ to target" ) print(f"2. HQ目标参数: {hq_param.name} - {hq_param.description}") # 3. 单位目标参数(带筛选) unit_param = ParameterDefinition( name="target_aircraft", param_type=ParameterType.TARGET, target_type=TargetType.UNIT, valid_zones=[ZoneType.OWN, ZoneType.FRONT], target_filter=FilterType.FRIENDLY, unit_type_filter=["fighter", "bomber"], nation_filter=["uk"], required=True, description="Select friendly British aircraft" ) print(f"3. 单位目标参数: {unit_param.name} - {unit_param.description}") print(f" 筛选条件: 友方 + 英国 + 空军单位") # 4. 多目标参数 multi_param = ParameterDefinition( name="targets", param_type=ParameterType.MULTI_TARGET, target_type=TargetType.UNIT, valid_zones=[ZoneType.ENEMY, ZoneType.FRONT], target_filter=FilterType.ENEMY, min_count=1, max_count=3, required=True, description="Select 1-3 enemy units" ) print(f"4. 多目标参数: {multi_param.name} - {multi_param.description}") print(f" 数量范围: {multi_param.min_count}-{multi_param.max_count}") return [slot_param, hq_param, unit_param, multi_param] def demo_parameter_validation(): """演示参数验证""" print("\n=== 参数验证演示 ===") params = demo_parameter_definitions() # 测试槽位参数验证 slot_param = params[0] print(f"\n测试槽位参数: {slot_param.name}") valid_slot = 2 invalid_slot = 5 print(f" 值 {valid_slot}: {'✓' if CardParameterValidator.validate_slot_parameter(slot_param, valid_slot) else '✗'}") print(f" 值 {invalid_slot}: {'✓' if CardParameterValidator.validate_slot_parameter(slot_param, invalid_slot) else '✗'}") # 测试HQ目标参数验证 hq_param = params[1] print(f"\n测试HQ目标参数: {hq_param.name}") valid_hq = {"player": 0} invalid_hq = {"player": 2} print(f" 值 {valid_hq}: {'✓' if CardParameterValidator.validate_target_parameter(hq_param, valid_hq) else '✗'}") print(f" 值 {invalid_hq}: {'✓' if CardParameterValidator.validate_target_parameter(hq_param, invalid_hq) else '✗'}") # 测试单位目标参数验证 unit_param = params[2] print(f"\n测试单位目标参数: {unit_param.name}") valid_unit = {"zone": "O", "slot": 1} invalid_zone = {"zone": "E", "slot": 1} # 不在valid_zones中 invalid_slot = {"zone": "O", "slot": 5} # 槽位超范围 print(f" 值 {valid_unit}: {'✓' if CardParameterValidator.validate_target_parameter(unit_param, valid_unit) else '✗'}") print(f" 值 {invalid_zone}: {'✓' if CardParameterValidator.validate_target_parameter(unit_param, invalid_zone) else '✗'}") print(f" 值 {invalid_slot}: {'✓' if CardParameterValidator.validate_target_parameter(unit_param, invalid_slot) else '✗'}") def demo_parameter_formatting(): """演示参数值格式化""" print("\n=== 参数格式化演示 ===") params = demo_parameter_definitions() # 格式化不同类型的参数值 print("参数值格式化:") # 槽位参数 slot_value = 3 slot_formatted = CardParameterHelper.format_parameter_value(params[0], slot_value) print(f" 槽位参数 {slot_value} → {slot_formatted}") # HQ目标参数 hq_value = {"player": 1} hq_formatted = CardParameterHelper.format_parameter_value(params[1], hq_value) print(f" HQ目标 {hq_value} → {hq_formatted}") # 单位目标参数 unit_value = {"zone": "F", "slot": 2} unit_formatted = CardParameterHelper.format_parameter_value(params[2], unit_value) print(f" 单位目标 {unit_value} → {unit_formatted}") # 多目标参数 multi_value = [{"zone": "E", "slot": 0}, {"zone": "E", "slot": 3}] multi_formatted = CardParameterHelper.format_parameter_value(params[3], multi_value) print(f" 多目标 {multi_value} → {multi_formatted}") def demo_parameterized_card_creation(): """演示创建带参数的卡牌""" print("\n=== 参数化卡牌创建演示 ===") # 创建带参数的单位卡 parameters = [ ParameterDefinition( name="position", param_type=ParameterType.SLOT, slot_range=[0, 4], required=False, description="Deploy position" ) ] card = UnitCard( name="Parameterized Grenadier", cost=2, nation=Nation.GERMANY, rarity=Rarity.UNCOMMON, unit_definition_id="ger_infantry_grenadier", description="German infantry with customizable deployment", parameters=parameters ) print(f"创建卡牌: {card.name}") print(f" 有参数: {'是' if card.has_parameters() else '否'}") print(f" 参数数量: {len(card.parameters)}") if card.has_parameters(): for param in card.parameters: print(f" - {param.name}: {param.description}") # 测试参数验证 print("\n测试卡牌参数验证:") # 有效参数 valid_params = {"position": 2} errors = card.validate_parameters(valid_params) print(f" 有效参数 {valid_params}: {'✓' if not errors else '✗ ' + str(errors)}") # 无效参数 invalid_params = {"position": 10} errors = card.validate_parameters(invalid_params) print(f" 无效参数 {invalid_params}: {'✓' if not errors else '✗ ' + str(errors)}") # 缺少可选参数(应该通过) empty_params = {} errors = card.validate_parameters(empty_params) print(f" 空参数 {empty_params}: {'✓' if not errors else '✗ ' + str(errors)}") def demo_complex_parameterized_card(): """演示复杂参数化卡牌""" print("\n=== 复杂参数化卡牌演示 ===") # 创建有多个复杂参数的指令卡(概念演示) parameters = [ ParameterDefinition( name="attacker", param_type=ParameterType.TARGET, target_type=TargetType.UNIT, valid_zones=[ZoneType.OWN, ZoneType.FRONT], target_filter=FilterType.FRIENDLY, required=True, description="Select attacking unit" ), ParameterDefinition( name="targets", param_type=ParameterType.MULTI_TARGET, target_type=TargetType.UNIT, valid_zones=[ZoneType.ENEMY, ZoneType.FRONT], target_filter=FilterType.ENEMY, min_count=1, max_count=2, required=True, description="Select 1-2 enemy targets" ), ParameterDefinition( name="bonus_damage", param_type=ParameterType.VALUE, min_value=1, max_value=5, default_value=2, required=False, description="Bonus damage (1-5)" ) ] print("复杂指令卡: Coordinated Strike") print("参数:") for param in parameters: req_str = "必需" if param.required else "可选" print(f" - {param.name} ({param.param_type.value}, {req_str}): {param.description}") # 测试复杂参数验证 print("\n复杂参数验证测试:") valid_complex_params = { "attacker": {"zone": "O", "slot": 1}, "targets": [{"zone": "E", "slot": 0}, {"zone": "E", "slot": 2}], "bonus_damage": 3 } errors = CardParameterValidator.validate_card_parameters(parameters, valid_complex_params) print(f" 有效复杂参数: {'✓' if not errors else '✗ ' + str(errors)}") # 格式化复杂参数显示 print("\n复杂参数格式化:") for param_name, param_value in valid_complex_params.items(): param_def = next(p for p in parameters if p.name == param_name) formatted = CardParameterHelper.format_parameter_value(param_def, param_value) print(f" {param_name}: {formatted}") def main(): """主演示函数""" print("🎮 KARDS 参数化卡牌系统演示") print("="*50) try: demo_parameter_definitions() demo_parameter_validation() demo_parameter_formatting() demo_parameterized_card_creation() demo_complex_parameterized_card() print("\n" + "="*50) print("✅ 参数化卡牌系统演示完成!") print("\n🎯 功能总结:") print("• 支持多种参数类型:槽位、目标、多目标、数值、选择") print("• 灵活的目标筛选:国家、单位类型、区域、敌友") print("• 完整的参数验证系统") print("• 友好的参数格式化显示") print("• 与现有卡牌系统完全兼容") except Exception as e: print(f"\n❌ 演示过程中出现错误: {e}") import traceback traceback.print_exc() if __name__ == "__main__": main()