# KARDS 游戏规则统一文档 ## 1. 单位类型特性 ### 1.1 步兵 (INFANTRY) 🚶 - **移动规则**: 只能攻击相邻阵线(前线攻击敌方支援线,支援线攻击敌方前线) - **攻击规则**: 不能跨阵线攻击,必须遵循距离限制 - **反击规则**: 正常反击 - **特殊规则**: 无 ### 1.2 坦克 (TANK) 🚗 - **移动规则**: 与步兵相同的距离限制 - **攻击规则**: 与步兵相同 - **反击规则**: 正常反击 - **特殊规则**: - 可以一回合内移动+攻击(`can_move_and_attack = True`) - 默认具有TANK关键词能力 ### 1.3 火炮 (ARTILLERY) 🎯 - **移动规则**: 需要消耗激活成本移动 - **攻击规则**: - 无视攻击距离,可以攻击任意敌方目标 - 无视守护保护 - **反击规则**: 火炮攻击不受反击 - **特殊规则**: 可以跨阵线攻击任意敌方目标 ### 1.4 战斗机 (FIGHTER) ✈️ - **移动规则**: 需要消耗激活成本移动 - **攻击规则**: 无视攻击距离,可以攻击任意敌方目标 - **反击规则**: 正常反击,轰炸机被攻击时只对战斗机反击 - **特殊规则**: 可以保护同阵线其他单位免受轰炸机攻击 ### 1.5 轰炸机 (BOMBER) 💣 - **移动规则**: 需要消耗激活成本移动 - **攻击规则**: - 无视攻击距离和守护保护 - 不能攻击与战斗机同阵线的非战斗机目标 - **反击规则**: 轰炸机攻击不受反击,被攻击时不会反击(除非攻击者是战斗机) - **特殊规则**: 受战斗机保护限制 ## 2. 关键词特性 ### 2.1 BLITZ(闪击) - **效果**: 单位部署当回合就能立即行动 - **实现**: `can_operate_immediately = True` - **影响**: 跳过`deployed_this_turn`限制 ### 2.2 TANK(坦克) - **效果**: 可以在同一回合内移动和攻击 - **实现**: `can_move_and_attack = True` - **影响**: 移动后仍可攻击,攻击后仍可移动 ### 2.3 FURY(奋战) - **效果**: 每回合可以攻击两次 - **实现**: `can_attack_multiple_times = True`, `max_attacks_per_turn = 2` - **影响**: 增加每回合攻击次数上限 ### 2.4 GUARD(守护) - **效果**: 保护相邻的友方单位和HQ - **实现**: 阻止敌方攻击相邻目标(除非敌方可以无视守护) - **影响**: 必须先攻击守护单位才能攻击被保护目标 ### 2.5 HEAVY_ARMOR_X(重甲X) - **效果**: 受到的伤害减少X点 - **实现**: 伤害计算时减去护甲值 - **格式**: `HEAVY_ARMOR_1`, `HEAVY_ARMOR_2`等 - **影响**: `final_damage = max(0, damage - armor_value)` ### 2.6 AMBUSH(伏击) - **效果**: 首次被攻击时先对攻击者造成伤害 - **实现**: 在受到伤害前先进行反击 - **影响**: 改变战斗顺序 ### 2.7 SMOKESCREEN(烟幕) - **效果**: 不能被敌方单位攻击 - **实现**: `can_be_attacked_by()`返回False - **移除条件**: - 单位**移动**后自动失去烟幕 - 单位**攻击**后自动失去烟幕 - 单位**移动到前线**时自动失去烟幕 - 单位**获得GUARD关键词**时自动失去烟幕 - 单位**离开己方支援线**时自动失去烟幕 - **约束**: 烟幕与守护不能共存,任何情况下单位离开己方支援线或获得守护都会失去烟幕 ### 2.8 PINNED(压制) - **效果**: 被压制的单位不能主动攻击,但可以反击 - **实现**: `can_attack()`检查压制状态,但不影响反击 - **持续时间**: 持续到下个己方回合结束 - **影响**: 阻止主动攻击,但保留反击能力 ## 3. 移动规则 ### 3.1 基本移动规则 - **费用**: 每次移动消耗单位的操作费用(`operation_cost`) - **限制**: 每回合最多移动一次(除非有特殊能力) - **目标**: 只能移动到有效的空位或友方控制的位置 ### 3.2 移动限制检查 ```python def can_move(self) -> bool: # 刚部署的单位不能移动(除非有BLITZ) if self.deployed_this_turn and not self.can_operate_immediately: return False # 已经移动过的单位不能再移动 if self.has_moved_this_turn: return False # 已经攻击过的单位不能移动(除非有TANK能力) if self.has_attacked_this_turn and not self.can_move_and_attack: return False return True ``` ### 3.3 移动方向规则 - **支援线到前线**: 从己方支援线移动到前线空位 - **前线单位不能移动**: 已在前线的单位无法再移动 - **不能移动**: 不能移动到敌方支援线 ## 4. 战斗规则 ### 4.1 攻击距离规则 #### 步兵/坦克攻击规则 - 前线单位 → 敌方支援线单位 - 支援线单位 → 敌方前线单位 - 不能攻击同阵线目标 #### 火炮攻击规则 - 可以攻击任意敌方目标 - 无视距离和守护限制 #### 空中单位攻击规则 - 战斗机:可以攻击任意敌方目标 - 轰炸机:可以攻击任意敌方目标,但受战斗机保护限制 ### 4.2 攻击限制检查 ```python def can_attack(self) -> bool: # 刚部署的单位不能攻击(除非有BLITZ) if self.deployed_this_turn and not self.can_operate_immediately: return False # 已经达到最大攻击次数 if self.attacks_this_turn >= self.max_attacks_per_turn: return False # 已经移动过的单位不能攻击(除非有TANK能力) if self.has_moved_this_turn and not self.can_move_and_attack: return False return True ``` ### 4.3 守护保护规则 - **守护检查**: 攻击前检查目标是否被相邻GUARD单位保护 - **无视守护**: 火炮(ARTILLERY)和轰炸机(BOMBER)可以无视守护 - **守护范围**: 保护相邻位置的友方单位和HQ ### 4.4 反击规则 ```python def can_counter_attack(defender: Unit, attacker: Unit) -> bool: # 被压制的单位不能反击 if defender.has_keyword("PINNED"): return False # 轰炸机和火炮攻击不受反击 if attacker.unit_type in [UnitType.BOMBER, UnitType.ARTILLERY]: return False # 轰炸机被攻击时不会反击(除非攻击者是战斗机) if defender.unit_type == UnitType.BOMBER: return attacker.unit_type == UnitType.FIGHTER return True ``` ### 4.5 伤害计算规则 1. **基础攻击力**: `attacker.get_effective_attack()` 2. **伏击处理**: 如果目标有AMBUSH,先进行伏击伤害 3. **重甲减伤**: 应用`HEAVY_ARMOR_X`减伤 4. **最终伤害**: `target.stats.take_damage(final_damage)` ## 5. 部署规则 ### 5.1 部署位置 - **支援线部署**: 单位只能部署到己方支援线 - **位置选择**: 可以指定位置或自动添加到末尾 - **HQ位置**: HQ总是位于支援线末端 ### 5.2 部署限制 - **容量限制**: 每条支援线有最大容量限制 - **费用检查**: 部署不消耗操作费用,但激活需要费用 - **所有权**: 部署时自动设置单位所有者 ### 5.3 部署状态 - **新部署状态**: `deployed_this_turn = True` - **行动限制**: 除非有BLITZ,否则当回合不能移动/攻击 - **下回合重置**: 回合开始时`deployed_this_turn = False` ## 6. 回合制规则 ### 6.1 回合结构 - **玩家回合**: 每个玩家轮流进行完整回合 - **行动阶段**: 玩家可以自由进行移动、攻击等行动 - **回合结束**: 重置所有单位的行动状态 ### 6.2 行动状态管理 ```python # 单位状态属性 self.deployed_this_turn: bool = True self.has_moved_this_turn: bool = False self.has_attacked_this_turn: bool = False self.attacks_this_turn: int = 0 self.max_attacks_per_turn: int = 1 # 回合开始时重置 def start_new_turn(self): self.deployed_this_turn = False self.has_moved_this_turn = False self.has_attacked_this_turn = False self.attacks_this_turn = 0 ``` ### 6.3 资源系统(Kredits) - **Kredits Slot**: 指挥点槽位,每回合自然增长(上限12) - **Kredits**: 当前可用指挥点,每回合重置为槽位数 - **激活费用**: 移动和攻击都需要消耗单位的操作费用 ## 7. 特殊规则汇总 ### 7.1 立即行动规则 - **BLITZ单位**: 部署当回合可立即行动 - **实现方式**: `can_operate_immediately = True` ### 7.2 多次行动规则 - **TANK单位**: 可以移动后攻击或攻击后移动 - **FURY单位**: 可以每回合攻击两次 - **组合效果**: TANK+FURY可以移动后攻击两次 ### 7.3 保护机制 - **GUARD保护**: 相邻友方单位和HQ - **战斗机保护**: 同阵线单位免受轰炸机攻击 - **SMOKESCREEN保护**: 完全免疫攻击(攻击后消失) ### 7.4 特殊攻击规则 - **无视距离**: 火炮、战斗机、轰炸机 - **无视守护**: 火炮、轰炸机 - **无反击攻击**: 火炮、轰炸机的攻击 - **战斗机限制**: 轰炸机不能攻击有战斗机保护的目标 --- *此文档基于当前代码实现整理,涵盖了KARDS战斗引擎的所有核心规则和机制。*