Go 语言实现支持联网对战的斗地主游戏:真随机、无控牌、纯粹运气与技巧
标签: 开源项目 / Go / 游戏 / 斗地主 / WebSocket
原文: 微信公众号「码农先森」https://mp.weixin.qq.com/s/6F1em9c4JMZybVb9QVn8yQ
GitHub: https://github.com/palemoky/fight-the-landlord
核心亮点
一个真正公平的斗地主游戏 —— 无控牌、无算法操控、纯粹的运气与技巧。基于 Go 语言实现,支持联网对战、断线重连、排行榜等功能。
项目初衷
厌倦了商业斗地主游戏的控牌机制?
在某些知名斗地主游戏中:
- 新手/回归玩家刚开始获得好牌,营造"连胜"错觉
- 随游戏时间增长,牌质量明显下降
- 频繁匹配高段位玩家,快速输光豆子
本项目承诺:
| 承诺 | 说明 |
|---|---|
| ✅ 真随机发牌 | 每局洗牌完全随机,无任何控牌算法 |
| ✅ 公平匹配 | 不考虑胜率、段位、游戏时长,纯随机或房间匹配 |
| ✅ 开源透明 | 所有代码公开,欢迎审计和贡献 |
| ✅ 无内购无广告 | 纯粹的游戏体验,技巧决定胜负 |
核心理念:斗地主应该是运气与技巧的博弈,而不是算法与钱包的较量。
功能特性
| 功能 | 说明 |
|---|---|
| 🎯 实时对战 | WebSocket 实时通信,支持大规模并发对战(每局 3 人) |
| 🏠 房间系统 | 创建房间、加入房间、快速匹配 |
| 🔄 断线重连 | 网络波动时自动重连,游戏状态完整恢复 |
| ⏸️ 离线等待 | 对手掉线时暂停计时,等待重连 |
| 🏆 排行榜 | 积分系统、胜率统计、实时排名 |
| 📲 聊天系统 | 大厅聊天、房间快捷消息 |
| 🔒 安全防护 | 来源验证、速率限制、IP 过滤 |
| 🐳 容器部署 | Docker Compose 一键部署 |
| 🔄 优雅升级 | 维护模式 + 零停机发版 |
| ⚡ 流量优化 | Protocol Buffers + WebSocket 压缩,节省 60-80% 流量 |
| 🚀 性能优化 | sync.Pool 对象池复用,降低 GC 压力 |
| 📝 日志记录 | 文件记录,便于调试 |
快速开始
客户端安装
macOS / Linux:
curl -fsSL https://raw.githubusercontent.com/palemoky/fight-the-landlord/main/install.sh | bash
Windows (PowerShell):
irm https://raw.githubusercontent.com/palemoky/fight-the-landlord/main/install.ps1 | iex
运行客户端:
fight-the-landlord
服务端部署(Docker Compose)
# 1. 创建项目目录
mkdir fight-the-landlord && cd fight-the-landlord
# 2. 下载配置文件
curl -fsSL https://raw.githubusercontent.com/palemoky/fight-the-landlord/main/docker-compose.yml -o docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/palemoky/fight-the-landlord/main/.env.example -o .env
# 3. 启动服务
docker compose up -d
# 4. 停止服务
docker compose down
本地开发
# 1. 启动 Redis
redis-server
# 2. 启动服务端
go run ./cmd/server
# 3. 启动客户端(开 3 个终端)
go run ./cmd/client
配置说明
| 文件 | 用途 | 是否提交 Git |
|---|---|---|
config.yaml | 默认配置,本地开发 + Docker 基础 | ✅ 提交 |
.env | 环境特定配置,Docker 部署 | ❌ 不提交 |
.env.example | 环境变量模板 | ✅ 提交 |
配置加载优先级:环境变量 (.env) > config.yaml > 代码默认值
游戏玩法
游戏操作
| 阶段 | 操作 |
|---|---|
| 叫地主 | 输入 Y 叫地主,N 不叫 |
| 出牌 | 输入牌面,如 33344、345678、JQK |
| 不出 | 输入 PASS 或 P |
牌型示例
| 牌型 | 示例 |
|---|---|
| 单张 | 3, K, 2 |
| 对子 | 33, KK |
| 三张 | 333 |
| 三带一 | 3334 |
| 三带二 | 33344 |
| 顺子 | 34567(5 张+) |
| 连对 | 334455(3 对+) |
| 飞机 | 333444(2 连三+) |
| 飞机带单 | 33344456 |
| 飞机带对 | 3334445566 |
| 四带二 | 333345 |
| 四带两对 | 33334455 |
| 炸弹 | 3333 |
| 王炸 | 小王大王 |
积分规则
| 结果 | 积分 |
|---|---|
| 地主胜利 | +30 |
| 农民胜利 | +15 |
| 地主失败 | -20 |
| 农民失败 | -10 |
| 3 连胜加成 | +5 |
| 5 连胜加成 | +10 |
| 10 连胜加成 | +20 |
公平性保证
真随机发牌
使用标准 Fisher-Yates 洗牌算法:
// 洗牌实现
func (d Deck) Shuffle() {
rand.Shuffle(len(d), func(i, j int) {
d[i], d[j] = d[j], d[i]
})
}
发牌流程:
- 创建 54 张牌的标准牌组
- Fisher-Yates 洗牌算法打乱顺序
- 每位玩家 17 张,剩余 3 张作为底牌
- 无任何基于玩家数据的牌面调整
公平匹配
快速匹配:
- Redis 队列 FIFO 匹配
- 不考虑胜率、段位、游戏时长、账户余额
- 仅按进入队列的时间顺序匹配
房间匹配:
- 玩家自由创建或加入房间
- 完全由玩家控制,服务器不干预
架构亮点
| 技术 | 用途 |
|---|---|
| Go | 高并发服务端 |
| WebSocket | 实时通信 |
| Redis | 匹配队列 + 游戏状态存储 |
| Protocol Buffers | 流量优化 |
| Docker Compose | 一键部署 |
写在最后
这个项目的价值不只是"又一个斗地主游戏"——它用代码证明了公平游戏可以存在。真随机、无控牌、开源透明,让斗地主回归运气与技巧的本质。
如果你厌倦了被算法操控的游戏体验,或者想学习 Go 语言高并发 WebSocket 游戏开发,这个项目值得一看。
本文整理自微信公众号「码农先森」,原文链接:https://mp.weixin.qq.com/s/6F1em9c4JMZybVb9QVn8yQ
GitHub 项目地址:https://github.com/palemoky/fight-the-landlord