HarmonyOS7应用《拼棋派对》实战:跳棋星形棋盘与连续跳跃
把一枚棋子从底营送到对面,跳棋的乐趣在于寻找能连续利用的落点。《拼棋派对》的双人跳棋使用121个星形点位,支持相邻移动、越子跳跃和同一枚棋子的连续跳。它与象棋最大的数据差别,是棋盘不能用完整矩形网格表示。
本文从星形坐标讲到回合控制,再通过8子局的实际操作观察连跳。示例对应主应用1.0.19,在HarmonyOS7、API26手机模拟器运行。规则分析来自 GameLogic.ets,页面交互来自 Index.ets。
本文目录
用轴坐标组织星形点位
项目使用q、r两条轴定位点位。中央区域遍历q和r的-4到4,保留 Math.abs(q + r) <= 4 的点;六个三角营地通过旋转坐标补齐。中央61点加上六个10点营地,得到121个点。
CheckersStarCell 的id用来索引棋子数组,q、r用来判断方向和绘图,camp标记底营归属。A、B仅占相对的两个营地,另外四个营地仍是可用棋盘区域。点位身份与屏幕位置分开后,窗口变化不需要改写规则数组。
绘制时,页面把轴坐标投影到百分比位置:
private checkersPointXPercent(cell: CheckersStarCell): number {
return 50 + (cell.q + cell.r / 2) * 7;
}
private checkersPointYPercent(cell: CheckersStarCell): number {
return 50 + cell.r * 5.7;
}
这组系数是当前棋盘的视觉参数,外层宽高比为1.12。计算点击组件左上角时,还要从中心减去热区半径。不要把百分比直接当作像素,也不要按UI树出现顺序推断逻辑id;星形点位的生成顺序与从上到下的视觉顺序不同。
相邻走与越子跳共用六个方向
轴坐标中的六个方向是 [1,0]、[0,1]、[-1,1]、[-1,0]、[0,-1]、[1,-1]。沿一个方向走一格,可以找到相邻点;走两格,可以找到跳跃目标。
getCheckersValidMoves 的处理是:相邻点存在且为空,加入走步目标;相邻点有棋子,再检查同方向两格处是否存在且为空。被跨过的棋子可以是任何阵营,不会从盘面移除。跳棋的跳跃不是吃子。
专用于连续跳的 getCheckersJumpTargets 只收集跳跃目标,关键条件如下:
const middleIndex = findCheckersStarCellIndex(
point.q + direction[0], point.r + direction[1]);
const jumpIndex = findCheckersStarCellIndex(
point.q + direction[0] * 2, point.r + direction[1] * 2);
if (middleIndex >= 0 && jumpIndex >= 0 &&
cells[middleIndex].length > 0 && cells[jumpIndex].length === 0) {
result.push(jumpIndex);
}
坐标查询返回-1代表棋盘外。先检查存在性再读取数组,避免星形外沿访问无效位置。连跳阶段只调用跳跃目标函数,不把普通一步移动混进剩余目标。
连续跳需要锁住当前棋子
一次移动成功后,页面复制盘面,把当前玩家写入目标位置,清空起点,再检查是否到达胜利条件。如果这一步是跳跃,且目标处仍能继续跳,就保留当前玩家与选中棋子:
if (isCheckersJumpMove(sourceIndex, index) &&
getCheckersJumpTargets(this.checkersCells, this.checkersCurrent, index).length > 0) {
this.checkersSelectedIndex = index;
this.checkersTargetIndexes = getCheckersJumpTargets(
this.checkersCells, this.checkersCurrent, index);
this.checkersChainMode = true;
return;
}
this.advanceCheckersTurn();
这里不能移动完就无条件换人。checkersChainMode 表示这名玩家仍在操作同一枚棋子:点击另一枚己方棋子不会换选,点击当前棋子也不会取消。用户只能继续点合法跳跃目标,或主动结束连跳。
advanceCheckersTurn 统一切换A/B,清空选择、目标列表和连跳标志。把这些状态集中处理,可以避免换人后仍残留上一位玩家的金色落点。
落点提示与回合结束
每个点位都是可点击的Stack,空点也保留热区。选中状态用阵营边框表示,可落位置显示金色圈。提示按钮在未选子时找到一枚有合法目标的己方棋子;已有选子时,说明当前金色落点。
连跳期间,主按钮显示“结束连跳”,调用 finishCheckersChain。只有处于连跳且未结束的局面,才允许通过它换人。正常回合不能靠按钮任意跳过,这与“下一点位”类工具有不同语义。
当前每执行一次移动都会增加checkersMoves。连续跳两次会增加两手,手数并非双方轮流行动的回合数。文章和战绩解释需要保留这一区别。
模拟器中的连跳操作
从对局目录进入棋类游戏,选择“双人跳棋”,使用8子配置并重开。本次选择索引112的A棋子,跳到70,再沿原路径跳回112,最后点击“结束连跳”。页面转到玩家B,重开则恢复玩家A先行。
这个例子展示了连跳状态的保留,也暴露一个当前规则边界:系统没有记录本回合已访问点,所以允许跳回刚刚离开的空位。跳跃次数增加了,但棋子可以回到原处。若希望限制回跳,可以在连跳开始时创建访问集合,每一步加入落点,再从后续目标中过滤已访问位置。
本次取证还观察到,部分点位操作后标题和主按钮没有立即同步刷新,点击提示后会显示当前连跳状态。演示中的提示操作因此保留;这属于页面刷新问题,不能只凭棋子位置变化就认定全部UI已通过验收。
胜负条件与规则边界
6子、8子、10子配置决定双方初始数量。isCheckersWin 统计对方底营中属于当前玩家的棋子数,达到对应数量即获胜。目标是占据对方营地,不要求每枚棋子到某一个固定点。
本次验证选择、跳跃、连跳结束与重开,没有走完整盘抵达对方底营。胜负说明来自源码;后续回归应补目标营地计数、连跳中认输和切难度重置。若进一步完善规则,还需要明确回跳、进入其他营地和阻塞对方营地的处理方式。
源码入口:common/GameLogic.ets 的 getCheckersValidMoves、getCheckersJumpTargets、isCheckersWin;pages/Index.ets 的 handleCheckersTap、finishCheckersChain 与 CheckersStarPoint。参考HarmonyOS官方文档。下一篇进入记忆翻牌,处理延迟回盖与回合锁定。
更多推荐


所有评论(0)