2048 的最佳纪录为什么不随新局清零:一次浏览器实测
单文件小游戏有两种时间尺度:本局分数只属于当前对局,最佳纪录则希望在新局甚至刷新页面后仍能看到。我检查了《2048·数字漫游》的实际代码,并在 Edge 打开本地 HTML,验证这两种状态是否真的分开。
页面启动时尝试读取浏览器存储;读取失败就保留初始的 0:
let board = [], score = 0, best = 0, previous = null;
try {
best = Number(localStorage.getItem('number-odyssey-best')) || 0;
} catch {}
每次渲染会用本局分数更新最佳纪录,再尝试写回存储;新开一局只重置棋盘、本局分数和撤销快照:
best = Math.max(best, score);
try {
localStorage.setItem('number-odyssey-best', String(best));
} catch {}
function restart() {
board = Array(16).fill(0);
score = 0;
previous = null;
spawn();
spawn();
render();
}
我在一个全新的浏览器上下文打开页面,初始显示本局 0、最佳 0,棋盘有两个非空格。为隔离随机合并过程,我在页面调试环境把本局分数设为 64,然后调用原有 render();页面和 localStorage 都变成 64。这一步是构造状态测试,并不是声称手动玩到了 64 分。
接着调用原有 restart():本局回到 0、最佳仍是 64,棋盘重新生成两个数字,“撤销一步”被禁用。刷新页面后,本局依然是 0,最佳仍从存储读回 64。这个结果说明“重新开始”和“刷新页面”各自重置的范围不同,最佳纪录没有误绑在本局状态上。
还有一个容易忽略的边界:浏览器可能拒绝存储访问。我在第二个独立浏览器上下文中让 Storage.getItem() 和 Storage.setItem() 抛错,再打开同一 HTML。页面仍显示 16 个棋盘格、两个初始数字、本局 0 和最佳 0,也没有未捕获的页面异常。try/catch 让游戏在存储不可用时仍可启动;此时最佳纪录自然无法跨刷新保存。
这次验证只覆盖本地浏览器中的状态切换和存储异常,没有修改已发布页面,也没有测试不同浏览器之间的数据同步。对前端小游戏来说,先列清哪些状态属于“本局”、哪些需要“跨局保存”,再分别测试新局、刷新和存储失败,能比只盯着正常计分更快发现状态边界问题。
- 点赞
- 收藏
- 关注作者
评论(0)