单文件2048实战:把合并规则、手机操作和部署验证分开检查

举报
yd_248677698 发表于 2026/10/22 02:00:49 2026/10/22
【摘要】 从单文件2048出发,检查合并规则、无效移动、手机手势与本地最高分;补充免费沙箱和Flexus持久化部署、公网哈希核验及官方活动提交结果。文章由AI辅助编写,代码、页面与平台验收分别记录。

一个2048小游戏很适合练习从代码生成到部署验证的完整流程:页面不大,但合并顺序、无效移动、手机手势和部署状态都有值得检查的边界。本文结合一次实际生成与本地验证过程,说明如何组织一个不依赖构建工具的版本。示例由AI辅助编写,测试与下面列出的验证范围分开记录。

1. 先把交付物缩小到一个HTML

将CSS、JavaScript全部放进index.html,不引用外部字体、统计脚本和CDN。这样保存文件后即可离线打开,也能直接交给静态服务器托管。这个选择不代表所有项目都应当单文件化;它适用于这种界面和逻辑都较小的练习。

界面只保留标题、当前分数、最高分、重新开始按钮、4×4棋盘及结束遮罩。棋盘用CSS Grid排列,宽度使用100%并设置最大宽度,避免在手机上固定为桌面尺寸。我分别检查了1280×900和390×844两个视口,确认棋盘、分数和按钮在这两个尺寸下可以完整显示。两种尺寸的预览不能代替真实手机上的触摸验收。

2. 一行合并的关键:本次生成的数字不能再次合并

可以先独立处理朝左的一行,再通过读取和写回行、列来处理其他方向。下面的函数不修改传入数组,返回新的一行及增加的分数:

function mergeLine(line) {
  const values = line.filter(value => value !== 0);
  const result = [];
  let gained = 0;
  for (let i = 0; i < values.length; i++) {
    if (values[i] === values[i + 1]) {
      const merged = values[i] * 2;
      result.push(merged);
      gained += merged;
      i++;
    } else {
      result.push(values[i]);
    }
  }
  while (result.length < line.length) result.push(0);
  return { row: result, gained };
}

例如,[2,2,4,0]应得到[4,4,0,0],而不是[8,0,0,0]。因为第一个4是本次移动刚生成的,不能再与原有的4连锁合并。[2,2,2,2]则应该得到[4,4,0,0],本次增加8分。

不要只凭肉眼玩几次就认为这一层正确。至少把全空、无法合并、多个连续相同数字、不同方向以及不修改输入数组的情况列入断言。

3. 无效移动不能生成新方块

一次操作可以按下面的顺序组织:复制棋盘,读取各行或各列,执行合并,写回新棋盘,再比较新旧棋盘是否变化。只有真的发生移动或合并时,才增加分数并随机生成一个新方块。

如果玩家按了一个没有作用的方向键,还继续生成新方块,棋盘会被无故填满。这个问题可能被“页面能运行”的检查漏掉,却会直接影响游戏规则。

判断游戏结束时,也不能只看棋盘是否填满。棋盘有空格时仍可移动;没有空格时,还要检查横向和纵向是否存在相邻相同数字。达到2048的提示与“没有合法移动”的结束状态也应分开处理。

4. 手机手势和最高分存储都要有边界

手机操作可在棋盘上记录touchstart与touchend的坐标差,根据绝对位移较大的轴判断方向,并设置最小位移,避免轻触被误判成滑动。真实设备还需要测试页面滚动、误触和快速连续滑动。本次只验证了手势处理逻辑,尚未把它算作真实手机触摸通过。

最高分可以保存在浏览器本地。读取和写入应放在try/catch中:即使存储不可用,游戏也应当还能开始、移动和重新开始。最高分只是本地记录,不应为此添加账号、收集身份资料或引入服务端接口。

5. 把“本地可运行”与“云端已上线”分开

这次独立检查覆盖了初始16格棋盘、键盘合并和方向、重新开始、触摸合并,以及导出文件没有外部请求或平台预览包装代码。代码生成工具另外报告了规则断言,但工具报告与独立检查应分别保留,不能混成一次验收。

随后尝试免费沙箱部署时,连接接口先后返回HD.99008001(Invalid EVS create request)和HD.99003001(No available node pool);官方体验版入口也提示后台资源不足。因此,此时准确的记录是“草稿与本地检查完成,云端部署未完成”,而不是“上线成功”。这里没有转去创建收费资源。

等沙箱恢复后,还需要检查公开地址可以访问、返回的是本次游戏内容、键盘操作有效,再提交活动成果。最后查看活动状态和积分明细,确认是否真正通过及到账。一个可访问链接,也不能自动证明活动已经验收。

这个练习最有价值的部分,是为每一步建立清楚的完成证据:代码生成、规则检查、界面预览、云端可达、活动验收,各自对应不同结果。把这些边界记清楚,下一次遇到失败时就更容易从正确的位置继续。

2026-10-22 更新:两个部署环境已完成,活动验收仍未通过

后续复用了账号已有的免费容器,沙箱静态服务部署完成;同一份游戏也已在原有广州Flexus L实例上做持久化部署。本轮没有新建收费服务器,新增现金支出为0元。代码与部署脚本由AI辅助准备,工具连接和独立验收分别记录。

公开源码与部署说明 已补充维护中的长期体验入口,见仓库README。这是轻量静态演示服务,游戏不要求登录或填写个人资料。沙箱链接有有效期,因此持续访问采用原有服务器。

验收没有停在“工具报告成功”:分别从公网下载文件,确认9667字节及SHA256 0f92a47530dc893dd5e219ef602641af78807f739e35a1fb96af87a4353b9ece,与已检查的HTML一致;另外在浏览器打开沙箱页面,实际用方向键合并,分数从0变为4。服务器使用独立systemd服务保持运行,静态目录只读,并设置资源上限。

提交官方沙箱关卡时,后台弹窗返回“活动不存在或已结束”。因此目前能确认的是两处部署成功,不能确认活动已经结束的具体原因,也不能声称官方闯关通过。独立刷新积分明细后,未见沙箱/ECS关卡奖励。其他赛事积分单独核验,不视为本次闯关完成。这里保留了失败结果,没有继续重复提交或为奖励另购资源。

这个后续结果再次说明:页面可达、内容一致、交互有效、服务持久化和官方验收是不同的检查项,应该分别给出证据。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。