RPG 游戏战斗伤害计算器 - 题解

一、题目分析

本题要求根据《战斗伤害公式 v1.0》计算 RPG 回合制战斗的最终伤害值。规则链路:

  1. [C.4] 无敌检查(优先级最高,命中则伤害为 0)
  2. [C.1] 基础伤害 = 攻击力 - 防御力(破防失败则为 1)
  3. [C.2] 属性克制(水克火、火克草、草克水,克制时 ×2)
  4. [C.3] 暴击(×1.5)

输出 damage_dealt、is_critical、reaction 三个字段。

二、难点分析

  1. 破防失败的强制扣血:防御力 ≥ 攻击力时基础伤害为 1 而非 0,模型容易输出 0
  2. 属性克制方向性:是"水克火"不是"火克水",需要同时考虑攻击方和防御方的属性
  3. 暴击计算顺序:先属性克制再暴击,即 (base × 属性倍数) × 1.5,不是分别计算再相加
  4. reaction 字符串格式:需要输出固定格式如 "Fire vs Grass (Double Damage)"、"Normal"、"Invincible"
  5. 向下取整:最终伤害取整数,需要向下取整

三、Prompt 设计思路

3.1 Battle Pipeline 设计

采用"管道"(Pipeline)概念,用变量名 Dmg_1、Dmg_2、Dmg_Final 串联各阶段的伤害值,使计算链路可追踪。

3.2 无敌前置短路

第一步就检查无敌状态,命中直接输出 Damage=0 和 Reaction="Invincible",不进入任何计算。

3.3 角色定义强化

开头用 "你是回合制 RPG 游戏的战斗伤害计算引擎 (Combat Engine)" 设定角色,让模型进入"计算引擎"的心智模式,减少废话和主观判断。

3.4 克制关系用箭头表示

水 (Water) -> 火 (Fire) 的箭头格式表示克制方向,比纯文字"水克火"更直观,减少方向性混淆。

3.5 思考字段嵌入输出

在 JSON Schema 中加入 damage_dealtthinking 字段,要求模型把伤害计算过程写入输出 JSON,相当于把思维链嵌入结构化输出中,既引导推理又方便调试。

四、关键技巧

  1. 隐式思维链:通过 damage_dealtthinking 字段将推理过程嵌入输出,而非依赖外部 <thinking> 标签
  2. 变量命名法:Dmg_1→Dmg_2→Dmg_Final 的递进变量名,让模型按阶段计算
  3. 双语标注:每个规则名都用中英文双语(如"基础伤害 (Base Damage)"),增强模型对概念的理解
  4. reaction 格式模板化:明确给出三种 reaction 的格式模板,减少输出格式的随机性
  5. 向下取整显式要求:在输出步骤中标注"向下取整",避免四舍五入
  6. 用户输入占位符:使用 {{user_input}} 模板变量,体现 Prompt 的工程化设计