kards-env/docs/KARDS_GAME_RULES.md

8.7 KiB
Raw Permalink Blame History

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 移动限制检查

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 攻击限制检查

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 反击规则

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 行动状态管理

# 单位状态属性
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战斗引擎的所有核心规则和机制。