news 2026/6/15 8:02:38

全程用 AI 做一款商业级手游 · EP10 道具系统:让三个按钮真正改变棋盘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
全程用 AI 做一款商业级手游 · EP10 道具系统:让三个按钮真正改变棋盘

EP9 收尾复盘时,我留了一句诚实的话:游戏里那三个道具按钮——撤销 / 炸弹 / 换一换——UI 做好了、点了会扣计数、会响一声,但按下去棋盘根本没变。这是当时整个游戏唯一"按了没实际效果"的地方。这一集(EP10)回头把它补完,让它真正可玩到底。

道具是 Block Blast 这类游戏的重要付费/留存抓手(道具靠玩、连签、内购获得,EP5/EP6 已经把"怎么得到道具"做好了),但前提是道具得真的有用。三个道具,三种对棋盘的操作:

撤销:落子前留一张快照

撤销的本质是"把棋盘退回上一步"。做法是在每次成功落子(和每次炸弹)之前,给整盘 + 托盘 + 分数拍一张快照;撤销就是把快照贴回去:

int[,]_undoBoard;List<Piece>_undoTray;int_undoScore;bool_canUndo;voidSnapshot(){_undoBoard=Board.CloneCells();// 整盘拷一份_undoTray=newList<Piece>(Tray);_undoScore=Score.Value;_canUndo=true;}publicboolUndo(){if(!CanUndo)returnfalse;Board.LoadCells(_undoBoard);// 贴回去Tray.Clear();Tray.AddRange(_undoTray);Score.Value=_undoScore;GameOver=false;// 撤销能把你从死局里救回来_canUndo=false;// 一次只能撤一步returntrue;}

注意GameOver = false——撤销不只是反悔,它能从死局复活(这正是它作为付费道具的价值:卡死了,花一个撤销续命)。而且一次只能撤一步(_canUndo撤完即关),不能无限回退。

炸弹:点哪炸哪,清掉 3x3

炸弹给棋盘开一个BombArea,点中的格子周围 3x3 全清,返回清掉的数量:

publicintBombArea(intcx,intcy,intradius){intn=0;for(intx=cx-radius;x<=cx+radius;x++)for(inty=cy-radius;y<=cy+radius;y++)if(InBounds(x,y)&&_cell[x,y]!=0){_cell[x,y]=0;n++;}returnn;}

视图层把炸弹做成"两步":点道具按钮 → 进入"待引爆"状态(顶上提示"点击方块引爆")→ 再点棋盘任意格 → 引爆那一片。只有真炸到东西才扣道具(点空地不消耗),而且炸弹也留了撤销点(手滑了能撤回来)。

下面这两张是真机实拍——左边是道具操作前棋盘堆了一片,点炸弹、再点左下角,那一片 3x3 就被炸空了(填充数从 13 掉到 4,橙色迸裂粒子正好盖在炸空的那一片上):

换一换:重发一手新托盘

最简单的一个:当前三块不顺手,换一换重发三块新的(不可撤销,会清掉撤销点,并重判死局——万一换出来全放不下就是真死局了):

publicvoidRefreshTray(){DealTray();_canUndo=false;GameOver=!Board.AnyPlaceable(UnusedTray());}

顺手逼出一个真 bug

写自检的时候,单独跑这一集的道具测试是 16/16 全绿,但接在前面 9 集后面一起跑,就挂一条:「开局不可撤销」失败。

追下去是个真 bug:NewGame重置了棋盘、分数、死局标志,却没清撤销快照——所以开了新一局,_canUndo还是上一局最后一步留下的true,于是你能在新局里"撤"回上一局的棋盘。修复就一行,在NewGame里补上_canUndo = false; _undoBoard = null;

这种 bug 单测一个系统时根本暴露不出来——必须多个系统按真实顺序连起来跑才会浮出水面。这也是为什么我每加一集都把全部自检从头跑一遍,而不只跑新写的那几条。

验证:16 条断言 + MCP 真机三连点

逻辑层 16 条断言钉死:撤销还原棋盘/分数/托盘且一次性、炸弹清区域且空炸不消耗、炸弹可撤销、换一换重发满 3 块且清撤销点……

A 开局不可撤销 / 落子后可撤销 / 撤销还原棋盘(filled==0)/分数(==0)/托盘(3块) / 不能连撤两次 B 引爆已填格清掉东西(>0) / 填充数下降 / 炸弹可撤销 / 空炸清0 / 空炸不留撤销点 C 换一换后托盘满3块 / 换一换清掉撤销点 ==== 16/16 PASS ====

断言之外,还是老规矩——用 MCP 在真 PlayMode 里把三个按钮一个个点了一遍:

  • 撤销simulate_mouse_click)→ 顶栏分数从 23 退回 12,上一步消掉的方块全回来了,道具计数 17→16;
  • 炸弹→ 顶上弹出"点击方块引爆",再点棋盘 → 那片 3x3 炸空(上面两张截图);
  • 换一换→ 托盘三块瞬间换成全新的三块。

每一步都capture_game_view截图回看,确认棋盘真的按预期变了。三个按钮,从"按了没反应"变成"按了真改局面"。

撤销最商业的用法:死局复活

把撤销做对之后,顺手补上了一个真正用到它的地方——死局结算面板。原来死局只有一行"GAME OVER"文字,太糙。现在死局会弹一个结算面板:本局得分、最高分、新纪录标记,以及两个按钮——再来一局复活(用撤销)

"复活"就是撤销那条命脉的商业化用法:死局 = 上一步把自己堵死了,而落子前正好留了撤销快照,所以复活 = 消耗一个撤销道具 + Undo(),棋盘退回死局前、GameOver翻回 false,接着玩。这就是 F2P 里"卡死了花点东西续命"的钩子——道具的需求正是这么被设计出来的。死局广播也走事件总线(控制器Send(GameOverMsg)→ UI 弹面板),和前面所有系统一个套路。

我用 MCP 把这条也点了一遍:触发死局 → 面板弹出(带"★新纪录★")→ 点"复活" → 分数 25 退回 23、撤销 24→23、GameOver翻回 false、回到对局;再点"再来一局" → 空棋盘新开。

顺手把首页和局内分开 + 道具换成图标

对照成熟商业休闲游戏的通行结构后,又补了两处"正经游戏该有"的结构:

首页 / 局内分离。原来所有东西堆在一屏,现在是标准的"先首页、点开始才进对局":首页是个干净的大厅——标题、最高分、一个大大的"开始游戏",加上商城/每日/皮肤导航;点开始才进棋盘,局内左上角有"← 首页"随时退回。

道具按钮换成图标。原来是"撤销/炸弹/换一换"三个文字按钮,太工程师了。改成图标按钮——一张程序化生成的圆角光泽底,套上撤销(循环箭头)/炸弹/换一换(双向箭头)三个图标,右下角一个数量角标。一眼就懂、也更像那么回事:

这两处都是用 MCP 点着改、截图比着调出来的——首页点"开始游戏"进局内、点图标道具触发效果(撤销 score 10→7、道具数 35→34)、点"← 首页"退回大厅,全程simulate_mouse_click验证。

这一集的产物与诚实的话

  • BlockGameController加撤销快照/Undo/Bomb/RefreshTrayBoardModelCloneCells/LoadCells/BombAreaGameView接道具入口 + 炸弹"待引爆"交互。
  • 16 条断言全绿(修了NewGame不清撤销快照的 bug)+ MCP 真机三连点验证。
  • 死局结算面板(最终分/最高分/新纪录 + 复活/再来一局),死局走GameOverMsg事件广播,"复活"复用撤销道具。
  • 至此,游戏里再没有"按了没效果"的按钮,死局也不再是一行干文字。

诚实地讲:道具的玩法逻辑做完了,表现也接了一部分——炸弹引爆已经有迸裂粒子(复用 EP7 那套缓动 + 白色光泽方块碎片,和消行一个效果)。还差的是撤销的"方块飞回"动画、换一换的洗牌动效,这些纯 juice 是锦上添花(EP7 框架已备好,接上去就行),不影响"能不能玩"。功能闭环这一层,三个道具已经真正合上了。

  • 工具:funplay-unity-mcp
  • 开源工程:本系列做出来的完整 Unity 工程已开源
  • 上一篇:EP9 收尾与复盘
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 7:59:51

规范笔记(快速给ai用)

文章目录接口规范接口规范 都用post请求&#xff0c;json报文 请求地址格式如&#xff1a; /api/功能模块/增删改查 如用户模块&#xff1a; /api/user/query # 查询 /api/user/insert # 新增 /api/user/update # 修改 /api/user/delete # 删除

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

终极小说下载器完全指南:轻松下载全网小说,打造个人数字图书馆

终极小说下载器完全指南&#xff1a;轻松下载全网小说&#xff0c;打造个人数字图书馆 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 你是否曾因为网络不稳定而无法追更心爱的小说&…

作者头像 李华
网站建设 2026/6/12 7:17:42

Web品质——重要的HTML元素

Web品质——重要的HTML元素 随着互联网技术的飞速发展,网站已成为企业和个人展示形象、提供信息的重要平台。在众多的网站中,Web品质成为衡量网站优劣的关键指标。本文将深入探讨Web品质,并详细阐述在HTML元素中哪些是影响Web品质的重要因素。 1. HTML元素与Web品质的关系…

作者头像 李华
网站建设 2026/6/11 15:22:25

LPC185x系列MCU功耗与电气特性深度解析与设计实战指南

1. 从数据手册到设计实战&#xff1a;深度拆解LPC185x系列功耗与电气特性在嵌入式江湖里摸爬滚打十几年&#xff0c;我经手过的MCU项目少说也有上百个。从早期的8位机到如今复杂的多核异构系统&#xff0c;有一个话题始终是硬件和底层软件工程师的“必争之地”&#xff0c;那就…

作者头像 李华
网站建设 2026/6/12 8:25:55

终极指南:WeChatExtension-ForMac插件提升微信使用效率的完整方案

终极指南&#xff1a;WeChatExtension-ForMac插件提升微信使用效率的完整方案 【免费下载链接】WeChatExtension-ForMac A plugin for Mac WeChat 项目地址: https://gitcode.com/gh_mirrors/we/WeChatExtension-ForMac WeChatExtension-ForMac是一款功能强大的Mac微信插…

作者头像 李华
网站建设 2026/6/11 15:21:06

5分钟快速上手CodeIsland:安装配置与基础使用教程

5分钟快速上手CodeIsland&#xff1a;安装配置与基础使用教程 【免费下载链接】CodeIsland 项目地址: https://gitcode.com/gh_mirrors/co/CodeIsland CodeIsland是一款专为macOS动态岛&#xff08;Notch&#xff09;设计的实时AI编码代理状态面板&#xff0c;让你无需…

作者头像 李华