HarmonyOS 数独小游戏开发手记:9×9 棋盘、实时冲突校验与分级题库的三板斧

举报
yd_266360277 发表于 2026/11/08 02:15:34 2026/11/08
【摘要】 把数独搬到 HarmonyOS 上,是一次覆盖 ArkTS 声明式 UI、状态管理、校验算法与题库组织的完整练手。本文拆解 9×9 棋盘 Grid 渲染、行列宫三线实时冲突校验、按挖空数量与唯一解分级的题库,并延伸到端云协同记账的端云分工思路。

引言

数独是一款规则极简、逻辑极深的游戏:9×9 的棋盘、1 到 9 的数字、行列宫三重约束。把它搬到 HarmonyOS 上,恰好是一次覆盖 ArkTS 声明式 UI、状态管理、算法与数据组织的完整练手。本文结合鸿蒙开发实践中心的数独小游戏案例,拆解三个核心环节:棋盘渲染、实时冲突校验与分级题库,并把经验延伸到端云协同应用的开发思路。

一、9×9 棋盘渲染:Grid 与状态驱动

数独棋盘最适合用 Grid 组件实现:9 列等宽布局,81 个 GridItem 各对应一个单元格。单元格是否可编辑(题目给定的数字锁定、玩家填入的数字高亮),全部由状态驱动。

@State board: number[][] = [] // 0 表示空格
@State selected: [number, number] = [-1, -1]

Grid() {
  ForEach(this.board, (row: number[], r: number) => {
    ForEach(row, (cell: number, c: number) => {
      GridItem() {
        Text(cell === 0 ? '' : cell.toString())
          .fontSize(22)
          .fontColor(this.isConflict(r, c) ? Color.Red : Color.Black)
      }
      .borderWidth(this.borderFor(r, c))
      .onClick(() => { this.selected = [r, c] })
    })
  })
}
.columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr')

两个细节决定体验:一是宫线,用 borderFor 给每 3 行、每 3 列的交界加粗边框,9 宫格一眼可辨;二是选中态,被选中的行、列与同宫格用浅色底区分,玩家不用数格子就能定位。状态变化后界面自动刷新,这正是声明式 UI 的价值:开发者只维护 board 这一份事实来源,渲染交给框架。

二、实时冲突校验:每次输入只算三条线

冲突校验不需要全盘扫描。玩家在 (r, c) 填入数字 v 后,只需检查三条线:同一行、同一列、同一个 3×3 宫,出现重复即为冲突,单元格标红并提示,不阻止继续思考,但阻止把错误答案当作完成状态提交。

isConflict(r: number, c: number): boolean {
  const v = this.board[r][c]
  if (v === 0) return false
  for (let i = 0; i < 9; i++) {
    if (i !== c && this.board[r][i] === v) return true
    if (i !== r && this.board[i][c] === v) return true
  }
  const br = Math.floor(r / 3) * 3, bc = Math.floor(c / 3) * 3
  for (let i = br; i < br + 3; i++)
    for (let j = bc; j < bc + 3; j++)
      if ((i !== r || j !== c) && this.board[i][j] === v) return true
  return false
}

校验函数保持纯函数、不写界面逻辑,才能被单元测试直接覆盖。完成判定也建立在同一套规则之上:棋盘填满且无任何冲突,才算通关;计时、错误次数与剩余提示数可以顺手记进同一局的状态里。

三、分级题库:难度来自挖空与唯一解

“简单、中等、困难”不是玄学,关键由两个量决定:挖空数量与求解难度。简单题挖空 35 个左右,中等 45 个上下,困难可到 52 个以上;更重要的是,每道题必须有唯一解。

做法是离线生成、运行时加载:先用回溯法生成完整终盘,再按难度随机挖空,每挖一格就用求解器验证是否仍唯一解,不满足就回填。题库按难度分文件存放为 JSON,放在 rawfile 中,运行时按玩家选择的难度加载;进阶做法是把题库放到云端按难度拉取,题库更新不用发版。

{ "level": "medium", "holes": 46, "puzzle": [[5,3,0,0,7,0,0,0,0]] }

四、好玩的细节:笔记、撤销与容错

决定一款数独“好不好玩”的往往不是主流程,而是细节:候选数笔记模式、撤销一步、错误三次提示、暂停计时。实现上,建议把“棋盘快照栈”与“笔记集合”从 board 中分离,撤销只恢复数据,界面随之重绘;提示功能用求解器算出当前格的正确值,但要限制次数,保留挑战性。

五、从数独到端云协同:以记账应用为例

数独是纯端侧应用,数据都在本地。但把思路推进一步,就到了鸿蒙开发实践中心 Lv.4 的端云一体案例——端云协同记账:账目上云,分类占比这类聚合计算放在云函数里算,端侧只带公开的项目 ID 调用云函数,数据库凭据只存在云函数环境变量里。

这条分界线值得借鉴:端侧管交互与即时反馈(数独的冲突校验就该在端侧实时做),云端管聚合、同步与多端一致。哪些逻辑放端侧、哪些收口云端,是做端云应用时最先要回答的问题。

六、用 AI DevSpace 提效的实测体会

这次开发我也在华为云 AI 开发者空间里做了体验:新建会话后,用自然语言描述“9×9 棋盘渲染、实时冲突校验、分级题库怎么做”,智能体直接给出了 Grid/GridItem 布局、@State 驱动刷新、行列宫三线校验、按挖空数量与回溯深度分级的题库方案,与本文的思路基本一致。把 Agent 的骨架当作起点,再按自己的需求改细节、补测试,比从零手写快得多;但校验逻辑这类核心算法,仍建议自己写一遍并补单元测试。

结语

数独虽小,五脏俱全:声明式 UI、状态管理、校验算法、题库数据组织,一样不少。跑通它之后,再去做端云协同记账、云同步待办这类 Lv.4 案例,会发现套路是相通的——先在端侧把体验做扎实,再把需要聚合与同步的部分收口到云端。建议读者按本文的顺序动手:先渲染棋盘,再写校验,最后接题库,每一步都能独立验证,成就感也是一步一台阶。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。