当前位置: 首页 > news >正文

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. 悔棋适配:标记自动跟随历史记录移动

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

http://www.cnnetsun.cn/news/3265587.html

相关文章:

  • 如何安全合规地进行微信数据备份:开源工具合规使用终极指南
  • 位置智能:从“知道你在哪里“到“理解空间“的范式跃迁
  • 3分钟掌握:如何在Draw.io中用代码生成专业图表
  • 2026 年最佳智能笔记本推荐:各类型产品特点与适用人群全解析
  • 生命涌现的小龙虾技能之【Elderly Toilet Time Abnormal Detection (>30 min) | 老年人如厕时间异常(超30分钟)识别】简介
  • Excel常见函数、常见操作记录
  • 从电视盒子到全能服务器:Armbian系统在Amlogic设备上的完全指南
  • 2026年最新靠谱英语教学软件推荐 避坑帮你筛掉90%鸡肋工具
  • Agentic AI 的预算,不能只花在模型上
  • League Akari:英雄联盟玩家的智能效率管家
  • 如何用Video2X将老旧视频一键修复成高清画质?完整教程指南
  • LiDPM:重新思考点云补全的 Point Diffusion
  • 终极Windows应用程序兼容性修复指南:VisualCppRedist AIO一站式解决方案
  • 告别风扇噪音!用FanControl打造静音高效的电脑散热系统
  • 终极Rust学习工具指南:如何高效完成100个Rust练习
  • 终极指南:如何用5款免费开源工具彻底清理你的Mac系统
  • 百度网盘SVIP破解插件:Mac版终极加速指南
  • 河道流量监测不用下水!雷达水流测速仪非接触测流更安全
  • CentOS 7 一键部署 Zabbix 监控平台实战指南
  • (4-4)
  • Chrome-Charset终极指南:3分钟解决网页乱码的完整方案
  • openLCA:企业碳足迹管理的开源技术架构与实施路径
  • CSS相关内容(七)
  • 顺序表-线性表
  • git 本地上传远程
  • SLAM | 欧拉角与四元数
  • AI写歌用什么App好?2026国产商用软件推荐测评
  • 终极指南:3分钟掌握国家中小学智慧教育平台电子课本解析工具
  • Fast-GitHub:国内开发者必备的GitHub加速神器,下载速度提升60倍
  • AI硬件瓶颈转向内存带宽:HBM与3D架构如何重塑加速器设计