15年老兵新传:我用 Go、WASM 和 LLM 开发了一款纸牌游戏
作为一名有15年经验的软件工程师,我突然意识到,自己从未真正从零到一开发并发布过一款游戏。
我从小在阿根廷长大,经常和朋友们玩纸牌。于是我决定,就从一款我们童年时最爱的纸牌游戏开始吧。
初次尝试:LLM 时代之前的独立开发
2024年6月,我利用业余时间开始开发一款名为 Truco 的纸牌游戏。作为一名资深的 Go 后端开发者,后端技术选型是显而易见的。真正的挑战在于前端 UI,以及如何找到一个无需付费服务器的长期托管方案。
那时 LLM 还没普及,所有细节都得亲力亲wai为。我花了大约三个月的时间,在不断的试错中才最终完成。
我从未想过要推广或盈利,只是想完成这个项目,或许能让一些人重温童年游戏的快乐。出乎意料的是,一年过去了,没有任何额外的推广,依然有人在玩这款游戏!
再次挑战:用 LLM 加速游戏开发
一年后,我回阿根廷探亲,并教会了我侄子玩 Escoba——这个国家第二流行的纸牌游戏(不管 ChatGPT 怎么说)。
随着 LLM 成为主流,我好奇用它来开发游戏能快多少。于是,我决定用 Escoba 来做个试验。
我克隆了 Truco 的后端代码,然后给 Claude 写了一个长长的 Prompt,详细解释了 Escoba 的游戏规则,并让它重构代码。结果令我大吃一惊,第一次尝试就几乎完美地完成了任务 😱。那一刻,我甚至开玩笑地想:我的工作要被取代了 😰。
唯一的 Bug 是它在一个地方错误地使用了 append,导致了状态突变(mutated actions)。除此之外,我只是锦上添花地增加了一些额外功能,比如一个更智能的机器人。
但前端开发就是另一回事了。我花了好几天才搞定。真正的挑战可能不完全在于 LLM,更多的是我有限的 React 知识,以及让一个黑盒 WASM 函数来管理游戏状态这种不寻常的架构。JavaScript 的调试过程也并不轻松。
实战指南:构建你自己的回合制游戏
看到这里,你可能也想亲手尝试一下。下面,我将为你提供一个极简的指南,教你如何使用这套技术栈(Go + WASM + React)来构建自己的游戏。为了方便上手,我创建了一个极简的井字棋(Tic-Tac-Toe)项目作为模板,你可以基于它开始。
1. 后端实现思路
一个回合制游戏的后端逻辑其实非常直接:
GameState结构体:定义一个包含所有游戏状态的结构体,例如棋盘布局、当前玩家、分数等。NewGame()函数:用于初始化游戏状态。ApplyAction()函数:接收玩家的动作(例如,点击棋盘的某个位置),更新GameState,并返回新的状态。
就是这么简单!
注意:这个架构非常适合人机对战(玩家 vs. Bot)。如果你想实现玩家对玩家的模式,就需要一个付费服务器来处理实时通信,这超出了本指南的范围。
2. 前端实现思路
前端的任务也同样简单明了:
- 根据后端传来的
GameState渲染游戏界面。 - 捕捉用户的输入(如点击),并将其作为“动作”发送给后端。
- 接收后端返回的新的
GameState,并更新界面。
3. Go 后端编译为 WASM
要将 Go 后端编译为 WebAssembly (WASM),你可以使用标准命令,但这会生成非常大的二进制文件,在移动设备上加载缓慢。为了优化体积,我强烈推荐使用 TinyGo。
编译前,你需要为前端调用的函数创建一个不同的入口点。可以新建一个 main.go 文件,通过构建标志(build flags)来保护它,并在这里导出你需要暴露给前端的函数。
别忘了在 main() 函数的末尾使用 select {} 来阻塞程序,防止它立即退出。
4. WASM 与前端的交互
WASM 无法直接序列化/反序列化 Go 的结构体(struct)。诀窍是把所有数据都通过 JSON 字符串来传递。在深入研究了 TinyGo 的文档后,我总结出了以下模式:
- Go 端:将
GameState结构体序列化为 JSON 字符串再返回给前端。 - JavaScript 端:将玩家的动作构造成 JSON 字符串,传递给 WASM 函数。
最后,在前端 JavaScript 中调用导出的后端函数,并用一个全局变量来追踪 GameState。
5. 自动化构建与本地测试
每次修改后端代码后,你都需要重新编译成 WASM 文件,并替换掉前端项目中的旧文件。为了简化这个流程,我把它写进了 Makefile。
编译后,别忘了将 wasm_exec.js 文件(Go SDK 提供)也一并复制到前端目录中。同时,在 HTML 文件的 <head> 中引入这个脚本。
这个方案在 Github Pages 上可以自动工作。但在本地开发时,你需要一个 HTTP 服务器来提供文件。你可以使用 http-server 这个工具,然后通过浏览器访问 http://localhost:8080 进行测试。
结语
开发这些游戏的过程充满了乐趣。我希望通过分享我的经验,能让你了解这套技术栈的运作方式,并激励你创造属于自己的游戏!
更多资源请访问 ai4.plus 或 kk4099.com。