site logo

Marico's space

使用 PHP 和 JavaScript 开发 IQ 测试平台时学到的经验

前端技术 2026-07-23 14:49:02 7

把一个能跑的Web项目变成用户爱不释手的产品,这中间差着十万八千里。

做"测试中心"这个项目时,最初的想法很简单:做个轻量平台,让用户不用注册就能测认知能力、直接在浏览器里玩智力游戏。

但项目越做越大才发现,光展示题目、做几个游戏远远不够。用户流程、移动端适配、分数安全、游戏难度和页面性能,这些东西的重要程度一点都不亚于游戏本身。

这篇聊聊项目里踩过的坑和总结的经验。

让用户触达测试要尽可能简单

最初的设计里,用户要这样走:点首页按钮→看介绍页→再点开始→到输入名字页→再点"开始测试"。

技术层面这个流程没问题。但从用户角度看,同样的操作重复了三遍。

这次改动让我重新认识到一个朴素的道理:

每次额外的点击,都是在给用户放弃的机会。

如果某个页面真不是必须的,与其把它设计得更漂亮,不如直接删掉。

为什么选 PHP 和原生 JavaScript

项目跑在共享服务器上,轻量化是刚需。搞大型框架或者强制构建流程有点杀鸡用牛刀。

最终的技术栈是这样的:

  • 后端用 PHP
  • 游戏逻辑用原生 JavaScript
  • 公共头部、底部、音效、排行榜组件用 PHP 片段
  • 分数和游戏数据走后端 API
  • 各页面自己的 HTML、CSS、JavaScript

这种方案最大的好处是部署简单。改完直接上传到服务器,不用装依赖。

缺点也明显:如果公共组件划分不合理,相似代码会在不同游戏里反复出现。所以我只把真正需要共用的部分抽到公共文件里,游戏特有的逻辑留在各自页面。

智力游戏本质上是小型状态机

做游戏容易陷入视觉设计的坑。但真正的难点在于把游戏的所有状态理清楚:

  • 游戏开始前哪些按钮是可用的?
  • 非法操作怎么处理?
  • 撤销功能影响分数还是步数?
  • 刷新页面后玩家能从断点继续吗?
  • 游戏结束后还接受新输入吗?
  • 触屏和鼠标行为一致吗?

拿"画线拼图"举例,玩家要用一条不间断的线填满所有格子,同时按正确顺序经过带数字的点。

PC上一直按住鼠标很费劲,所以我加了个功能:点击同一行或同一列的远端格子时,中间的有效格子自动填充。规则没变,但操作友好多了。

这个小改动在不降低游戏难度的前提下,减少了操作成本。

难度不只是棋盘大小的事

最初的做法是:关卡越高,带数字的点越少。我以为减少提示就等于增加难度。

但实际上点多了也可能把路线锁定在更多必经检查点上。这种情况在某些谜题里反而让高密度数字更难设计。

所以我换成了混合机制:

  • 棋盘从5×5起步,最大到8×8
  • 同一棋盘尺寸内,点密度有高有低
  • 后期把3到9之间的密度混着来
  • 每七关把各种密度轮一遍
  • 同一密度的关卡不会连续出现

这样玩家猜不出下一关会是什么样子。程序生成内容里,光有随机性不够,可控的多样性才能做出平衡。

客户端提交的分数不能直接信

浏览器里的游戏,所有逻辑都暴露在用户眼皮底下。想改随时能改。所以只接收 JavaScript 传来的分数是不行的。

后端必须做这些验证:

  • 游戏ID用白名单校验
  • 检查难度值是否在允许范围内
  • 为每个游戏设定合理的分数区间
  • 拒绝不合理的完成时间
  • 按用户或IP限流
  • 写入排行榜前清理输入

休闲游戏平台把所有游戏逻辑在后端重跑一遍可能过度设计。但几个低成本的校验就能挡住大部分自动刷分。

核心原则很清晰:

客户端负责用户体验,数据该不该收由服务端说了算。

移动端体验不该是后期补丁

大部分游戏都是手机用户在玩,把桌面设计简单缩小根本不够。

移动端需要单独处理这些:

  • 游戏区域按屏幕宽度缩放
  • 控制按钮别被步数、时间显示遮住
  • 触控目标要足够大
  • 文字和图标对齐方式要一致
  • 弹窗别超出屏幕边界
  • 滑动翻页别和游戏操作冲突

响应式设计不是写个 width: 100% 就完事了。内容怎么排、用户手指能伸到哪,这些都要想。

性能优化不一定需要大架构

项目里做的几个简单优化:

  • 字体从本地服务器加载,不用第三方服务
  • 大图转成 WebP 格式
  • 屏幕下方的图片懒加载
  • 公共 CSS 文件保持精简
  • 不用多余的 JavaScript 库
  • 图片指定宽高属性
  • 首屏不需要的资源延迟加载

每项单独看都是小优化。但在移动网络下,加起来效果很明显。

SEO 和用户体验不矛盾

给搜索引擎写内容时,容易犯的错是把同样信息翻来覆去放不同盒子里。

我的做法是:

  • 每页一个清晰的主标题
  • 直接回答用户的搜索意图
  • 显示内容和结构化数据保持一致
  • 同类型页面标题风格统一
  • 不让用户在不必要的中转页干等
  • 游戏下方认真写规则和玩法说明

现在项目提供:无需注册的 IQ 测试、即时出结果界面,还有针对不同能力的浏览器智力游戏。

明确说明在线测试不能替代专业或临床评估,也是建立用户信任的重要一环。

从这个项目学到的核心经验

总结几条最重要的:

  1. 能跑的用户流程不等于好的用户流程
  2. 随机生成不控制就会打破难度平衡
  3. 移动端操作要单独设计,不能照搬桌面
  4. 客户端提交的分数没有直接可信的
  5. 小性能优化叠加起来效果惊人
  6. SEO内容如果不能真正回答用户问题,写再多也没用
  7. 让玩家留在游戏里的不只是难度,还有持续变化的新鲜感

后续还会继续做新游戏机制、优化评分系统和提升无障碍支持。

你们做浏览器游戏时怎么管理游戏状态和程序化难度的?欢迎评论区交流。