拼棋派对开发实战系列封面

成语通关解锁下一关,诗词收藏诗签,寻物重玩保留最快时间,这些成绩应当在离开页面后仍然存在。《拼棋派对》用本地Preferences保存设置、战绩和几类关卡进度。它没有账号或云端同步,页面内状态保留也不能等同于完整棋局持久化。

本篇核对1.0.19的 GameRecordStore.ets,结合本系列已经完成的关卡观察保存范围。演示使用本轮地图与结果截图;未把返回地图的检查称为杀进程恢复测试。

本文目录

先区分三种数据

第一类是偏好设置,例如音效开关、座位方向;第二类是长期成绩,例如战绩、星数、解锁关卡和诗签;第三类是当前对局的临时状态,例如象棋90点盘面或24点中间表达式。

GameLocalData保存前两类。ContinuationSnapshot只保存当前玩法、拼图配置、部分步数与时间等入口信息,并没有包含所有玩法的完整数组、历史和待执行动作。因此“本机接续”不能写成“所有棋局无损恢复”。

数据当前保存方式
音效与座位独立Preferences键
战绩列表序列化数组
成语、诗词、寻物进度各自模型序列化并归一化
接续入口与部分计数ContinuationSnapshot
全部棋盘与撤销历史不应由当前快照字段推断已保存

明确保存范围,比在界面上写一句“进度已保存”更重要。用户想知道关闭后还能继续什么,而不是存储API叫什么。

读取时归一化并提供默认值

loadGameLocalData用Promise.all读取多个键。关卡进度解析后分别调用normalize函数,确保解锁范围、数组长度和默认值满足当前版本需要。设置不存在时使用true或auto等默认值。

const values = await Promise.all([
  pref.get(RECORDS_KEY, ''),
  pref.get(BEST_SINGLE_STEPS_KEY, 0),
  pref.get(BEST_SINGLE_TIME_KEY, 0),
  pref.get(SOUND_ENABLED_KEY, true)
]);

这是实际读取列表的前四项节选。默认值描述新用户,也为缺少旧字段的版本提供回退。对象解析与归一化不能省略:磁盘上的字符串不一定具有当前接口要求的字段与有效数值。

当前外围catch返回整套默认数据。它能避免直接崩溃,但也可能掩盖某一个键损坏导致其他有效数据一起回退。若希望更细致恢复,可以按数据项分别处理,并保留可诊断的错误信息。

写入完成后flush

saveGameLocalData依次put设置、战绩、进度和接续快照,最后await pref.flush。对象和数组先JSON.stringify,基本数值和布尔值直接写入。

await pref.put(IDIOM_PROGRESS_KEY, JSON.stringify(data.idiomProgress));
await pref.put(POETRY_PROGRESS_KEY, JSON.stringify(data.poetryProgress));
await pref.put(HIDDEN_OBJECT_PROGRESS_KEY, JSON.stringify(data.hiddenObjectProgress));
await pref.put(SEAT_ORIENTATION_KEY, data.seatOrientation);
await pref.flush();

put与flush不是一回事,界面改了也不等于磁盘已完成持久化。需要在关键信息保存后正确等待,而不是关机前只发起一个没有等待的异步调用。

当前函数catch为空,没有把失败传给调用方。这样保存异常可能被静默吞掉,文章不能宣称已经有可靠的失败重试。更完善的做法是返回可观察结果、记录必要日志,再由产品决定提示或重试,避免每次点击都重复弹窗。

连续保存还有先后顺序问题。如果多个异步快照交错写入,旧数据可能晚于新数据落盘。后续可用串行保存队列或版本号处理,这属于改进方案,尚未在本轮接入。

战绩与最佳成绩的更新

createMatchRecord用时间与索引组合生成id,保存玩法、胜者、详情和时间。关卡进度则保留最高星数、最高得分或最短用时,而不是覆盖成最近一次成绩。

寻物本轮40秒完成,第1关此前最好11秒,因此地图仍显示11秒;成语完成首关后地图显示3星和最高关卡2;诗词八题后显示1/96通关和8张诗签。这些现象分别对应最佳值、解锁和收藏状态。

独立组件通过回调交给父页面保存。组件只知道进度改变,不需要持有主页面的存储对象。复用元服务时也更容易替换保存适配层。

效果与可靠性边界

成语和诗词完成后返回地图,观察星级、解锁与诗签变化

这组图展示本轮已发生的结果与返回地图。不同玩法按段展示,没有把它拼成一次连续点击。正常保存的完整验收还应包含:等待flush、关闭进程、重新启动、读取对应设置和进度,再核对内容。

同时应覆盖没有旧键、损坏JSON、保存失败、重复战绩、快速切换设置和版本新增字段。本轮不修改或清空用户数据来制造这些异常,相关边界保留为后续测试。

应用重装、清除数据和更换设备可能失去本机记录。当前没有账号与云服务,就应在说明中保持这个范围。接续字段的存在,也不代表实现跨设备流转。

源码入口:services/GameRecordStore.ets,以及主页面保存调用与各进度normalize函数。参考HarmonyOS官方文档。下一篇说明怎样把已有规则与页面复用到手机元服务。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐