编程 Go语言实现支持联网对战的斗地主游戏

2026-05-18 08:41:43 +0800 CST views 12

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]
    })
}

发牌流程:

  1. 创建 54 张牌的标准牌组
  2. Fisher-Yates 洗牌算法打乱顺序
  3. 每位玩家 17 张,剩余 3 张作为底牌
  4. 无任何基于玩家数据的牌面调整

公平匹配

快速匹配

  • 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

复制全文 生成海报 开源项目 Go 游戏 斗地主 WebSocket

推荐文章

nginx反向代理
2024-11-18 20:44:14 +0800 CST
PHP解决XSS攻击
2024-11-19 02:17:37 +0800 CST
一个简单的打字机效果的实现
2024-11-19 04:47:27 +0800 CST
如何在 Vue 3 中使用 Vuex 4?
2024-11-17 04:57:52 +0800 CST
api远程把word文件转换为pdf
2024-11-19 03:48:33 +0800 CST
Go配置镜像源代理
2024-11-19 09:10:35 +0800 CST
JavaScript设计模式:适配器模式
2024-11-18 17:51:43 +0800 CST
windows下mysql使用source导入数据
2024-11-17 05:03:50 +0800 CST
程序员茄子在线接单