news 2026/7/7 1:26:16

HarmonyOS 小游戏《对战五子棋》开发第9篇 - GomokuEngine核心引擎设计(四):悔棋功能与历史记录管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS 小游戏《对战五子棋》开发第9篇 - GomokuEngine核心引擎设计(四):悔棋功能与历史记录管理

悔棋是棋类游戏的标配——history数组的力量

截图如下:

undo方法完整解析

undo():boolean{// 1. 检查是否有棋可悔if(this.history.length===0){returnfalse;}// 2. 弹出最后一步constlastMove=this.history.pop()!;this.board[lastMove.row][lastMove.col]=EMPTY;// 3. 切换回上一个玩家this.currentPlayer=this.currentPlayer===BLACK?WHITE:BLACK;// 4. 重置游戏状态this.result=GameResult.PLAYING;// 5. 更新lastMoveif(this.history.length>0){constprev=this.history[this.history.length-1];this.lastMove=newMove(prev.row,prev.col);}else{this.lastMove=null;}returntrue;}

悔棋的核心步骤

步骤1:空历史检查

if(this.history.length===0)returnfalse;

没有落子记录时不能悔棋。

步骤2:撤销棋子

constlastMove=this.history.pop()!;this.board[lastMove.row][lastMove.col]=EMPTY;

pop()移除并返回数组最后一个元素。!是非空断言——因为我们已经检查了length > 0

步骤3:切换玩家

this.currentPlayer=this.currentPlayer===BLACK?WHITE:BLACK;

悔棋后,当前玩家变回之前落子的玩家——因为那步棋被撤销了。

步骤4:重置游戏结果

this.result=GameResult.PLAYING;

即使之前已经分出胜负,悔棋后游戏重新进入PLAYING状态。这是一个重要的设计决策——允许在游戏结束后悔棋继续游戏。

步骤5:更新lastMove

if(this.history.length>0){constprev=this.history[this.history.length-1];this.lastMove=newMove(prev.row,prev.col);}else{this.lastMove=null;}

如果还有历史记录,lastMove指向倒数第二个落子;否则置为null。

history数组的多重作用

  1. 悔棋功能history.pop()撤销最后一步
  2. 空棋盘判断history.length === 0等价于棋盘为空
  3. 手数统计history.length就是当前手数
  4. 复盘功能(未来扩展):可以回放整个对局

UI层的悔棋控制

// TwoPlayerPage中Button('悔棋').enabled(this.moveCount>0&&this.result===GameResult.PLAYING).onClick(()=>{this.undo();})privateundo():void{this.engine.undo();this.refreshBoardData();}

UI层通过enabled控制悔棋按钮的可点击状态——只有手数>0且游戏进行中才允许悔棋。

AI对战中的悔棋问题

本项目在AI对战模式中没有提供悔棋功能。如果需要实现,需要撤销两步(玩家+AI):

// 假设的AI悔棋逻辑privateundoInAIBattle():void{this.engine.undo();// 撤销AI的落子this.engine.undo();// 撤销玩家的落子this.refreshBoardData();}

对比其他撤销方案

方案1:history数组(本项目)

  • 优点:简单直观,O(1)撤销
  • 缺点:需要额外的内存存储历史

方案2:保存棋盘快照

// 每次落子前保存棋盘副本constsnapshot=this.board.map(row=>[...row]);snapshots.push(snapshot);// 悔棋时恢复this.board=snapshots.pop();
  • 优点:可以撤销到任意状态
  • 缺点:内存开销大(每次保存整个棋盘)

方案3:命令模式

classPlaceCommand{execute(board){/* 落子 */}undo(board){/* 撤销 */}}
  • 优点:扩展性强,支持复杂操作
  • 缺点:过度设计

本项目选择了最简单有效的方案1。

总结

悔棋功能的实现展示了history数组的多重价值——它不仅是悔棋的基础,还是手数统计和空棋盘判断的依据。一个好的数据结构设计可以让多个功能自然涌现。

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

合肥注意力不集中挂什么科医院评价

开篇说明本文仅输出合肥地区儿童注意力相关问题的就诊选型通用方法,不针对任何医疗机构做排名评分、不做定向产品推荐,所有判断维度均参考国内儿科领域公开权威规范制定。通用选型标准(占比40%)本部分所有规则均采用行业统一公开要…

作者头像 李华
网站建设 2026/7/7 1:21:59

华为海思 2025 秋招技术面复盘:3 轮面试 5 大高频考点与 1 个 CDC 难题解析

华为海思2025秋招技术面深度解析:从高频考点到CDC难题实战当芯片设计领域的金字塔尖企业华为海思启动秋招时,数以万计的微电子专业学子将目光聚焦于此。这场技术角逐不仅考察基础知识的扎实程度,更检验解决复杂工程问题的能力。本文将系统拆解…

作者头像 李华
网站建设 2026/7/7 1:21:03

Halcon 20.11 图像采集错误 5312 排查:3步解决相机初始化失败

Halcon 20.11 图像采集错误 5312 排查:3步解决相机初始化失败工业视觉系统中,Halcon与工业相机的稳定连接是确保图像采集质量的关键环节。当遇到错误代码5312("Image acquisition: device cannot be initialized")时&am…

作者头像 李华
网站建设 2026/7/7 1:16:04

在PC上体验Switch游戏的完整指南:Ryujinx模拟器深度解析

在PC上体验Switch游戏的完整指南:Ryujinx模拟器深度解析 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 你是否曾梦想在个人电脑上畅玩《塞尔达传说:王国之泪》…

作者头像 李华
网站建设 2026/7/7 1:15:23

革命性个人数据主权方案:WeChatMsg完整技术解析与实践指南

革命性个人数据主权方案:WeChatMsg完整技术解析与实践指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…

作者头像 李华