news 2026/7/10 15:47:47

HarmonyOS 小游戏《对战五子棋》开发第25篇 - 最后一手标记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS 小游戏《对战五子棋》开发第25篇 - 最后一手标记

小细节大体验——棋盘上那些容易被忽略的视觉元素

标记截图:

星位:棋盘的"坐标参照物"

什么是星位

星位是棋盘上的特殊标记点,传统五子棋/围棋棋盘上有5个星位:

0 1 2 3 4 ... 7 ... 11 ... 14 ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ 3 │ │ │ ★ │ │ │ │ ★ │ │ ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤ 7 │ │ │ │ │ ★ │ │ │ │ │ ← 天元 ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤ 11│ │ │ ★ │ │ │ │ ★ │ │ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘

代码实现

conststars:number[][]=[[3,3],[3,11],[7,7],[11,3],[11,11]];ctx.fillStyle=STAR_COLOR;for(conststarofstars){constsx=halfCell+star[1]*cellSize;constsy=halfCell+star[0]*cellSize;ctx.beginPath();ctx.arc(sx,sy,3,0,Math.PI*2);ctx.fill();}

星位的作用

  1. 视觉参照:帮助玩家快速定位棋盘位置
  2. 美观性:增加棋盘的传统感
  3. 开局参考:天元(7,7)是常见的开局位置

星位坐标解析

  • [3, 3]:左上星位
  • [3, 11]:右上星位
  • [7, 7]:天元(中心)
  • [11, 3]:左下星位
  • [11, 11]:右下星位

这5个位置在15x15棋盘上呈对称分布,符合传统棋盘的美学。

星位半径

ctx.arc(sx,sy,3,0,Math.PI*2);

固定3像素半径——不随cellSize变化。这是一个设计选择:星位保持固定大小,在不同屏幕上视觉一致。

最后一手标记

代码实现

if(this.lastMoveRow>=0&&this.lastMoveCol>=0){constpx=halfCell+this.lastMoveCol*cellSize;constpy=halfCell+this.lastMoveRow*cellSize;ctx.strokeStyle=LAST_MOVE_COLOR;// #E63946 红色ctx.lineWidth=2;ctx.beginPath();ctx.arc(px,py,cellSize*0.16,0,Math.PI*2);ctx.stroke();}

设计要点

  1. 红色空心圆stroke()而非fill(),不遮挡棋子
  2. 半径cellSize * 0.16:比棋子(0.42)小得多,是一个小标记
  3. 线宽2像素:足够醒目但不粗糙
  4. 条件绘制lastMoveRow >= 0时才绘制

为什么用空心圆而非实心

实心圆(不推荐): 空心圆(本项目): ◯ ◯ ◉ ← 实心遮挡棋子 ◉ ← 空心不遮挡 ◯ ◯

空心圆画在棋子上面,但不遮挡棋子的渐变效果。

用户体验价值

在快节奏的对局中,玩家很容易忘记对手刚才下在哪里。最后一手标记解决了这个问题:

  • 双人对战:双方都能看到最后一步
  • AI对战:玩家能看清楚AI的落子位置
  • 悔棋后:标记移动到上一步位置

标记的更新机制

// ChessBoardView通过@Prop接收@ProplastMoveRow:number=-1;@ProplastMoveCol:number=-1;// 父组件更新privaterefreshBoardData():void{this.lastMoveRow=this.engine.lastMove?this.engine.lastMove.row:-1;this.lastMoveCol=this.engine.lastMove?this.engine.lastMove.col:-1;}

当引擎的lastMove变化时,父组件更新@Prop@Watch触发drawBoard()重绘,新的最后一手标记自动绘制。

悔棋后的标记

// GomokuEngine.undo()if(this.history.length>0){constprev=this.history[this.history.length-1];this.lastMove=newMove(prev.row,prev.col);}else{this.lastMove=null;// 没有历史时清除标记}

悔棋后lastMove指向倒数第二步,标记自动移动。如果悔到空棋盘,lastMove为null,标记消失(lastMoveRow = -1)。

drawBoard中的绘制顺序

privatedrawBoard():void{// 1. 清空画布ctx.clearRect(0,0,size,size);// 2. 绘制背景ctx.fillRect(0,0,size,size);// 3. 绘制网格线// 4. 绘制星位// 5. 绘制棋子// 6. 绘制最后一手标记 ← 最后绘制,在最上层}

绘制顺序决定图层:后绘制的在上方。最后一手标记最后绘制,确保它在棋子之上。

总结

星位和最后一手标记看似是小细节,但对用户体验有重要影响:

  1. 星位:传统棋盘的视觉参照,增加专业感
  2. 最后一手标记:红色空心圆,醒目且不遮挡
  3. 绘制顺序:标记在棋子之上,确保可见
  4. 自动更新:通过@Prop数据驱动,无需手动管理
  5. 悔棋适配:标记自动跟随历史记录移动

这些细节让游戏从"能玩"变成"好玩"。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 15:47:00

如何安全合规地进行微信数据备份:开源工具合规使用终极指南

如何安全合规地进行微信数据备份:开源工具合规使用终极指南 【免费下载链接】PyWxDump 删库 项目地址: https://gitcode.com/GitHub_Trending/py/PyWxDump 在数字化时代,个人数据管理变得至关重要,尤其是微信聊天记录等日常通信数据的…

作者头像 李华
网站建设 2026/7/10 15:45:18

位置智能:从“知道你在哪里“到“理解空间“的范式跃迁

位置智能:从"知道你在哪里"到"理解空间"的范式跃迁发布日期:2026年 关键词:位置智能、GeoAI、空间大模型、AI Agent、空间计算一、从"知道在哪里"到"理解空间":位置服务的范式跃迁 过去二…

作者头像 李华
网站建设 2026/7/10 15:41:38

3分钟掌握:如何在Draw.io中用代码生成专业图表

3分钟掌握:如何在Draw.io中用代码生成专业图表 【免费下载链接】drawio_mermaid_plugin Mermaid plugin for drawio desktop 项目地址: https://gitcode.com/gh_mirrors/dr/drawio_mermaid_plugin 你是否厌倦了在画布上手动拖拽每个元素来创建流程图&#xf…

作者头像 李华
网站建设 2026/7/10 15:40:40

2026 年最佳智能笔记本推荐:各类型产品特点与适用人群全解析

2026 年最佳智能笔记本推荐 我认为,数字笔记本能带来纸质笔记的触感,却没有纸质笔记的杂乱。它既适合设定目标、记录想法,也适合随手涂鸦。而且,对于重要会议和课程的笔记,有了数字备份后,跟进作业和项目变…

作者头像 李华
网站建设 2026/7/10 15:37:29

Excel常见函数、常见操作记录

一、匹配函数VLOOKUP的应用 VLOOKUP的四个参数的介绍: lookup_value:查找值。 table_array:查找范围,从查找值所在列开始框选,即查找范围第一列必须为查找值所在列数。查找范围需要进行固定,防止批量计算时…

作者头像 李华