1. 拆解这场笔试的真实面目1.1 为什么游戏公司的笔试和互联网大厂完全不是一回事聊到游戏公司的校招笔试很多人第一反应是拿它跟常规互联网大厂的算法卷子做对比然后得出一个差不多的结论。我当年也是这么想的直到真正坐下来做完那套题才发现方向完全跑偏了。游戏业务本身对实时性、内存布局、渲染管线、数学基础的要求跟做后台服务、做数据管道是两套逻辑。后台可以容忍几十毫秒的延迟游戏里一帧只有16.6毫秒的预算超了就是掉帧玩家立刻能感知到。这种差异会直接反映到笔试卷子的构成上。具体到这场笔试它的题型分布大致是选择题计算机基础数学图形学常识、编程题2到3道难度中等偏上、以及少量游戏场景相关的应用题。选择题里会混入概率论、线性代数、几何运算的题目编程题则偏爱模拟、贪心、动态规划、图论这些方向而且题干经常包装成游戏里的具体场景比如技能冷却、掉落概率、寻路、碰撞检测。你要是一看到游戏两个字就慌其实没必要剥掉包装后内核还是那些经典算法。我个人的判断是这场笔试真正想筛的不是你刷了多少题而是你在有限时间内把一个问题抽象成可计算模型的能力。这一点在后面几节我会用具体例子展开。1.2 适合谁来参考这份记录如果你属于下面几类人这篇内容对你会有直接帮助准备投递游戏研发岗客户端、服务端、引擎、图形方向的在校生想提前摸清笔试的题型和难度已经刷过一些常规算法题但不确定游戏公司笔试差异在哪里的同学想了解游戏行业技术栈对基础能力要求边界的转行者单纯对一场真实笔试长什么样好奇的技术爱好者。需要说明的是下面涉及的所有题目场景、数据、代码都是我基于这类笔试的常见套路做的合理还原和演绎不是对原题的逐字复刻目的是让你理解解题思路和背后的知识结构而不是背答案。这一点很重要因为笔试题目每年都在变背题没有意义掌握方法才是关键。2. 笔试整体结构与时间分配策略2.1 题型分布与分值权重先给一张我整理的结构表让你对整场考试有个全局感。这类笔试通常时长在120到150分钟之间题量不算特别大但每道题都不轻松。题型大致数量分值占比建议用时核心考察点单选/多选15-20题30%25分钟计算机基础、数学、图形学常识编程题2-3题55%80分钟算法设计、代码实现、边界处理应用题/简答1-2题15%20分钟游戏场景建模、逻辑推理这张表最关键的信息不是分值而是时间分配。我见过太多人栽在选择题上纠结一道概率题纠结了十分钟结果编程题没时间写完。选择题单题分值低遇到卡壳的果断标记跳过把时间留给编程题这是铁律。2.2 时间分配的底层逻辑为什么编程题要占掉一大半时间因为编程题是按测试用例给分的哪怕你写不出最优解暴力解法能过一部分用例也能拿分。而选择题是零和博弈对就是对错就是错投入产出比在难题上极低。我的建议是把整场考试切成三段第一段前25分钟快速扫完所有选择题会做的直接选不确定的标记完全不会的蒙一个先过。目标是清空选择题。第二段中间80分钟主攻编程题。先读所有编程题按有把握→有点思路→完全没思路排序从最有把握的开始写。每道题先写暴力解保证有分再优化。第三段最后15分钟回头处理标记的选择题检查编程题的边界条件空输入、单元素、极大值。提示很多笔试系统会在最后5分钟弹提醒别指望那5分钟能救场真正的检查要在第三段一开始就做。2.3 一个容易被忽略的准备动作考前一定要熟悉你所用编程语言的输入输出模板。游戏公司笔试经常用牛客、赛码这类平台输入格式可能是多组测试数据、可能带奇怪的换行如果你平时刷题都用LeetCode那种只写函数体的模式到了笔试现场光处理输入就能耗掉你十分钟。我建议考前把常用语言的快读模板默写一遍Python用sys.stdin.read().split()C用scanf或自定义快读Java用BufferedReader。这个动作看着小实战里能救命。3. 选择题里的高频考点拆解3.1 数学与概率游戏数值的底层语言游戏行业对数学的偏爱是刻在骨子里的。掉落概率、暴击期望、伤害公式、随机数分布这些全是数学。选择题里出现概率题的频率极高而且往往包装成游戏场景。举个典型例子某装备每次强化成功概率为p失败则等级不变问从0级强化到n级的期望次数。这本质是一个几何分布的期望求和问题。单次从k级到k1级的期望次数是1/p所以总期望是n/p。但题目往往会加干扰条件比如失败会掉级这时候就变成了马尔可夫链或者更复杂的递推需要用状态转移方程来解。再比如伤害期望题一个技能有30%概率造成双倍伤害70%概率造成普通伤害问期望伤害倍率。答案是0.3×20.7×11.3倍。这种题不难但要在几十秒内算对靠的是熟练度。我的经验是概率题先判断它属于哪一类模型几何分布、二项分布、期望的线性性、全概率公式。大部分游戏概率题都能归到这几类里。期望的线性性尤其好用很多看似复杂的期望问题拆成独立事件求和就迎刃而解。3.2 图形学与几何区分度最高的一块图形学常识是游戏岗笔试的分水岭。非图形方向的候选人可能完全没接触过但题目又不会出得太深通常停留在向量运算、矩阵变换、坐标系、光照模型的层面。常见的考点包括向量点乘与叉乘的几何意义点乘判断夹角和投影叉乘判断左右手方向和面积。题目可能问给定两个向量判断第三个点是否在它们构成的三角形内答案就是用叉乘的同号性判断。齐次坐标与变换矩阵为什么用4×4矩阵表示3D变换因为平移无法用3×3矩阵的线性变换表示必须升维到齐次坐标。这个为什么经常被考。MVP变换流程模型矩阵→视图矩阵→投影矩阵每一步在做什么顺序能不能换。答案是顺序不能随意换因为矩阵乘法不满足交换律。深度测试与Z-Fighting为什么远处的面会闪烁怎么缓解。这些知识点如果你系统学过一遍图形学入门课应付选择题绰绰有余。没学过的话考前花两小时把向量和矩阵变换这一块补一下性价比极高。3.3 计算机基础别在送分题上丢分操作系统、网络、数据结构的基础题属于送分题但每年都有人在这里翻车。高频考点集中在进程与线程的区别以及游戏里为什么多用线程池TCP与UDP的取舍游戏实时同步为什么偏爱UDP低延迟丢包可容忍自己实现可靠性内存对齐与缓存友好为什么遍历二维数组要按行优先哈希表的冲突处理开放寻址vs链地址法。这些题不难但要求你答得快。我的做法是考前把这几块的核心结论过一遍形成条件反射考场上不假思索就能选。4. 编程题实战从暴力到最优的完整推演4.1 第一类模拟题——耐心比聪明更重要模拟题是游戏笔试的常客因为它最贴近真实业务逻辑。题目通常描述一个游戏机制让你按规则一步步模拟出结果。这类题没有巧妙的算法考的是你把规则翻译成代码的准确度和对边界的把控。我拿一个典型场景来推演假设有一个技能系统玩家有若干技能每个技能有冷却时间技能释放有优先级问在给定时间轴内技能的实际释放序列。这种题的坑在于冷却是从释放时刻开始算还是从释放结束开始算同一时刻多个技能就绪按什么优先级时间轴是离散的还是连续的我的处理套路是先把规则用自然语言逐条列出来再逐条翻译成代码。不要一上来就写先花三分钟把规则理清楚把边界情况时间轴起点、终点、技能同时就绪想明白。模拟题丢分几乎全丢在边界上而不是逻辑主干。代码结构上我习惯用一个事件驱动的循环维护一个当前时间每次找出下一个状态变化点技能就绪、冷却结束推进时间到那个点处理事件。这样比按最小时间单位逐帧模拟效率高得多也不容易漏事件。# 模拟题通用骨架伪代码风格 def simulate(skills, timeline): current_time 0 events [] # 优先队列按时间排序 while current_time timeline: # 找到下一个事件时间 next_time get_next_event_time(events) current_time next_time # 处理所有在该时刻发生的事件 process_events_at(current_time) return result注意模拟题一定要自己造几组小数据手算一遍跟代码输出对比。我吃过亏逻辑看着对跑出来差一个数最后发现是冷却计算的起始点搞错了。4.2 第二类动态规划——识别状态是核心难点DP题在游戏笔试里出现频率很高因为很多游戏问题天然适合DP背包装备选择、路径计数地图走法、区间DP技能连招最优解。DP题的难点从来不是写代码而是定义状态和推导转移方程。我总结了一个识别套路如果题目问的是最优值或方案数且问题可以拆成前i个元素的子问题那大概率是DP。拿一个游戏场景举例玩家有n个技能每个技能消耗法力值、造成伤害法力值上限为M问如何选择技能使总伤害最大。这就是0-1背包的变体。状态定义dp[i][j]为前i个技能、消耗法力不超过j时的最大伤害转移方程dp[i][j] max(dp[i-1][j], dp[i-1][j-cost[i]] damage[i])空间优化成一维后def max_damage(skills, M): dp [0] * (M 1) for cost, damage in skills: for j in range(M, cost - 1, -1): dp[j] max(dp[j], dp[j - cost] damage) return dp[M]这里有个极易出错的细节一维DP的内层循环必须倒序。为什么因为正序会导致同一个技能被重复使用变成完全背包。这个点我在笔试里错过一次后来每次写背包都条件反射检查循环方向。4.3 第三类图论与搜索——寻路问题的常客游戏里的寻路、连通性判断、最短路径都是图论题的来源。笔试里常见的是BFS求最短路、DFS求连通块、拓扑排序偶尔会有Dijkstra。BFS的模板要背熟尤其是网格图上的BFS因为游戏地图大多是网格。关键点用队列存待扩展节点用visited数组防重复记录步数时可以在队列里存(x, y, step)也可以分层处理记录当前层节点数方向数组dx, dy处理上下左右或八方向。from collections import deque def bfs(grid, start, end): rows, cols len(grid), len(grid[0]) visited [[False] * cols for _ in range(rows)] q deque([(start[0], start[1], 0)]) visited[start[0]][start[1]] True dirs [(0,1),(0,-1),(1,0),(-1,0)] while q: x, y, step q.popleft() if (x, y) end: return step for dx, dy in dirs: nx, ny x dx, y dy if 0 nx rows and 0 ny cols \ and not visited[nx][ny] and grid[nx][ny] ! 1: visited[nx][ny] True q.append((nx, ny, step 1)) return -1这个模板看着简单但边界判断的顺序很关键。我习惯把越界判断放在最前面短路求值能避免数组越界。另外visited标记要在入队时做不是出队时做否则同一个节点可能被多次入队队列爆炸。4.4 暴力解与最优解的取舍艺术笔试和平时刷题最大的区别是笔试有时间压力能过用例就是好代码。我见过太多人死磕最优解结果时间不够连暴力解都没写出来一分没拿。正确的策略是先写暴力解保证基础分再考虑优化。比如一道题n的范围是10^5暴力O(n²)只能过30%用例但你先把这个30%拿到手再去想O(n log n)的解法。哪怕最后没优化出来你也有30%的分比0分强太多。判断要不要优化看数据范围。n≤1000O(n²)可能够n≤10^5必须O(n log n)或O(n)n≤10^6只能O(n)。这个对应关系要形成直觉。5. 应用题与场景建模拉开差距的地方5.1 游戏场景建模题的解题框架应用题通常给一个游戏设计需求让你分析技术方案或设计数据结构。这类题没有标准答案考的是你的思维是否结构化、是否考虑了工程约束。我总结了一个四步框架明确需求边界这个系统要支持多少玩家实时性要求多高数据量多大拆解核心模块把大问题拆成数据存储、逻辑计算、通信同步几个部分。给出方案并说明取舍为什么选A不选BA的代价是什么。指出潜在瓶颈和优化方向这是加分项体现你有工程视野。举个例子题目问设计一个排行榜系统。你不能只说用排序要考虑到数据量大时全量排序不可行用堆维护Top K实时更新频繁时用跳表或有序集合跨服排行榜要考虑分片和合并。把这些层次说出来分数自然高。5.2 如何展示你的思考过程应用题是过程分大于结果分的题型。哪怕你的方案不是最优只要推理链条清晰、取舍有理有据也能拿高分。我写这类题的习惯是先写一段需求分析把题目里的隐含约束挖出来再写方案设计分点列出每点配一句理由最后写权衡与风险主动指出方案的不足。这种结构化的表达阅卷人一眼就能看到你的思路比一大段散文式的回答强得多。6. 常见问题与避坑实录6.1 笔试现场的高频翻车点下面这张表是我和身边人踩过的坑整理出来给你避雷问题现象根本原因应对方法编程题本地能过提交全WA输入格式没对齐多组数据没循环读考前默写IO模板注意多组测试选择题超时在难题上死磕标记跳过最后回头DP题答案差一点循环方向错、边界没初始化手算小数据验证模拟题漏事件边界时刻没处理事件驱动明确时间点定义代码写完没时间检查时间分配失衡预留15分钟检查6.2 几个反直觉的实战技巧技巧一编程题先写注释再写代码。把思路用注释列出来再逐条实现。这样即使写到一半卡住你的思路也在不会全盘崩溃。而且注释本身能帮你发现逻辑漏洞。技巧二不确定的题先提交一版。很多平台支持多次提交取最高分。先交一版保底再慢慢优化。别等到最后才交万一系统卡顿或者时间到了没交上哭都来不及。技巧三读题读两遍尤其是数据范围。数据范围直接决定你能用什么算法。我见过有人没看范围上来写了个O(n²)结果n是10^5直接超时。读题时把范围圈出来写在草稿纸上。技巧四善用草稿纸画图。图论题、几何题画个图比在脑子里想快十倍。笔试一般允许用草稿纸别浪费这个资源。提示如果笔试平台有保存草稿功能编程题写到一半可以先保存避免意外断网丢失代码。这个习惯能救你一次。6.3 心态层面的经验笔试最大的敌人往往不是题目难度而是心态崩盘。一道题卡住后面全乱。我的做法是遇到卡壳的题深呼吸标记立刻跳到下一题。让大脑在别的题上后台运行一会儿很多时候回头再看思路突然就通了。这不是玄学是大脑的潜意识在继续处理问题。另外别把一场笔试看得太重。游戏公司笔试通过率本来就不高一场没过不代表什么。把它当成一次免费的模拟考考完复盘错题下一场就是进步。我认识的人里很少有人一场就过的都是考了几场才摸清套路。7. 考后复盘把一场笔试的价值榨干7.1 复盘的正确姿势考完别急着对答案然后忘掉。真正有价值的是复盘过程把没做出来的题记下来考后不限时重做一遍看是思路问题还是时间问题把做出来但不确定的题也记下来验证自己的解法是否真的正确统计各题型的失分分布找出自己的薄弱环节。我当年复盘时发现我的失分集中在图论和概率两块于是针对性补了一周下一场笔试这两块就没再丢分。复盘的价值就在这里它告诉你力气该往哪儿使。7.2 从笔试反推知识体系一场笔试其实是一张知识地图。它考什么说明这个岗位需要什么。把笔试涉及的知识点列出来对照自己的掌握情况你就能清楚地看到差距在哪。以这场笔试为例它涉及的知识点大致是算法DP、图论、模拟、数学概率、线代、图形学基础、计算机基础、工程思维。如果你发现自己在图形学上完全空白那就知道该补什么了。这种以考促学的思路比漫无目的地刷题高效得多。7.3 给后来者的几句实在话游戏行业的笔试难度是有的但没到高不可攀的地步。它的特点是广而不深要求你知识面宽但每个点不会挖得太深。所以备考策略应该是先铺面再补深把算法、数学、图形学、计算机基础这几块都过一遍形成基本盘再针对薄弱点深入。刷题要有针对性别盲目刷LeetCode Hot 100。游戏笔试的题型有自己的偏好多找游戏公司的历年真题网上有不少整理按题型分类刷效率更高。最后笔试只是第一关后面还有面试。笔试考的是你会不会面试考的是你懂不懂为什么。所以笔试阶段别只满足于AC多问自己几个为什么把每道题背后的原理搞透面试时你会感谢现在的自己。我在实际准备这类笔试的过程中最大的体会是方法比努力重要复盘比刷题重要。同样刷一百道题有复盘习惯的人进步速度是没有复盘的人的三倍。这个差距在几场笔试之后就会明显拉开。所以别急着刷下一套先把这一套吃透。
阅读完成 · 觉得有帮助?