HarmonyOS7应用《拼棋派对》实战:诗词填空的题库与答题交互
“映日____别样红”,从同类词语里选出“荷花”,不需要键盘也能完成一次诗词填空。《拼棋派对》把诗句、空位、答案和干扰项组织为题目模型,再把选词、判题和换题放进独立组件。这一玩法既有单空,也有按顺序填写的双空。
本文从首关八题展开,介绍题库、答案槽和延迟换题的状态保护。环境为HarmonyOS7 API26手机模拟器,应用1.0.19。题目配置在 PoetryCampaign.ets,页面实现为 PoetryFillGame.ets。
本文目录
题目模型与关卡数量
PoetryQuestion包含id、chapter、category、line1、line2、answers、distractors、source和insight。source标明作品出处,insight解释诗意,避免玩法只剩机械判断对错。
PoetryCampaign配置96关,每关8题,分为8个章节、每章12关。章节内第1—4关使用4个候选,第5—8关6个,第9—12关8个。关卡数、题库总题数与每局题数是三个不同概念。
当前工程包含基础题和扩展题库,加载函数以Promise复用同一次读取。开始前ensureQuestionBankReady检查准备状态;未加载时先提示等待,失败时允许再次尝试。不能在异步题库尚未到位时读取空数组第一项。
getPoetryQuestionsForLevel按章节、题型和关卡位置取题。增加题库时需检查id唯一、诗句与答案对应、干扰项符合题类,以及作品出处和素材授权;生成脚本并不自动保证内容没有错字。
答案槽对应诗句占位符
诗句中的 {0}、{1} 对应answers数组的第0、1项。显示时用answerSlots替换,没有选择则显示空位。两个词都正确但位置颠倒,仍然不能通过逐槽比较。
for (let index = 0; index < answers.length; index++) {
const value = this.answerSlots.length > index &&
this.answerSlots[index].length > 0
? this.answerSlots[index] : '____';
result = result.replace(`{${index}}`, `〔${value}〕`);
}
这是renderPoetryLine的核心。模板与答案数量需要一起验证,否则多一个占位符可能一直不被替换,少一个则出现看不到却参与判断的空位。
prepareQuestion重置答案槽、已排除选项、错误词、正确词、解析状态和说明显示。每题重新设置answerEpoch,使上一题的延迟处理失效;它保留整场得分和剩余诗灯。
选词后自动判题
tapChoice先拒绝暂停、结束、已解决、已排除或已经在答案槽里的词。正常选择写入当前槽,没有指定槽时找到第一个空槽。填满后直接validateAnswer,不需要额外提交。
nextSlots[target] = choice;
this.answerSlots = nextSlots;
this.selectedSlot = this.firstEmptySlot(nextSlots);
if (this.selectedSlot < 0) {
this.validateAnswer();
}
双空题可点击答案槽选择填入位置,也可以交换已填词。判断按顺序逐个比较:
let correct = true;
for (let index = 0; index < question.answers.length; index++) {
if (this.answerSlots[index] !== question.answers[index]) {
correct = false;
}
}
这里是完整答案的相等判断,不是字符包含或模糊匹配。单空题点一次就判题,双空需要两个槽都满,界面提示应与这一区别一致。
答对换题,答错保留重试
答对后设置questionResolved,增加正确数和连击,按基础分、连击与诗灯计算分数。每连对5题获得护灯,随后720毫秒自动推进。
const epoch = this.answerEpoch;
setTimeout(() => {
if (epoch === this.answerEpoch) {
this.advanceQuestion();
}
}, 720);
等待期间questionResolved阻止再次选词,避免一次正确题连点多次计分。epoch防止旧题回调在重开或离开后推进新局。
答错增加mistakes、断连击并加入错题;有护灯则消耗护灯,否则减一盏诗灯。仍有灯时清空当前答案槽,保留同一题重试;三灯耗尽才失败。它与算术篇“答错也换题”的规则不同。
提示排除和诗意说明属于帮助功能。帮助并不等于答对;若把排除项写入答案槽,会跳过玩家选择并污染成绩。
暂停与进度的含义
诗词用开始时间、暂停开始时间和累计暂停时长计算elapsed,而不是简单每秒加一。恢复时把暂停区间加入totalPausedMs。显示刷新仍需要计时触发,但结果时间来自时间戳差。
答题入口检查paused,避免暂停后继续选词。已答对但等待自动换题时暂停,是另一条边界:回调当前只检查epoch,所以暂停与延迟推进的结合仍需专项验证,不能仅凭paused存在就认为所有异步路径都冻结。
正常完成首关进入结果,保存星数、最好成绩与解锁范围。错题与收藏按question.id记录,不能按本局题号保存:同一题可能出现在复习或其他会话中。
首关操作效果
进入古诗词填空,选择第一卷首关。按题面依次填写词牌,观察诗句空位、反馈、累计答对和连击;最后一题完成后查看结果。
首题“映日荷花别样红”说明单空题的路径:点“荷花”后正确词进入空位,短暂显示反馈,再载入下一题。页面不是独立路由跳转,当前组件中的questionIndex和题目状态共同更新。
本轮展示首关正常答题;双空交换、三灯失败、护灯挡错、错题复习和加载失败没有逐项实测。文章的功能说明来自源码,不把正常八题过程称为全部模式验收。
这一玩法的主要选择是把“题目内容”和“本局状态”分开。题库可以扩展,答案槽和判题仍使用同一流程;异步换题则通过epoch守住当前会话。下一篇用另一种数据转换讲1024数字合并。
源码入口:components/PoetryFillGame.ets 的 prepareQuestion、tapChoice、validateAnswer、resolveCorrectAnswer 与 resolveWrongAnswer;配置为 common/PoetryCampaign.ets。参考HarmonyOS官方文档。
更多推荐

所有评论(0)