# KARDS 战斗系统 一个基于Python的KARDS二战卡牌游戏战斗系统复刻,采用可扩展的架构设计。 ## 📋 最新更新 (2025-09-04) - v0.3.0 **🎴 卡牌系统重大升级**: - **模板继承系统**: 卡牌定义支持模板继承,大幅减少代码重复 - **参数化卡牌**: 完整的卡牌参数系统,支持部署位置选择等交互 - **多国卡牌支持**: 德国、意大利、美国、日本卡牌全面实现 - **YAML加载器**: 强化的YAML加载器支持模板合并和验证 **🔧 模板系统特性**: - `unit_card` 模板提供标准的 `deploy_position` 参数 - 卡牌只需 `template: "unit_card"` 而无需重复配置 - 模板参数继承和合并机制 - 所有单位卡自动支持部署到己方支援线的可选位置选择 **📚 项目文档完善**: - 完整的卡牌系统架构文档 - 模板继承系统使用指南 - 参数系统开发者文档 - 代码示例和最佳实践 **🏗️ 项目重构完成** (v0.2.0): - 完整的pytest测试套件(19个测试,100%通过) - 玩家API优化:使用整数ID (0/1) 替代字符串 - 代码结构优化:封存旧版本,清理项目结构 - uv环境管理:标准化依赖和虚拟环境 ## 🎯 项目目标 - 复刻KARDS游戏的核心战斗机制 - 为AI Agent提供完整的游戏环境 - 可扩展的单位、能力和效果系统 ## ✨ 核心特性 ### 🏗️ 战场系统 - **三线战场**: 玩家1支援线 - 共用前线 - 玩家2支援线 - **HQ系统**: 总部作为支援线上的目标,20点防御值,摧毁敌方HQ获胜 - **紧凑排列**: 单位自动紧凑排列,无空隙 - **前线控制权**: 当前线被单一玩家控制时获得控制权 - **目标限制**: 每条战线最多5个目标(包括单位和HQ) ### 🚗 单位类型 | 类型 | 英文名 | 攻击规则 | 特殊能力 | |------|--------|----------|----------| | 步兵 | INFANTRY | 只能攻击相邻战线 | 基础作战单位 | | 坦克 | TANK | 只能攻击相邻战线 | 可同回合移动+攻击 | | 火炮 | ARTILLERY | **无视攻击距离**,**无视守护** | **不受反击** | | 战斗机 | FIGHTER | **无视攻击距离** | 保护同战线免受轰炸机攻击 | | 轰炸机 | BOMBER | **无视攻击距离**,**无视守护** | **不受反击**(战斗机除外),但会被战斗机阻挡 | ### 🎯 关键词系统 - **BLITZ** (闪击): 部署回合可立即行动 - **GUARD** (守护): 相邻单位只能被轰炸机/火炮攻击 - **SMOKESCREEN** (烟幕): 不能被攻击,行动后失效 - **HEAVY_ARMOR_X** (重甲): 受到伤害减少X点 - **AMBUSH** (伏击): 首次被攻击时先造成伤害 - **FURY** (奋战): 每回合可攻击两次 - **MOBILIZE** (动员): 回合开始+1/+1,受伤后失效 - **PINNED** (压制): 无法移动或攻击 ### 🎪 能力系统 - **部署能力** (Deploy): 进场时触发 - **触发能力** (Triggered): 特定条件下触发 - **静态能力** (Static): 持续生效的光环效果 - **激活能力** (Activated): 主动使用的能力 - **死亡能力** (Death): 被摧毁时触发 ## 🎴 卡牌系统 ### ✨ 核心特性 - **模板继承系统**: 减少重复定义,提高维护性 - **参数化交互**: 卡牌支持复杂的参数化操作 - **多国卡牌**: 完整支持德国、意大利、美国、日本等国家 - **YAML驱动**: 所有卡牌定义通过YAML文件管理 - **类型安全**: 完整的参数验证和类型检查 ### 🏗️ 模板继承系统 卡牌模板系统允许卡牌继承通用配置,避免重复定义: ```yaml # 模板定义 (cards_spec.yaml) card_templates: - id: "unit_card" type: "unit" params: - name: "deploy_position" type: "slot" range: [0, 4] required: false description: "Deploy position (0-4, default: rightmost available slot)" # 使用模板的卡牌 (japan.yaml) unit_cards: - id: "jpn_imperial_guard_card" template: "unit_card" # 继承模板配置 name: "Imperial Guard" cost: 3 nation: "japan" rarity: 4 description: "Elite Japanese Imperial Guard infantry" unit_definition_id: "jpn_infantry_imperial_guard" ``` **模板系统优势**: - **减少90%+重复代码**: 单位卡无需重复定义部署参数 - **统一标准化**: 所有单位卡自动获得标准参数 - **易于维护**: 修改模板即可影响所有继承卡牌 - **灵活扩展**: 支持多层继承和参数合并 ### 📋 参数系统 卡牌参数系统支持复杂的玩家交互: ```python from kards_battle.cards.card_params import ParameterType, ParameterDefinition # 部署位置参数 position_param = ParameterDefinition( name="deploy_position", param_type=ParameterType.SLOT, param_range=(0, 4), required=False, description="选择部署位置 (0-4)" ) ``` **支持的参数类型**: - `SLOT`: 位置选择 (0-4) - `UNIT_TARGET`: 单位目标选择 - `MULTI_TARGET`: 多目标选择 - `CHOICE`: 选项选择 - `BOOLEAN`: 布尔选择 ### 🌍 多国卡牌支持 目前支持的国家及卡牌数量: | 国家 | 卡牌文件 | 卡牌数量 | 特色单位 | |------|---------|---------|----------| | 🇩🇪 德国 | `germany.yaml` | 15+ | 豹式坦克、Bf 109战斗机 | | 🇮🇹 意大利 | `italy.yaml` | 12+ | M13坦克、精英步兵 | | 🇺🇸 美国 | `usa.yaml` | 18+ | 谢尔曼坦克、P-51野马 | | 🇯🇵 日本 | `japan.yaml` | 23+ | 九七式坦克、零式战斗机 | ### 📖 卡牌加载器 API ```python from kards_battle.cards.card_loader import CardLoader, load_nation_cards from kards_battle.core.enums import Nation # 创建加载器 loader = CardLoader() # 加载指定国家卡牌 japan_cards = loader.load_nation_cards(Nation.JAPAN) print(f"加载了 {len(japan_cards)} 张日本卡牌") # 加载所有可用卡牌 all_cards = loader.load_all_available_cards() for nation, cards in all_cards.items(): print(f"{nation.name}: {len(cards)} 张卡牌") # 便捷函数 cards = load_nation_cards(Nation.GERMANY) ``` ### 🎯 卡牌定义格式 **单位卡完整格式**: ```yaml unit_cards: - id: "unique_card_id" # 必需:唯一标识符 template: "unit_card" # 可选:继承模板 name: "Card Name" # 必需:卡牌名称 cost: 3 # 必需:费用 nation: "germany" # 必需:国家 rarity: 2 # 必需:稀有度 (1-4) description: "Card description" # 可选:描述 unit_definition_id: "unit_id" # 必需:对应单位定义 # 可选参数(如果不使用模板) params: - name: "deploy_position" type: "slot" range: [0, 4] required: false ``` ## 📁 项目结构 ``` 项目根目录/ ├── run_tests.sh # 测试运行脚本 ├── README.md # 项目文档 ├── demo/ # 演示文件目录 │ ├── demo_new_features.py # 最新功能专项演示 │ ├── demo_card_system.py # 卡牌系统演示 │ ├── demo_parameterized_cards.py # 参数化卡牌演示 │ ├── main.py # 主入口文件 │ └── DEMOS.md # 演示文件说明 │ ├── examples/ # 完整示例目录 🆕 │ └── card_system/ # 卡牌系统示例 │ ├── demo_card_system.py # 卡牌加载和使用示例 │ └── demo_parameterized_cards.py # 参数化卡牌示例 │ ├── assets/ # 游戏资源文件 🆕 │ ├── cards/ # 卡牌定义文件 │ │ ├── cards_spec.yaml # 卡牌格式规范和模板定义 │ │ ├── germany.yaml # 德国卡牌 (15+ 张) │ │ ├── italy.yaml # 意大利卡牌 (12+ 张) │ │ ├── usa.yaml # 美国卡牌 (18+ 张) │ │ ├── japan.yaml # 日本卡牌 (23+ 张) 🆕 │ │ └── example_orders.yaml # 示例指令卡 │ └── units/ # 单位定义文件 │ ├── units_spec.yaml # 单位格式规范 │ ├── germany.yaml # 德国单位 │ ├── usa.yaml # 美国单位 │ └── japan.yaml # 日本单位 🆕 │ ├── kards_battle/ # 核心战斗系统包 │ ├── core/ # 核心引擎和逻辑 │ │ ├── battle_engine.py # 新战斗引擎 │ │ ├── enums.py # 枚举定义 (单位类型、战线等) │ │ └── unit_combat_rules.py # 单位战斗规则 │ ├── cards/ # 卡牌系统 🆕 │ │ ├── card.py # 卡牌基类和单位卡实现 │ │ ├── card_loader.py # YAML卡牌加载器 (支持模板继承) │ │ ├── card_params.py # 卡牌参数系统 │ │ ├── card_manager.py # 卡牌管理器 │ │ ├── deck.py # 卡组管理 │ │ └── placeholder_cards.py # 占位卡牌定义 │ ├── units/ # 单位系统 │ │ ├── unit.py # 单位基类和实现 │ │ └── unit_loader.py # 单位加载器 │ ├── game/ # 游戏引擎和状态管理 │ │ ├── game_engine.py # 高级游戏引擎 │ │ ├── game_state.py # 游戏状态管理 │ │ └── nation_config.py # 国家配置 │ ├── battlefield/ # 战场管理 │ │ └── battlefield.py # 基础战场系统 │ ├── abilities/ # 能力和关键词系统 │ │ ├── abilities.py # 能力基类和接口 │ │ └── keywords.py # 关键词效果实现 │ ├── effects/ # 效果系统 │ │ ├── effects.py # 游戏效果实现 │ │ └── target_selectors.py # 目标选择逻辑 │ ├── events/ # 事件系统 │ │ ├── event_system.py # 事件分发器 │ │ └── managers/ # 事件管理器 │ └── examples/ # 示例单位和演示 │ └── sample_units.py # 15个示例单位定义 │ ├── interactive/ # 交互式功能 │ ├── battle_visualizer.py # 战场可视化器 │ ├── command_parser.py # 命令解析器 │ ├── interactive_test.py # 交互测试 │ └── test_scenarios.py # 测试场景 │ ├── docs/ # 项目文档 │ ├── KARDS_GAME_RULES.md # 游戏规则说明 │ ├── TESTING.md # 测试说明 │ └── architecture/ # 架构文档 │ └── SYSTEM_DESIGN.md # 系统设计文档 │ └── tests/ # 完整测试套件 ├── test_card_loader.py # 卡牌加载器测试 🆕 ├── test_card_params.py # 卡牌参数系统测试 🆕 ├── test_card_system.py # 卡牌系统集成测试 🆕 ├── unit/ # 单元测试 ├── integration/ # 集成测试 ├── examples/ # 示例和用法测试 └── README.md # 测试说明文档 ``` ## 🚀 快速开始 ### 真实的KARDS操作体验 ```python from kards_battle.core.battle_engine import BattleEngine from kards_battle.examples.sample_units import create_american_gi, create_german_infantry from kards_battle.core.enums import LineType # 创建战斗引擎 (专注战斗系统,不包含卡牌) engine = BattleEngine("Germany", "USA", debug_mode=True) # 创建单位并设置激活成本 german_infantry = create_german_infantry() american_gi = create_american_gi() german_infantry.activation_cost = 1 american_gi.activation_cost = 1 print(f"初始状态:") print(f"德军 - Kredits: {engine.get_kredits('Germany')}, Slot: {engine.get_kredits_slot('Germany')}") print(f"美军 - Kredits: {engine.get_kredits('USA')}, Slot: {engine.get_kredits_slot('USA')}") # 第1回合 - 德军直接部署单位到支援线 result1 = engine.deploy_unit_to_support(german_infantry, "Germany") print(f"德军步兵部署到支援线: {result1['success']}") # 切换到美军回合 (Kredits Slot自动增长) engine.end_turn() print(f"美军回合 - Kredits: {engine.get_kredits('USA')}, Slot: {engine.get_kredits_slot('USA')}") # 第2回合 - 美军部署并移动 result2 = engine.deploy_unit_to_support(american_gi, "USA") print(f"美军GI部署到支援线: {result2['success']}") # 美军移动GI到前线 (消耗1点Kredits激活费用) move_result = engine.move_unit(american_gi.id, (LineType.FRONT, 0), "USA") print(f"美军GI移动到前线: {move_result['success']}") if move_result['success']: print(f"前线控制权: {move_result['front_line_controller']}") print(f"美军剩余Kredits: {engine.get_kredits('USA')}") # 第3回合 - 德军反击 engine.end_turn() print(f"德军回合 - Kredits: {engine.get_kredits('Germany')}") # 德军从支援线攻击前线的美军 (消耗1点Kredits激活费用) attack_result = engine.attack_target(german_infantry.id, american_gi.id, "Germany") print(f"德军攻击美军: {attack_result['success']}") if attack_result['success']: print(f"造成伤害: {attack_result['damage_dealt']}, 反击伤害: {attack_result['counter_damage']}") # 查看最终战场状态 print(f"\n最终战场:") print(engine.battlefield) # DEBUG功能演示 - 设置资源和属性 engine.debug_set_kredits("Germany", kredits=10) engine.debug_set_unit_stats(german_infantry.id, attack=5, defense=8) print(f"\nDEBUG: 德军Kredits设为10,步兵属性增强为 5/8") ``` ### 运行演示 ```bash # 最新功能演示 (推荐先运行) python3 demo/demo_new_features.py # 主程序入口 python3 demo/main.py ``` ### 运行测试 ```bash # 🧪 运行pytest测试套件(推荐) ./run_pytest.sh # 运行所有pytest测试(19个) # 或分别运行 uv run pytest tests/test_comprehensive_movement.py -v # 移动系统测试(10个) uv run pytest tests/test_turn_and_resources.py -v # 回合资源测试(9个) # 🔧 运行传统测试套件 ./run_tests.sh # 旧版测试运行器 # 特定测试类别 python3 tests/unit/test_battle_engine.py # 新战斗引擎测试 python3 tests/unit/test_unit_type_rules.py # 单位类型规则测试 python3 tests/integration/test_system.py # 系统集成测试 ``` **推荐使用pytest套件 - 覆盖所有核心功能的完整验证!** ## 🔧 扩展系统 ### 创建自定义单位 ```python from kards_battle.units.unit import Unit from kards_battle.core.enums import UnitType # 创建基础单位 custom_unit = Unit( name="Custom Tank", unit_type=UnitType.TANK, attack=4, defense=5, operation_cost=4, keywords={"BLITZ", "HEAVY_ARMOR_1"} ) ``` ### 创建自定义能力 ```python from kards_battle.abilities.abilities import DeployAbility class CustomDeployAbility(DeployAbility): def get_valid_targets(self, owner, battlefield): # 实现目标选择逻辑 return [] def execute(self, owner, battlefield, target=None, context=None): # 实现能力效果 return {"success": True} ``` ### 创建自定义关键词 ```python from kards_battle.abilities.keywords import KeywordEffect, TriggerTiming class CustomKeyword(KeywordEffect): def get_trigger_timing(self): return [TriggerTiming.ON_DEPLOY] def _execute_effect(self, owner, battlefield, timing, context): # 实现关键词效果 pass ``` ## 📊 示例单位 系统包含15个示例单位,展示各种能力组合: **德军**: - Panzer IV (闪击坦克) - Panther Tank (重甲坦克) - Bf 109 (伏击战斗机) - Ju 87 Stuka (轰炸机) - German 88mm Gun (部署伤害火炮) **美军**: - M4 Sherman (闪击坦克) - P-51 Mustang (奋战战斗机) - B-17 Flying Fortress (重型轰炸机) - Field Officer (增益光环) **特殊单位**: - Elite Sniper (烟幕+动员) - Combat Medic (死亡治疗) - Kamikaze Pilot (牺牲攻击) ## 🔄 游戏流程 1. **玩家回合**: 可自由进行以下操作 - 直接部署单位到己方支援线(不需要卡牌) - 移动单位(支援线→前线,消耗Kredits激活费用) - 攻击敌方目标(消耗Kredits激活费用) 2. **回合结束**: 切换玩家,Kredits Slot自动增长,Kredits重置为Slot数值 3. **胜利条件**: 摧毁敌方HQ(20→0防御值) ### 💰 Kredits资源系统 - **Kredits Slot**: 每回合自增1(上限12),代表"钱包容量" - **Kredits**: 每回合重置为Slot数值,当前可用"资源" - **激活费用**: 移动和攻击都需要消耗单位的activation_cost点Kredits ### 🎮 核心操作机制 - **直接部署**: `deploy_unit_to_support()` - 将单位部署到己方支援线 - **移动单位**: `move_unit()` - 从支援线移动到前线(包括挤位置) - **攻击目标**: `attack_target()` - 攻击敌方单位或HQ - **DEBUG功能**: 调试模式下可直接编辑单位属性和玩家资源 ## 🧪 测试结果 系统通过了以下测试: ✅ **纯战斗系统**: 专注战斗机制,不包含卡牌系统 🆕 ✅ **Kredits资源系统**: Kredits Slot/Kredits双层资源管理 🆕 ✅ **直接单位部署**: 函数调用直接部署到支援线 🆕 ✅ **DEBUG功能系统**: 完整的调试和编辑功能 🆕 ✅ **真实的3条战线布局** ✅ **HQ作为支援线上的目标** ✅ **单位自动紧凑排列** ✅ **前线控制权动态更新** ✅ **前线内挤位置机制** ✅ **跨线攻击规则** ✅ **完整的单位类型战斗规则** 🆕 ✅ **火炮和轰炸机不受反击** ✅ **轰炸机被战斗机保护机制** ✅ **关键词效果触发** (伏击、重甲等) ✅ **战斗伤害计算和反击** ✅ **游戏状态管理** ## 🎯 后续扩展方向 - [ ] AI对手实现 - [ ] 完整的卡牌系统 - [ ] 资源管理系统 - [ ] 图形用户界面 - [ ] 网络对战功能 - [ ] 更多单位和能力 - [ ] 保存/加载游戏 - [ ] 战斗回放系统 ## 🏆 设计亮点 ### 真实战场还原 - **3条战线布局**: 完全符合KARDS真实游戏规则 - **紧凑排列机制**: 单位自动填补空隙,无碎片化 - **前线控制权**: 动态计算和更新控制权状态 - **HQ作为目标**: 总部正确放置在支援线上 ### 可扩展架构 - **组件模式**: 单位通过组合关键词和能力构建 - **策略模式**: 不同能力实现为独立策略类 - **事件驱动**: 所有游戏逻辑通过事件触发 - **工厂模式**: 关键词和效果可动态创建 ### 高度模块化 - 核心系统与具体内容分离 - 每个模块职责单一,低耦合 - 便于单独测试和扩展 ### 真实游戏机制 - 完整复现KARDS核心规则 - 准确的单位类型和特殊规则 - 详细的关键词效果实现 --- *基于KARDS: The WWII Card Game设计,用于学习和AI研究目的*