AI 对手设计
06/238 浏览
神经网络原理 → 纸上谈兵 AI 对手设计 对应关系 AI/ML 概念 纸上谈兵中的映射 具体机制 梯度消失 玩家打了10个AI都不掉好东西,没成长感 保底掉落机制 梯度爆炸 某次捡到超强能量,后面碾压无脑 行动点软上限(BN层) 激活函数 AI 行为的非线性切换 血量<30%时AI暴走(ReLU) 自适应学习率 动态难度调节 根据玩家击杀速度调整刷新强度 残差连接 击杀积累不清零 掉落的材料可永久强化兵体 具体设计
- AI 蓝图生成(初始化 = Xavier/He) AI 兵的强度 = f(玩家当前核心数, 击杀数, 存活时间)
第1-3个AI:小型(3核心 + 2甲 + 1炮)→ "新手村" 第4-8个AI:中型(5核心 + 4甲 + 2炮) 第9+个AI:大型(8核心 + 6甲 + 3炮)
类似 He初始化:根据"网络深度"(玩家进度)合理设定初始值 不会开局就刷 BOSS,也不会永远刷小怪 2. AI 行为(激活函数式状态切换) lua
复制 -- 不是简单的 if-else,而是"激活函数"式的连续变化
-- ReLU 式行为:血量高于50%正常巡逻,低于50%切换为冲锋 aggression = math.max(0, 1 - hp_ratio) * 2 -- ReLU(1-hp)
-- Sigmoid 式逃跑:不是突然逃,而是逐渐倾向后退 flee_prob = 1 / (1 + math.exp(5 * (hp_ratio - 0.2))) -- hp=50% → flee_prob≈0.05(几乎不跑) -- hp=20% → flee_prob≈0.5(开始犹豫) -- hp=5% → flee_prob≈0.95(拼命跑) 3. 动态难度(Batch Normalization) 每击杀5个AI,系统计算一次"玩家表现方差":
表现值 = 击杀用时的平均 + 剩余血量的平均
如果表现太好(方差大,梯度爆炸): → 下一波AI加强 20%(类似BN把输出拉回正常范围)
如果表现太差(方差趋零,梯度消失): → 下一波AI减弱 20% + 额外掉落能量("恢复学习率")
目标:让玩家始终处于"有挑战但能赢"的甜区 4. 掉落机制(残差连接 + 保底) 击杀AI → 必掉能量块(+500行动点) 概率掉甲片碎片(后期:+1甲片格子)
残差连接思想:玩家的成长不会"归零"
- 捡到的能量直接加到当前行动点(跨战斗保留)
- 不像很多游戏"死了全丢"
保底机制(防梯度消失): 连续3次击杀无额外掉落 → 第4次必定掉稀有材料 5. 行动点软上限(梯度裁剪) 行动点上限 = 5000(由能量仓决定)
即使无限拾取能量掉落物: if 行动点 > 上限 then 超出部分转化为"暴击率" × 0.01(边际收益递减) end
类似梯度裁剪:限制最大值,防止"无限续命"破坏游戏紧张感 公式汇总 AI强度 = He初始化(玩家进度层数) AI行为 = ReLU(攻击) + Sigmoid(逃跑)
难度调节 = BatchNorm(玩家表现方差) 掉落保底 = 残差连接(累积击杀数) 行动点 = GradientClip(当前值, 上限5000) 一句话 把"训练一个AI模型"的过程,变成"玩家在游戏中成长"的过程——让玩家就是那个正在被训练的网络,而你设计的难度曲线就是优化器。
难度调节 = BatchNorm(玩家表现方差) 掉落保底 = 残差连接(累积击杀数) 行动点 = GradientClip(当前值, 上限5000) 一句话 把"训练一个AI模型"的过程,变成"玩家在游戏中成长"的过程——让玩家就是那个正在被训练的网络,而你设计的难度曲线就是优化器。


