Files
text-adventure-game/docs/MATHEMATICAL_MODEL.md

428 lines
8.8 KiB
Markdown
Raw Permalink Normal View History

# 游戏数值模型文档
本文档详细描述了游戏中所有数值计算的核心公式和设计理念。
## 目录
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 {
// 怪物优势
}
```