我用AI做了一个3D六子棋游戏

不久前,发现 Gemini 3 Pro 的生成能力特别强,尤其是一些小游戏内容。

于是,我花了一个周末,用它和 Claude Code帮我做了一款3D六子棋小游戏。

它支持三种游戏模式:

  • 人机对战:选择不同难度的AI进对战
  • 本地对战:在一台电脑上进行双方对战
  • 在线对战:创建房间,邀请好友远程对战

由于国内对在线游戏版号具有严格限制,因此,该游戏选择在海外平台发布上线。

itch链接:https://zstar1003.itch.io/connect-6-master-3d

完整版链接:https://connect6.pages.dev

开源地址:https://github.com/zstar1003/Connect6

本文来复盘一下,这款游戏是如何一步步被做出来的。

动机

为什么要做这样一款游戏?

主要原因是我的舍友是个围棋爱好者,之前拉我对战。奈何本人水平太菜,屡战屡败。

既然围棋打不过,那就换种棋路。

一开始选择五子棋,但是五子棋先手优势太大,游戏很快就会结束,不耐玩。

为了让游戏进行得持久一些,我决定让AI把五子棋的规则拓展到六子。

项目初始化

有了这个想法后,在Aistudio中,用Build模式直接生成了一个雏形。

第一次生成的效果已经具备一定的游戏性了,但是缺陷也不少:

  • 棋子的形状不对,变成了一个球型
  • 棋盘的边角存在纹理闪烁
  • 游戏仅支持本地对决,AI功能有bug

迭代打磨了几轮,外观的问题基本解决了。

完善AI功能

把项目下载到本地,进一步通过Claude Code进行优化。

首先解决Gemini 3 Pro没做好的AI功能。

根据Claude的建议,AI采用了启发式算法进行构建。

AI需要根据当前的局面,计算相关位置评分,然后进行选择最佳落子位置。

整体的决策逻辑如下图所示:

位置的评分根据棋型来进行,具体规则如下:

做好AI功能后,我立刻开始了和AI"酣畅淋漓"的对决。

结果发现,当五子棋把胜利条件变成六子,胜利难度一下子高了亿点点。

当AI开始全力防守,把棋盘下满了也难分胜负。

修改游戏规则

游戏规则是策略游戏最难设计的一环,如果设计不当,会导致游戏可玩性大大降低。

因此,我搜索了相关资料,发现六子棋的规则已经被人发明出来,甚至还有国际性的标准赛事。

六子棋,又名连六棋(connect6),发明人为国立交通大学资讯工程系教授吴毅成[1]。

它的设计之初,是为了改良五子棋不加限制条件下"先手必胜"的不合理情况。

它的规则很简单:黑方第一手仅下一颗黑子,之后双方轮流每次各下两子,先连到六子的一方胜利。

于是,我让AI基于此规则再次调整代码。

改完规则后,我再次和AI下了几局,发现AI实在太强了,很难赢它。

于是我进一步让AI帮我做了一下难度分级,原始难度为困难难度,增加简单和中等两档难度,降低玩家挫败感:

  • 简单:70%随机下棋,30%智能选择
  • 中等:完整评估但添加20%随机变量
  • 困难:完整智能评估,无削弱

增加音效

为了让游戏更有沉浸感,我进一步让AI添加了以下三种音效:

  • 胜利音效:游戏胜利时播放的音效
  • 失败音效:游戏失败时播放的音效
  • 落子音效:落子时的音效,从三段中任选一段播放

音效素材我是从 pixabay[2] 上下载得到,该网站提供了诸多免费可商用的音效素材。

增加联机模式

想要让不同玩家在浏览器中进行实时通讯,最简单的方案就是采用WebRTC。

WebRTC(Web Real-Time Communication)是一个开源项目及浏览器/应用程序接口(API)框架,旨在通过浏览器或移动端实现实时通信(音频、视频、数据),无需用户安装额外插件或本地客户端。

AI推荐我采用PeerJS,它是一个基于 WebRTC 的 JavaScript 库,可以让功能开发起来更加容易。

AI帮我设计了以下连接架构:

后端分两个服务器:

  • PeerJS 服务器:用来同步不同玩家之间的游戏状态
  • 房间API服务器:用来提供匹配大厅的房间信息

完善这个之后,运行项目,局域网环境下的设备就可以正常进行联机了。

为了让玩家在公网中也能通讯,需要单独配置一台公网服务器做地址转发,以实现P2P打洞[3],后面我会详细介绍配置流程。

上传itch

itch[4]是国外的一个独立游戏分发平台,它支持玩家直接将游戏以网页形式进行发布。

在itch上发布游戏非常简单,首先填写一些基本信息,包括游戏名称/分类/定价/介绍图等

此外,还有一些额外选项,比如游戏启动方式设置全屏启动,移动端方式选择横屏,这样电脑端和手机端都可以有较好体验效果。

由于 itch 本身仅支持游戏的静态前端,而不包含服务端,所以联机功能没法奏效。

因此我在此特供版的游戏中,取消了联机功能的显示。

Cloudfare部署前端

为了完整部署联机功能,我采用了Cloudfare部署前端+云服务器部署后端的方案。

对于免费用户,cloudfare[5] 提供了每天10万次的页面访问额度,能够足够满足我这种小规模的应用场景。

在cloudfare部署前端很简单,只需要在Pages里面上传构建完的dist文件就可以了。

部署完之后,它会生成可访问的Url链接。此外,它支持多次上传不同的版本,可根据实际情况进行版本回退。

云服务器部署后端

在云服务器上部署后端采用以下步骤,具体的命令有点长,可参考项目仓库中的DEPLOYMENT.md文档。

首先,在云服务器上开放90009001两个安全组端口,防火墙对这两端口进行相应放行。

之后,安装Node.jsPM2

安装好后,使用 PM2 启动 PeerJS 服务器和房间 API 服务器。

然后安装NginxCertbot,用Let's Encrypt获取SSL证书。

最后,配置 Nginx 反向代理就可以了。

配置完毕后,就能和好友愉快地联机对决了。

经验总结

虽然我用AI帮我写了整个项目的全部代码,但是在实践过程中,还是有很多坑靠AI是无法一次性解决的。

下面进行具体复盘:

  • 1.联机游戏Bug
    这个游戏刚做完联机功能时,和室友测试了一下,发现存在了一个游戏bug,玩家1在落完一颗子后,玩家2竟然能立即落子,吞掉玩家1另一个落子机会。这个bug让策略游戏一下子变成拼手速游戏。发现后,才让AI进行修复。
  • 2.不要用 Workers KV
    一开始AI建议我采用Cloudfare的Workers KV去存储实时房间数据,这样就无需额外再部署后端服务器。但是实际发现,Cloudfare的这个免费额度太低,调试了一会就触发用量警告。
  • 3.房间轮询问题
    这个问题是和上一个问题同步发生的,AI一开始写的逻辑是:用户已启动就开始轮询房间信息,这样造成了很多资源无用消耗,后面我让它加了一个房间的刷新按钮,玩家点刷新之后再发请求。这种问题如果不是开发者去发现,AI很难自己意识到这种不合理的设计。
  • 4.cloudfare环境变量覆盖问题
    在cloudfare部署时,可以手动添加环境变量,但经实验发现,它会优先读取代码中.env.production的环境变量。如果在外部手动设置了相同名称的环境变量,会因覆盖问题无法生效。
  • 5.SSL配置经验
    Let's Encrypt可以免费为域名提供三个月的SSL证书,可以一行命令自动写入nginx配置,很方便。

失败的决战

最后,我和室友联机下了一把六子棋,我又凭实力输了。

我已经在考虑开发新游戏了。

参考

1\] https://zh.wikipedia.org/wiki/%E9%80%A3%E5%85%AD%E6%A3%8B \[2\] https://pixabay.com/sound-effects \[3\] https://webrtc.mthli.com/basic/p2p-hole-punching \[4\] https://itch.io/game/new \[5\] https://dash.cloudflare.com

相关推荐
guslegend2 小时前
第2章:AI大模型知识和SpringAI核心案例实战
人工智能
魔镜前的帅比2 小时前
Prompt 模板化设计(PromptTemplate)
人工智能·chatgpt·prompt
悦悦欧呐呐呐呐2 小时前
休闲摸鱼小游戏扫雷游戏|下载即玩
游戏
maray2 小时前
在 MacOS 场景下体验 seekdb embeded
数据库·人工智能·seekdb
WWZZ20252 小时前
快速上手大模型:深度学习11(数据增强、微调、目标检测)
人工智能·深度学习·算法·目标检测·计算机视觉·大模型·具身智能
大白IT2 小时前
第四部分:决策规划篇——汽车的“大脑”(第8章:行为决策——车辆的“驾驶策略师”)
人工智能·算法·机器学习
2501_941148153 小时前
人工智能赋能智慧城市互联网应用:智能交通、环境监测与公共服务优化实践探索》
人工智能
大白IT3 小时前
第二部分:感知篇——汽车的“眼睛”与“耳朵”(第5章:环境感知与理解——从“看见”到“看懂”)
人工智能·目标跟踪·自动驾驶·汽车
不知更鸟3 小时前
本地文档问答系统RAG全流程详解
人工智能