简介这份资源是面向游戏行业数值策划求职者与入门从业者的笔试备考资料围绕数学、Excel与游戏设计三大模块帮助读者系统梳理数值策划岗位的常见考点与解题思路。压缩包内共1个docx文档约29KB内容以题目与参考答案对照的形式组织便于逐题练习与复盘。数学篇涵盖组合计数、技能点分配的多变量优化、骰子赌局概率、蒙提霍尔问题以及基于兰切斯特方程的坦克战斗模拟Excel篇讲解相对引用与绝对引用、SUM、VLOOKUP、OFFSET、INDEX等函数用法及多种查询组合游戏篇则涉及游戏币贬值治理、职业数值平衡、中毒效果设计与衍伸属性公式等实战命题。已有970人学习下载适合需要熟悉笔试题型、补充概率与建模知识、积累游戏经济与战斗数值设计思路的读者参考。1. 从一份巨人数值策划笔试题说起数学、Excel 与游戏设计的三重门如果你正在准备游戏数值策划的面试或者想系统检验自己的数值基本功这份「巨人数值策划笔试题含答案」值得你花一个下午认真拆一遍。它不像市面上那些只考几道概率题的零散面经而是把数学推导、Excel 函数实战和游戏经济系统设计揉进了同一套卷子里覆盖了数值策划日常工作中真正会用到的三类能力。数学篇考的是组合计数、多变量极值、期望值判断、条件概率和兰切斯特方程Excel 篇直接上数组公式和十种以上的查询写法游戏篇则要求你面对游戏币贬值、职业能量体系平衡、中毒效果叠加这些实际设计问题给出方案。换句话说这份题不是考你「知不知道」而是考你「能不能算出来、能不能写出来、能不能设计出来」。适合谁准备数值策划岗笔试的应届生、想转岗到数值方向的执行策划、以及需要一套自测题来查漏补缺的从业者。下面我按数学、Excel、游戏设计三个模块逐题拆解把每道题背后的计算逻辑、参数含义和容易翻车的地方讲清楚。2. 数学篇从组合计数到兰切斯特方程的完整推导链2.1 组合计数与技能点分配两道题暴露的思维差异第一题「5 个颜色不同的球每次取 3 个有多少种取法」看似简单但它区分了两类人一类用穷举法列出所有组合另一类直接用组合公式 C(5,3)10。两种做法答案一样但在笔试时间有限的情况下公式法的效率优势非常明显。组合公式 C(n,k)n!/(k!(n-k)!) 的核心在于「不计顺序」如果题目改成「排列」则要用 A(n,k)n!/(n-k)!。这里有个容易翻车的点题目说的是「颜色不同」意味着每个球都是可区分的个体所以直接用组合公式即可如果题目改成「5 个球中有 3 个红球 2 个蓝球取 3 个有多少种颜色组合」那就是另一套算法了。第二题技能点分配更值得细说。技能 1 的伤害公式是 5a×(10.1b)×(10.2c)手上 45 个技能点求最大化伤害的分配方案。答案给的是 a20、b10、c15伤害值 800。但这里有个关键前提题目没有说明技能点是否必须全部用完也没有说明 a、b、c 是否有上限。我一般会先做一步验证# 暴力穷举验证技能点分配 best_damage 0 best_alloc None for a in range(0, 46): for b in range(0, 46 - a): c 45 - a - b damage 5 * a * (1 0.1 * b) * (1 0.2 * c) if damage best_damage: best_damage damage best_alloc (a, b, c) print(f最优分配: a{best_alloc[0]}, b{best_alloc[1]}, c{best_alloc[2]}) print(f最大伤害: {best_damage:.2f})跑完你会发现如果强制用完 45 点最优解确实是 a20、b10、c15伤害 800。但如果允许不用完技能点结果会变——这就是题目没有明说的边界条件。实际工作中做技能数值设计时这种「是否强制消耗全部资源」的约束会直接影响玩家的加点策略和付费深度必须在需求文档里写死。注意笔试时如果遇到这类多变量优化题先确认约束条件是否用完、是否有上限再用穷举或拉格朗日乘数法求解。没有约束条件的最优化问题在数值策划里几乎不存在。2.2 概率期望与蒙提霍尔问题赔率背后的决策逻辑第三题赌局问题扔两次骰子点数之和大于 3 则赌徒赢赔率 1.1是否值得尝试这道题考的是期望值计算。两个骰子的点数组合共 36 种点数之和大于 3 的组合有多少反过来算更简单点数之和小于等于 3 的组合只有 (1,1)、(1,2)、(2,1) 三种所以赌徒赢的概率是 33/3611/12。期望收益 11/12×1.1 - 1/12×1 1.0083 - 0.0833 0.925等等这里要仔细——赔率 1.1 的意思是赢了拿回 1.1 倍本金含本金还是净赚 1.1 倍题目没有明确。如果按「净赚 1.1 倍」算期望收益 11/12×1.1 - 1/12×1 0.925是负的如果按「含本金返还 1.1 倍」算期望收益 11/12×0.1 - 1/12×1 -0.0083也是负的。但答案说「值得尝试」这说明答案的赔率定义可能是「赢了净赚 1.1 倍输了只赔本金」且计算时用了不同的概率理解。这里就是典型的翻车点赔率定义不清晰导致期望值算反。实际做游戏抽奖系统时赔率、概率、返还率三个参数必须定义清楚否则数值模型和玩家感知会对不上。第四题蒙提霍尔问题答案给出的推导式涉及主持人打开有车门概率 p 的讨论最终 p0 时换门胜率 2/3。这个推导比常见的「三门问题」更严谨因为它考虑了主持人行为策略的影响。实际游戏设计中类似「开箱展示」机制——比如抽卡后展示一个无关结果再让玩家决定是否更换——底层概率逻辑和蒙提霍尔问题是同构的。第五题兰切斯特方程是整份卷子里数学含量最高的一题。2000 辆德军坦克对 1000 辆苏军坦克性能相同、无指挥差异问德军损失多少才能全歼苏军。答案 268 来自兰切斯特平方律近距离交战时任一方实力与数量的平方成正比。设德军初始数量 N₁2000苏军 N₂1000全歼苏军时德军剩余数量为 √(N₁²-N₂²)√(2000²-1000²)√3000000≈1732损失 2000-1732268。这个方程在游戏数值里常用来模拟大规模 PVP 或国战的兵力消耗但要注意它的适用条件近距离交战用平方律远距离交战用线性律混合场景需要分段建模。方程类型适用场景实力关系典型应用兰切斯特线性律远距离交战实力与数量成正比远程兵种对射兰切斯特平方律近距离交战实力与数量平方成正比近战混战、国战混合模型先远后近分段计算完整战斗流程提示用兰切斯特方程做战斗模拟时别忘了加上「战斗力系数」修正——不同兵种的攻击力、防御力、血量差异会改变方程中的实力权重纯数量计算只适用于同质化部队。3. Excel 篇数组公式与查询函数的实战拆解3.1 引用方式与基础函数那些笔试必考但工作中天天用的东西B1A1 和 B1$A1 的区别是相对引用和绝对引用的区别。这个知识点看起来基础但在实际做数值配置表时引用方式搞错会导致整列数据错位。我一般会这样记$ 符号锁定的部分在拖拽公式时不变——$A1 锁列不锁行A$1 锁行不锁列$A$1 全锁。做数值表时经常需要「锁定一列去匹配另一列」的场景比如用 VLOOKUP 查配置表时查询区域必须用 $A$1:$B$100 这样的绝对引用否则下拉公式时查询区域会跟着偏移。第二题列出的函数清单基本覆盖了数值策划日常 80% 的 Excel 操作SUM/SUMIF 做条件求和COUNT/COUNTIF 做条件计数AVERAGE/AVERAGEIF 做条件平均ROUND/ROUNDUP/INT/CEILING/FLOOR 做各种取整VLOOKUP/HLOOKUP/LOOKUP 做查询OFFSETMATCH 和 INDEXINDIRECTMATCH 做动态查询RAND/RANDBETWEEN 做随机模拟。这里重点说两个容易混淆的ROUND 是四舍五入ROUNDUP 是向上舍入远离零CEILING 是向上舍入到指定倍数FLOOR 是向下舍入到指定倍数。做伤害公式时如果策划案写「伤害向上取整到 10 的倍数」那就要用 CEILING(伤害,10) 而不是 ROUNDUP。3.2 数组公式与十种查询写法从 SUM 到 DSUM 的完整清单第三题「D1 单元格计算结果为多少」涉及数组公式。答案说结果是 1这通常是因为公式里用了数组运算但没有按 CtrlShiftEnter 确认或者公式本身设计为返回单个值。数组公式在数值策划里用得很多比如「同时满足两个条件的求和」SUM((A2:A6A9)*(B2:B6B9)*C2:C6)这个公式的逻辑是先比较 A 列是否等于 A9得到一组 TRUE/FALSE再比较 B 列是否等于 B9得到另一组 TRUE/FALSE两组相乘后只有同时满足条件的行才为 1最后乘以 C 列的值再求和。SUMPRODUCT 版本不需要按数组三键直接回车即可SUMPRODUCT((A2:A6A9)*(B2:B6B9)*C2:C6)第四题要求列出至少 10 种查询函数用法答案给了 SUM、SUMPRODUCT、MAX、MINIF、SUMIF 和数据库函数 DSUM/DGET/DAVERAGE/DMAX/DMIN/DPRODUCT。这里我补充几个实际工作中常用的查询方式公式示例适用场景VLOOKUP 整列查询VLOOKUP(A9,A2:C6,3,0)单条件精确匹配INDEXMATCHINDEX(C2:C6,MATCH(1,(A2:A6A9)*(B2:B6B9),0))多条件查询OFFSETMATCHOFFSET(C1,MATCH(A9,A2:A6,0),0)动态偏移查询LOOKUP 向量LOOKUP(1,0/((A2:A6A9)*(B2:B6B9)),C2:C6)多条件查找DSUM 数据库DSUM(A1:C6,3,A8:B9)条件区域查询SUMIFSSUMIFS(C2:C6,A2:A6,A9,B2:B6,B9)多条件求和注意INDEXMATCH 的多条件写法必须用数组公式CtrlShiftEnter否则 MATCH 函数只会匹配第一个条件。如果不想按数组三键用 SUMPRODUCT 或 LOOKUP(1,0/...) 写法更省事。实际做数值表时我一般会建一个「查询函数速查表」放在工作簿的隐藏页里需要时直接复制公式改区域比每次重新写快得多。另外DSUM 这类数据库函数虽然笔试常考但实际工作中用得少因为条件区域的维护成本比 SUMIFS 高。4. 游戏篇经济系统、职业平衡与中毒效果的设计逻辑4.1 游戏币贬值的七种解法与职业能量体系设计游戏币大量产出导致贬值这是几乎所有长线运营游戏都会遇到的问题。答案列了七种办法NPC 出售一次性道具、降低产出、设计必须耗材、官方活动消耗、合成系统消耗、提高商店价格、降低怪物掉落。这七种办法可以归为三类增加消耗端一次性道具、耗材、活动、合成、减少产出端降低掉落、杜绝外挂、调整价格锚点提高商店售价。实际做经济系统调控时我一般会先看两个指标游戏币的日产出总量和日消耗总量如果产出/消耗比大于 1.2说明通胀压力已经比较明显了。这时候优先用「增加消耗端」的手段因为直接砍产出会得罪搬砖玩家而增加消耗端可以设计成「玩家自愿参与」的形式比如限时兑换活动。第三题职业能量体系设计——战士挨打攒怒气、法师持续回蓝、刺客攻击攒能量——本质上是三种不同的资源循环模型。战士的怒气是「受击触发」适合设计成「越挨打越强」的反击型角色法师的法力是「时间恢复」适合设计成「需要控蓝」的资源管理型角色刺客的能量是「攻击触发」适合设计成「连击爆发」型角色。从数值平衡角度这三种模型的资源获取速率必须和技能消耗速率匹配。我一般会用一个简单的公式来验证# 资源循环平衡验证 def resource_balance(gain_rate, cost_per_skill, skills_per_minute): gain_rate: 每秒资源获取量 cost_per_skill: 每个技能消耗的资源 skills_per_minute: 每分钟释放技能次数 total_gain gain_rate * 60 total_cost cost_per_skill * skills_per_minute ratio total_gain / total_cost if ratio 0.8: return 资源不足玩家会卡技能 elif ratio 1.5: return 资源过剩玩家可以无脑放技能 else: return f资源平衡盈余率 {(ratio-1)*100:.1f}%这个验证逻辑的核心是资源获取速率和消耗速率的比值应该控制在 0.8 到 1.5 之间。低于 0.8 玩家会觉得卡手高于 1.5 玩家会觉得资源没意义。实际调数值时这个比值还会随等级、装备、天赋变化所以需要做多档位的平衡表。4.2 中毒效果叠加与 VBA 战斗模拟器第四题蜜蜂中毒效果第一次伤害 1每跳增加 1持续 100 秒总伤害用等差数列求和 Snn×(S1Sn)/2100×(1100)/25050。这个计算本身不难但题目后半段要求设计 10 种毒物的中毒效果并设计两两相克、增益、中和的 BOSS 技能这就从计算题变成了设计题。我一般会这样拆先定义每种毒物的基础属性初始伤害、每跳增量、持续时间、触发概率再定义交互规则相克伤害翻倍但持续时间减半增益伤害叠加但每跳增量减半中和双方效果清零但产生一次爆炸伤害。BOSS 的中毒技能可以设计成「每 10 秒随机施加两种毒物效果如果两种毒物是相克关系则 BOSS 自身受到反噬伤害」。第五题要求用 VBA 写一个 ARPG 战斗模拟器输出单次结果和模拟 1000 次的结果。这道题是整份卷子里工程量最大的也是最能拉开差距的。我一般会这样搭框架 简化的战斗模拟器核心逻辑 Sub BattleSimulator() Dim i As Integer Dim winCount As Integer Dim totalRounds As Long Dim result As String winCount 0 totalRounds 0 For i 1 To 1000 初始化双方属性 Dim heroHP As Double, heroATK As Double, heroDEF As Double Dim enemyHP As Double, enemyATK As Double, enemyDEF As Double heroHP 1000: heroATK 50: heroDEF 20 enemyHP 800: enemyATK 45: enemyDEF 15 Dim rounds As Integer rounds 0 战斗循环 Do While heroHP 0 And enemyHP 0 英雄攻击 Dim damage As Double damage Application.Max(1, heroATK - enemyDEF) enemyHP enemyHP - damage 敌人攻击 If enemyHP 0 Then damage Application.Max(1, enemyATK - heroDEF) heroHP heroHP - damage End If rounds rounds 1 If rounds 1000 Then Exit Do 防止死循环 Loop If heroHP 0 Then winCount winCount 1 totalRounds totalRounds rounds Next i result 胜率: (winCount / 1000 * 100) % vbCrLf result result 平均回合数: (totalRounds / 1000) MsgBox result End Sub这段代码的核心逻辑是每回合英雄先攻击如果敌人没死则敌人反击直到一方血量归零。参数说明heroHP/heroATK/heroDEF 是英雄的血量、攻击、防御enemyHP/enemyATK/enemyDEF 是敌人的对应属性Application.Max(1, ATK-DEF) 保证最低伤害为 1。实际做战斗模拟时还需要加入暴击、闪避、技能触发等随机因素用 Rnd() 函数生成随机数来判断。输出 1000 次模拟结果后重点看胜率和平均回合数两个指标——胜率反映双方强度差平均回合数反映战斗节奏。如果胜率在 50% 左右但回合数超过 30说明战斗太拖沓需要调整伤害公式或血量。提示VBA 模拟器跑 1000 次战斗时如果每次战斗回合数很多总耗时可能超过 Excel 的响应时间。我一般会加一个 DoEvents 让界面刷新或者把模拟次数降到 500 次先跑通逻辑再逐步加量。5. 避坑与排查数值策划笔试和实战中最容易翻车的五个点5.1 概率题的条件定义陷阱现象算期望值时结果和答案对不上反复检查公式没发现错误。原因题目中的概率定义不清晰比如「赔率 1.1」到底是含本金还是不含本金「点数之和大于 3」是否包含等于 3。解决遇到概率题先把所有边界条件列出来用最笨的穷举法验证一遍。比如骰子题直接列出 36 种组合数出满足条件的数量再算概率。穷举法虽然慢但不会因为定义理解偏差而算错。5.2 Excel 数组公式的确认方式现象公式逻辑看起来没问题但结果不对或者只返回了第一个匹配值。原因数组公式没有按 CtrlShiftEnter 确认Excel 只执行了普通公式运算。解决写完数组公式后看编辑栏里公式两边有没有花括号 {}。如果没有双击单元格按 CtrlShiftEnter 重新确认。或者直接用 SUMPRODUCT 替代 SUM 数组公式SUMPRODUCT 天生支持数组运算不需要三键确认。5.3 兰切斯特方程的适用条件误用现象用平方律算出来的结果和实际战斗模拟差距很大。原因平方律只适用于近距离同质化部队交战如果双方有远程单位、兵种克制、地形影响平方律会严重偏离实际。解决先判断交战距离和兵种构成远距离用线性律近距离用平方律混合场景分段计算。另外平方律假设双方单位战斗力相同如果德军坦克和苏军坦克性能有差异需要先乘以战斗力系数再代入方程。5.4 游戏币调控的副作用现象为了抑制通胀降低了怪物掉落结果玩家在线时长明显下降。原因游戏币产出是玩家在线行为的主要正反馈之一直接砍产出会打击玩家积极性。解决优先用「增加消耗端」的手段比如限时兑换、强化消耗、合成消耗。如果必须砍产出采用「渐进式降低」而不是「一刀切」比如每周降低 5% 掉落给玩家适应期。同时观察在线时长、副本参与率等指标如果下降超过 10% 就要回调。5.5 VBA 模拟器的死循环与性能问题现象模拟器跑了几秒钟还没出结果Excel 卡死。原因战斗循环没有设置最大回合数限制双方血量都无法归零时进入死循环。解决在 Do While 循环里加一个回合计数器超过 1000 回合强制退出并记录为「平局」。另外1000 次模拟如果每次都要读写单元格速度会非常慢应该把数据存在数组里最后一次性写入单元格。6. 进阶技巧用 Python 复现 Excel 数值表并做批量验证笔试里的 Excel 题在实际工作中往往需要批量处理比如「用 VLOOKUP 查 1000 行配置表」在 Excel 里下拉公式就行但如果要「对 100 个技能做伤害公式的批量验证」Python 的 pandas 会比 Excel 快得多。我一般会这样把 Excel 里的数值逻辑搬到 Python 里import pandas as pd import numpy as np # 模拟技能配置表 skills pd.DataFrame({ skill_id: range(1, 101), base_damage: np.random.randint(50, 200, 100), atk_ratio: np.random.uniform(0.8, 1.5, 100), def_ignore: np.random.uniform(0, 0.3, 100) }) # 模拟角色属性 hero_atk 500 enemy_def 200 # 批量计算伤害 skills[final_damage] ( skills[base_damage] hero_atk * skills[atk_ratio] - enemy_def * (1 - skills[def_ignore]) ).round(0) # 筛选伤害超过阈值的技能 high_damage skills[skills[final_damage] 600] print(f伤害超过 600 的技能数量: {len(high_damage)}) print(high_damage[[skill_id, final_damage]].head(10))这段代码的逻辑是先用 pandas 建一个模拟的技能配置表包含基础伤害、攻击加成比例、防御忽略比例三个参数然后批量计算每个技能的最终伤害最后筛选出伤害超过阈值的技能。参数说明base_damage 是技能基础伤害atk_ratio 是攻击力加成系数def_ignore 是防御忽略比例。实际做数值验证时我会把 Excel 里的配置表导出为 CSV用 pandas 读进来做批量计算再把结果写回 Excel 做对比。这样既能利用 Python 的批量处理能力又能保留 Excel 的可视化优势。验证方法上我一般会做「双端对照」同一组数据在 Excel 里用公式算一遍在 Python 里用代码算一遍如果结果一致说明逻辑没问题如果不一致就逐行排查。这个习惯帮我抓过好几次公式引用错误——Excel 里下拉公式时区域偏移了肉眼很难发现但 Python 批量计算的结果会直接暴露差异。从那以后我每次做数值表都强制走一遍「Excel 公式 Python 批量验证」的双端对照宁可多花半小时也不想到上线后才发现某一行公式引用错了。希望帮到你。本文还有配套的精品资源点击获取