HarmonyOS7应用《拼棋派对》实战:成语消除的字块选择与关卡推进
一张字阵里出现两个“一”,玩家要按位置选择,连成“一心一意”。成语消除需要同时处理文字值、字块身份和连接路径,单纯保存四个字还不足以判断玩家究竟选了哪些格子。
《拼棋派对》使用关卡配置生成目标成语与字阵,玩家逐个点相邻文字,四字成词后自动判断。本篇在HarmonyOS7 API26手机模拟器中完成第1关,分析选择、消除、计分和解锁。示例为主应用1.0.19。
本文目录
目标词与字块位置分开
idiomTargets保存本关要找的四字词,idiomTiles保存棋盘每格的字,idiomMatched标记哪些位置已消除,idiomSelection保存正在连接的索引,idiomSolvedTargets记录已完成词。
两个相同汉字可以出现在不同位置。选择索引而不是字符,允许玩家使用两枚不同的“一”,也能禁止同一格在一条路径里反复使用。显示词通过选择索引依次读取字块内容拼接。
IdiomCampaign.ets 提供36关,分为三个章节。第1关是4×4、4组成语、78秒;后续关卡改变字阵规模和目标数。每个关卡的目标数量与时间应从配置读取,页面不应写死永远4组。
生成可连接的字阵
createIdiomBoardPath先生成横向或纵向蛇形路径:一行从左到右,下一行从右到左,保证相邻行交界处仍可连接。seed还可能反转整条路径。
目标成语逐字填到路径上,剩余空格再填入词库里的干扰字。下面摘录目标放置过程:
const path = this.createIdiomBoardPath(config.boardSize, seed);
let cursor = 0;
for (let targetIndex = 0; targetIndex < targets.length; targetIndex++) {
for (let charIndex = 0; charIndex < 4 && cursor < path.length; charIndex++) {
tiles[path[cursor]] = targets[targetIndex].charAt(charIndex);
cursor += 1;
}
}
从有效路径布置词,比完全随机撒字更容易保证本关可完成。不同目标占用不同格子,消除第一组成语不会破坏后面目标的预置路径。不过配置仍需保证目标总字数不超过字阵容量,否则cursor保护会截断后面的词。
选择路径与回退一字
handleIdiomTileTap拒绝结束局面、越界和已消除格。点已选中的最后一格会pop,回退一个字;点路径中间已选格不会把它重复加入。
相邻关系由行列判断:
return Math.abs(firstRow - secondRow) <= 1 &&
Math.abs(firstColumn - secondColumn) <= 1 && first !== second;
当前允许横、竖和斜向连接,共八邻域。操作脚本只使用正交路径也能完成首关,但文章不能把规则误写成“只能上下左右”。斜线看起来相邻,是否允许由这个函数决定。
新点与上一个点不相邻时只提示,不加入选择;达到四个索引后自动resolveIdiomSelection。选择到一半还没有构成一次成语尝试,因此不增加误点或得分。
四字完成后判断与计分
四字词必须属于idiomTargets,且尚未完成。成功后复制matched,将四个位置标记为消除,添加solvedTargets,增加连击并清空当前选择。全部目标完成才结束。
if (this.idiomTargets.indexOf(word) >= 0 && !this.isIdiomSolved(word)) {
const matched = this.idiomMatched.slice();
for (let index = 0; index < this.idiomSelection.length; index++) {
matched[this.idiomSelection[index]] = true;
}
this.idiomMatched = matched;
this.idiomSolvedTargets = [...this.idiomSolvedTargets, word];
this.idiomCombo += 1;
this.idiomSelection = [];
}
这是成功分支的状态节选。单人分数包含基础分、连击、章节和剩余时间;双人分数归当前玩家,使用另一套连击系数。失败增加mistakes、清零combo、清空选择;双人模式还切换行动方。
提示通过路径搜索找到一个尚未完成目标,标出可连字块,并扣次数。递归搜索拒绝已消除格和重复索引,所以它遵守与普通选择相同的路径约束。提示不是直接把目标加入solvedTargets。
星级和关卡推进
finishIdiomCrush把游戏转到结果阶段,停止计时,清除选择与提示。单人成功时计算星数并提交关卡进度;双人模式按比分结算,不沿用单人星级解锁。
最高星和最佳分使用Math.max,解锁范围也只向前:
stars[progressIndex] = Math.max(stars[progressIndex], this.idiomResultStars);
bestScores[progressIndex] = Math.max(bestScores[progressIndex], this.idiomScore);
const nextUnlocked = this.idiomLevel < IDIOM_LEVEL_COUNT
? this.idiomLevel + 1 : IDIOM_LEVEL_COUNT;
const unlockedLevel = Math.max(this.idiomProgress.unlockedLevel, nextUnlocked);
saveLocalData异步保存这些结果。页面显示通关和磁盘保存成功是两件事,当前调用的catch未展示错误,因此不能只凭结果页断言存储失败已得到完整处理。
第一关的消除效果
选择单人闯关、第1关“初见成语”。依次找到“一心一意”“画龙点睛”“春暖花开”“心明眼亮”。第一个词逐字高亮,第四个字后四格消除;进度逐组增加,最后显示通关结果。
本轮按当前可见字阵找路径,没有修改隐藏游戏状态。它验证正常连接与四组消除,未专门覆盖斜向路径、非相邻点击、错误成词和倒计时结束。这些边界可在后续按相同入口逐项补测。
这一玩法的基础是路径索引。把“词对不对”和“字来自哪些位置”同时保存,才能实现选择回退、已消除格禁用和可靠提示。下一篇的诗词填空则从位置路径转向答案槽顺序。
源码入口:pages/Index.ets 的 createIdiomTiles、handleIdiomTileTap、resolveIdiomSelection、findIdiomPathFrom 与 commitIdiomProgress;规则配置在 common/IdiomCampaign.ets。参考HarmonyOS官方文档。
更多推荐


所有评论(0)