kards-env/demo/demo_parameterized_cards.py

283 lines
9.8 KiB
Python
Raw Normal View History

2025-09-05 17:05:43 +08:00
"""
参数化卡牌系统演示
展示新的参数化卡牌功能
"""
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()