Files
text-adventure-game/docs/MATHEMATICAL_MODEL.md
Claude 5d4371ba1f feat: 完善数学模型和品质系统
- 修复品质等级范围重叠问题(优秀/稀有无重叠)
- 统一 formulas.js 与 constants.js 的品质判定
- 修复经验公式与游戏实际逻辑不一致
- 调整品质生成概率: 传说0.1%, 史诗1%, 稀有4%, 优秀10%
- 添加数学模型文档和README
- 添加数值验证脚本

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 14:54:20 +08:00

428 lines
8.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 游戏数值模型文档
本文档详细描述了游戏中所有数值计算的核心公式和设计理念。
## 目录
1. [设计原则](#设计原则)
2. [角色属性系统](#角色属性系统)
3. [装备属性系统](#装备属性系统)
4. [词缀系统](#词缀系统)
5. [怪物属性系统](#怪物属性系统)
6. [经验与升级系统](#经验与升级系统)
7. [战斗伤害计算](#战斗伤害计算)
8. [经济系统](#经济系统)
---
## 设计原则
### 1. 线性与指数平衡
- **低等级1-20**:使用线性增长,确保新手体验平滑
- **中等级21-50**:引入指数增长,增加挑战
- **高等级51+**:指数加速,突出后期成就
### 2. 边际收益递减
- 属性越高,继续提升的成本越大
- 防止某一项属性无限堆叠
### 3. 有意义的多样性
- 不同属性有不同用途,避免单一最优解
- 词缀系统提供随机性和惊喜
---
## 角色属性系统
### 基础属性
| 属性 | 符号 | 默认值 | 说明 |
|------|------|--------|------|
| 力量 | STR | 10 | 影响攻击力 |
| 敏捷 | AGI | 8 | 影响闪避、防御 |
| 灵巧 | DEX | 8 | 影响暴击 |
| 智力 | INT | 10 | 影响品质、魔法 |
| 体质 | VIT | 10 | 影响生命、回复 |
### 派生属性计算
```javascript
// 基础生命值
HP = 100 + VIT × 10 + Level × 5
// 基础耐力
Stamina = 80 + VIT × 5 + Level × 3
// 基础精神
Sanity = 100 + INT × 3
// 基础攻击力
Attack = STR × 1.0 + Level × 2
// 基础防御力
Defense = AGI × 0.3 + VIT × 0.2 + Level
// 基础暴击率 (%)
CritRate = 5 + DEX × 0.3
// 基础闪避率 (%)
DodgeRate = AGI × 0.5
```
### 属性效果示例
| 属性值 | 效果 |
|--------|------|
| STR 10 → 20 | 攻击力 +10 |
| AGI 10 → 20 | 闪避 +5%,防御 +3 |
| DEX 10 → 20 | 暴击 +3% |
| VIT 10 → 20 | HP +100回复 +0.5/秒 |
| INT 10 → 20 | 装备品质期望 +5 |
---
## 装备属性系统
### 装备品质
品质范围0-250影响装备属性的百分比加成。
| 品质范围 | 名称 | 倍率 | 颜色 |
|----------|------|------|------|
| 0-49 | 垃圾 | 0.5x | 灰色 |
| 50-89 | 普通 | 1.0x | 白色 |
| 90-129 | 优秀 | 1.2x | 绿色 |
| 130-159 | 稀有 | 1.5x | 蓝色 |
| 160-199 | 史诗 | 2.0x | 紫色 |
| 200-250 | 传说 | 3.0x | 橙色 |
### 装备最终属性计算
```javascript
// 品质倍率
QualityMultiplier = 1 + (Quality - 100) × 0.01
// 等级倍率(每级 +2%
LevelMultiplier = 1 + (ItemLevel - 1) × 0.02
// 综合倍率
TotalMultiplier = QualityMultiplier × LevelMultiplier
// 最终伤害
FinalDamage = BaseDamage × TotalMultiplier
// 最终防御
FinalDefense = BaseDefense × TotalMultiplier
```
### 装备品质示例
以攻击力20的基础武器为例
| 品质 | 等级 | 最终攻击力 |
|------|------|------------|
| 100 (普通) | 1 | 20 |
| 150 (优秀) | 1 | 30 |
| 200 (史诗) | 1 | 40 |
| 100 (普通) | 10 | 24 |
| 150 (优秀) | 10 | 36 |
| 200 (史诗) | 10 | 48 |
---
## 词缀系统
### 词缀稀有度
每件装备最多3个词缀词缀数量和稀有度受品质影响。
| 品质范围 | 最大词缀数 | 词缀稀有度倾向 |
|----------|------------|----------------|
| 0-89 | 0 | 无 |
| 90-129 | 1 | 普通60%稀有30% |
| 130-159 | 2 | 稀有为主 |
| 160-199 | 3 | 史诗为主 |
| 200-250 | 3 | 传说9% |
### 词缀属性
词缀属性随物品等级缩放:
```
词缀最终值 = 词缀基础值 × (1 + (物品等级 - 1) × 0.1)
```
### 武器词缀示例
| 名称 | 类型 | 基础值 | 稀有度 |
|------|------|--------|--------|
| 锋利 | 攻击+5% | 5 | 普通 |
| 残暴 | 攻击+12% | 12 | 稀有 |
| 弑神 | 攻击+25% | 25 | 传说 |
| 锐利 | 暴击+3% | 3 | 普通 |
| 致命 | 暴击+8% | 8 | 稀有 |
| 烈焰 | 火伤+10 | 10 | 史诗 |
### 防具词缀示例
| 名称 | 类型 | 基础值 | 稀有度 |
|------|------|--------|--------|
| 坚固 | 防御+5% | 5 | 普通 |
| 强化 | 防御+12% | 12 | 稀有 |
| 铁壁 | 防御+25% | 25 | 史诗 |
| 灵活 | 闪避+3% | 3 | 普通 |
| 耐久 | 耐力+15 | 15 | 稀有 |
| 不朽 | 生命+100 | 100 | 传说 |
---
## 怪物属性系统
### 怪物等级缩放
```javascript
// 生命值缩放(每级 +12%
MonsterHP = BaseHP × 1.12^(Level - 1)
// 攻击力缩放(每级 +8%
MonsterAttack = BaseAttack × 1.08^(Level - 1)
// 防御力缩放(每级 +6%
MonsterDefense = BaseDefense × 1.06^(Level - 1)
// 经验奖励缩放(每级 +10%
MonsterEXP = BaseEXP × 1.10^(Level - 1)
```
### 怪物等级范围
怪物实际等级在基础等级 ±20% 范围内浮动:
```javascript
LevelVariance = BaseLevel × 0.2
MinLevel = Max(1, BaseLevel - LevelVariance)
MaxLevel = BaseLevel + LevelVariance
```
### 难度系数
```javascript
// 基础难度
Difficulty = 1.0
// 精英怪
Elite: Difficulty = 1.5
// Boss
Boss: Difficulty = 2.0
// 弱小怪
Weak: Difficulty = 0.7
```
### 怪物属性示例
以基础攻击10的怪物为例
| 等级 | HP | 攻击 | 防御 | 经验 |
|------|-----|------|------|------|
| 1 | 100 | 10 | 5 | 20 |
| 5 | 157 | 14 | 7 | 29 |
| 10 | 278 | 20 | 10 | 47 |
| 20 | 872 | 43 | 17 | 122 |
| 50 | 18403 | 184 | 74 | 5851 |
---
## 经验与升级系统
### 角色升级经验
```javascript
// 所需经验 = 基础值 × 增长系数^(等级-1)
ExpNeeded = 100 × 1.15^(Level - 1)
```
| 等级 | 所需经验 | 累计经验 |
|------|----------|----------|
| 1 | 100 | 0 |
| 5 | 174 | 674 |
| 10 | 352 | 2261 |
| 20 | 1458 | 12674 |
| 50 | 84049 | 424058 |
### 战斗经验计算
```javascript
// 等级差调整
LevelDiff = MonsterLevel - PlayerLevel
if (LevelDiff > 5) {
// 怪物高5级以上额外奖励
ExpMultiplier = 1 + (LevelDiff - 5) × 0.1
} else if (LevelDiff < -5) {
// 怪物低5级以上大幅衰减
ExpMultiplier = Max(0.1, 0.5 + (LevelDiff + 5) × 0.1)
} else {
// 等级相近,正常或小幅衰减
ExpMultiplier = 1 + LevelDiff × 0.05
}
// 实际经验
ActualExp = BaseExp × ExpMultiplier
```
### 经验衰减表
| 玩家等级 vs 怪物等级 | 经验倍率 |
|---------------------|----------|
| +5级或更高 | 100%+ |
| 相同等级 | 100% |
| -3级 | 85% |
| -5级 | 50% |
| -10级 | 10% |
### 技能经验
```javascript
// 技能经验衰减(等级越高越难升级)
Decay = 0.95^(SkillLevel - 1)
ActualExp = ActionExp × Decay
```
| 技能等级 | 经验衰减 | 获得100经验实际得到 |
|----------|----------|-------------------|
| 1 | 100% | 100 |
| 5 | 81% | 81 |
| 10 | 63% | 63 |
| 20 | 36% | 36 |
---
## 战斗伤害计算
### 普通伤害
```javascript
// 基础伤害
BaseDamage = Attack - Defense × 0.5
// 最小伤害保证攻击力的20%
MinDamage = Attack × 0.2
// 实际伤害
ActualDamage = Max(MinDamage, BaseDamage)
```
### 暴击系统
```javascript
// 暴击判定
IsCrit = Random(0, 100) < CritRate
// 暴击伤害
if (IsCrit) {
CritDamage = BaseDamage × 1.5 // 基础暴击倍率
// 可通过装备/技能提升
}
```
### 命中系统
```javascript
// 实际命中率
ActualHitRate = Clamp(5, 95, HitRate - DodgeRate)
// 命中判定
IsHit = Random(0, 100) < ActualHitRate
```
### 伤害示例
| 攻击 | 防御 | 基础伤害 | 最小伤害 | 实际伤害 |
|------|------|----------|----------|----------|
| 20 | 5 | 17.5 | 4 | 17-18 |
| 50 | 10 | 45 | 10 | 45 |
| 50 | 30 | 35 | 10 | 35 |
| 100 | 50 | 75 | 20 | 75 |
| 30 | 40 | 10 | 6 | 10 |
---
## 经济系统
### 物品价值
```javascript
// 出售价格
SellPrice = BaseValue × QualityMultiplier × (1 + AffixCount × 0.15)
// 购买价格(商人倍率)
BuyPrice = SellPrice × MerchantRate
// 商人收购价
BuybackPrice = SellPrice × 0.3
```
### 商人类型
| 商人 | 出售倍率 | 收购倍率 |
|------|----------|----------|
| 普通商人 | 200% | 30% |
| 黑市商人 | 250% | 50% |
| 特殊商人 | 150% | 40% |
### 价值示例
以基础价值100的物品为例
| 品质 | 词缀 | 出售价 | 购买价(普通) | 购买价(黑市) |
|------|------|--------|-------------|-------------|
| 100 | 0 | 100 | 200 | 250 |
| 150 | 1 | 145 | 290 | 362 |
| 200 | 2 | 250 | 500 | 625 |
| 200 | 3 | 287 | 574 | 717 |
---
## 平衡性检查
### 攻击期望
玩家攻击期望 = 基础攻击 × (1 + 暴击率 × 暴击倍率)
例如攻击100暴击率20%暴击倍率1.5
```
期望伤害 = 100 × (1 + 0.2 × 0.5) = 100 × 1.1 = 110
```
### 生存期望
玩家有效生命 = HP × (1 + 闪避率 / (1 - 闪避率))
例如HP 1000闪避30%
```
有效生命 = 1000 × (1 + 0.3 / 0.7) = 1000 × 1.43 = 1430
```
### DPT每回合伤害
```javascript
PlayerDPT = PlayerAttack × PlayerHitRate
MonsterDPT = MonsterAttack × (1 - PlayerDodgeRate)
// 生存回合
SurvivalTurns = PlayerHP / MonsterDPT
// 击杀回合
KillTurns = MonsterHP / PlayerDPT
// 战斗评价
if (KillTurns < SurvivalTurns) {
// 玩家优势
} else {
// 怪物优势
}
```