文章目录
人工备注说明
- 开发工具GoLang + Claude Code + Doubao-Seed-2.0-Code模型;
- 这个项目使用Claude Code开发,大约半小时完成90%的代码,然后又花2小时让AI微调代码;
- 这篇文章也是使用Claude Code编写,手动调整格式;
- 这项目线上体验地址:https://www.pengyy.com/
作为一名开发者,我一直在探索如何更高效地构建 Web 应用。最近,我使用 Claude Code 开发了一个有趣的多人在线猜拳游戏(石头剪刀布)。这篇文章分享我用 Go 语言和 AI 辅助编程的开发经历。
1、项目概述
这是一个功能完整的多人猜拳游戏,支持:
- 2-10 人同时游戏
- 每回合 30 秒倒计时
- 实时游戏状态更新
- 玩家胜率统计
- 房间链接分享
- IP 地址脱敏显示
2、技术选型
2.1、后端:Go + Gin
选择 Go 是因为它的简单高效,Gin 框架则提供了快速的 HTTP 路由和中间件支持。
2.2、前端:jQuery + Bootstrap
使用简单成熟的技术栈,通过轮询实现实时状态更新。
3、项目架构
采用清晰的分层架构:
guess2/
├── main.go # 入口点、路由、定时任务
├── controller/
│ └── game_controller.go # HTTP 请求处理
├── service/
│ └── game_service.go # 核心业务逻辑
├── repository/
│ └── game_repository.go # 数据存储
├── models/ # 实体定义
│ ├── game.go
│ ├── player.go
│ ├── choice.go
│ └── game_status.go
├── dto/ # 数据传输对象
├── templates/ # HTML 模板
└── static/ # CSS/JS 资源
4、Claude Code 开发体验
4.1、从需求到代码
当我描述功能时,Claude Code 能够:
- 先读取现有项目结构
- 理解代码风格和模式
- 生成符合架构的实现代码
比如实现"再来一局"功能时,它自动在各层添加了对应的方法。
4.2、代码质量
生成的代码具有这些特点:
- 符合 Go 语言惯用法
- 错误处理完善
- 注释清晰
- 与现有代码风格一致
4.3、快速迭代
修改-测试循环非常快。发现问题时,直接描述问题,Claude Code 会定位并修复代码。
5、核心实现
5.1、游戏状态机
WAITING(等待玩家加入)
↓
PLAYING(游戏进行中)
↓
FINISHED(游戏结束)
↓
(可重启回到 WAITING)
5.2、定时任务设计
使用 Go 的 time.Ticker 实现两个关键定时任务:
go
func startScheduledTasks(gameRepo *repository.GameRepository, gameService *service.GameService) {
// 每 2 分钟清理过期游戏
cleanupTicker := time.NewTicker(2 * time.Minute)
// 每秒检查游戏超时
checkTicker := time.NewTicker(1 * time.Second)
for {
select {
case <-cleanupTicker.C:
gameRepo.CleanupExpiredGames()
case <-checkTicker.C:
for _, gameID := range gameRepo.GetPlayingGameIDs() {
gameService.CheckAndFinishGame(gameID)
}
}
}
}
5.3、前端实时更新
采用简单可靠的轮询方案:
javascript
const POLLING_INTERVAL = 800; // 每 800ms 更新一次
function startPolling() {
pollingInterval = setInterval(function() {
loadGameStatus();
}, POLLING_INTERVAL);
}
function loadGameStatus() {
$.ajax({
url: '/api/game/' + currentGameId + '/status/' + currentPlayerId,
method: 'GET',
success: function(response) {
if (response.success) {
updateGameUI(response.data);
}
}
});
}
5.4、胜负判定逻辑
go
func determineWinners(players []*models.Player) []*models.Player {
// 收集所有玩家的选择
choices := make([]models.Choice, 0, len(players))
for _, p := range players {
if p.Choice != "" {
choices = append(choices, p.Choice)
}
}
if len(choices) == 0 {
return nil
}
// 检查是否所有选择都相同(平局)
allSame := true
firstChoice := choices[0]
for _, c := range choices[1:] {
if c != firstChoice {
allSame = false
break
}
}
if allSame {
return nil
}
// 确定获胜的选择
winningChoice := findWinningChoice(choices)
// 找出选择了获胜选项的玩家
var winners []*models.Player
for _, p := range players {
if p.Choice == winningChoice {
winners = append(winners, p)
}
}
return winners
}
6、API 设计
| 端点 | 方法 | 说明 |
|---|---|---|
/ |
GET | 首页 |
/game/:gameId |
GET | 游戏房间 |
/api/game/create |
POST | 创建游戏 |
/api/game/:gameId/join |
POST | 加入游戏 |
/api/game/:gameId/start |
POST | 开始游戏 |
/api/game/:gameId/choice |
POST | 提交选择 |
/api/game/:gameId/status |
GET | 获取状态 |
/api/game/:gameId/restart |
POST | 重新开始 |
7、开发心得
7.1、AI 编程的优势
- 上下文感知 - Claude Code 理解整个项目,不会写出脱节的代码
- 快速原型 - 想法到可运行代码的时间大幅缩短
- 减少琐碎工作 - 样板代码、重复逻辑都可以交给 AI
7.2、需要注意的点
- 人工审查不可少 - AI 偶尔会在业务逻辑上犯错
- 测试要充分 - 自己多玩几局,能发现不少边界情况
- 保留 git 历史 - 方便对比和回滚
8、运行项目
bash
# 克隆项目后
go mod tidy
# 启动服务器
go run main.go
# 浏览器访问 http://localhost:8071
用户aa创建游戏

创建成功,可以把链接分享给好友

用户bb加入游戏

用户bb加入游戏后界面

用户aa开始游戏后界面

用户aa和bb游戏结束界面

9、总结
用 Claude Code 开发这个猜拳游戏是一次很棒的体验。它让我能专注于游戏逻辑和用户体验,而不是纠结于框架细节和样板代码。
Claude Code开发效率真的很高!
来一局吧!✊ ✌️ ✋