旋友圈扯旋-Java+Unity双端全套源码/俱乐部联盟信用分模式/纯源码无加密可二开

房卡联盟2026-09-04275 阅读
约 3,381 字 · 大约 11 分钟

摘要: 旋友圈是一套以「扯旋」(中国骨牌 / 牌九类)玩法为核心的房卡棋牌,采用 Java Netty 单进程服务端加 Unity UGUI 客户端的双端全源码交付。它真正的业务重心不是普通房卡开房,而是「俱乐部 + 联盟 + 信用分 + 合伙人分红」这一整套熟人局运营体系,服务端的玩法、抽水、分红逻辑全部明文可改,客户端带安卓 keystore 可直接打包。下文从架构、玩法、部署到二次开发逐一拆解。


一、先看它长什么样

拿到手里是两套完整工程放在一个文件夹里:一套 Java 写的游戏服务端(xuanxuanyouquan),一套 Unity 写的客户端(xuanyouquanUnity),外加打包时混进来的双份 IDE 工程文件(IntelliJ 加 Eclipse)。这是典型的「一个团队同时维护前后端、直接把整个工作区打包交付」的形态,好处是前后端一次配齐、能自己编能自己跑,不像很多组件包只给你半截。

界面上,它是一款微信生态里常见的熟人房卡棋牌:手机号登录,进大厅创建或加入牌局,核心组织方式是俱乐部与联盟。下面这张图从左到右分别是登录页、大厅牌局列表、俱乐部详情,能看到「合伙人」「信用系统开关」「俱乐部基金」「信用授权」「我的联盟」这些字眼——这套东西的运营模型一眼就和普通金币场不一样。

旋友圈 登录大厅与俱乐部界面
旋友圈 登录大厅与俱乐部界面

二、整体架构:一个进程扛全场

服务端是单进程、内存态架构,不是微服务。入口 com.game.server.Main 启动后读取 config/serverConfig.xml,反射拉起里面配置的唯一一个服务 com.game.majiang.Server(服务名就叫「旋旋友圈」),绑定 8051 端口对外,登录、大厅、游戏、房间、俱乐部、联盟全部跑在这一个进程里。逻辑中枢 LogicServer 在启动时把用户、俱乐部、联盟、成员一次性 selectAll() 全量载入内存缓存(DataManager),运行期以内存为准、MySQL 只做落库。

各功能模块在源码里的分工大致如下:

包

职责

com.game.server

进程启动、配置装载、服务生命周期

com.game.server.message

协议路由与收发(自研二进制协议)

com.game.server.db

自研 JDBC 连接池 + DAO / entity

com.game.majiang.logic

大厅 / 房间 / 桌子 / 玩家逻辑核心

com.game.majiang.logic.chexuan

扯旋玩法逻辑

com.game.majiang.algorithm.*

各牌型算法

com.robot / com.timing

机器人、定时任务

有意思的是根包名叫 com.game.majiang(麻将),实际游戏却是扯旋,逻辑基类也仍叫 LogicServer / LogicRoom / LogicTable。再翻 config/RoomConfig.xml,里面还残留着斗地主的房间配置注释和 com.game.laohuji.fangka(老虎机)包名。结论很清楚:它是从一套通用房卡麻将 / 棋牌框架换皮改出来的,这套框架此前被反复复用于斗地主、牛牛、老虎机等多种游戏,本项目只把「扯旋」这一款真正接了进来。

整个交付就是下面这样一个文件夹,服务端(xuanxuanyouquan)、Unity 客户端(xuanyouquanUnity)和文章资料并排放着,前后端一次配齐:

旋友圈 项目根目录双端全套
旋友圈 项目根目录双端全套

三、通讯层:Netty 打底,协议靠代码生成

网络框架用的是 Netty 4.0.36 的 WebSocket(源码里同时保留了 Mina 的实现分支,最终选了 Netty)。但要提醒二开的人一句:真正的通讯底座 com.comm.*(NettyWebSocket、Session、编解码等)没有给源码,是以预编译的 lib/comm.jar 提供的,属于这类框架惯常的「上层业务开源、网络内核闭源」做法。

应用层协议是自研二进制,不是 protobuf 也不是 JSON:大端字节序,跳 2 字节后读一个 short 协议号,再 switch 分发;字符串用「长度前缀 + UTF-8」编码,其余是定长 int / long / short。

这套协议不是手敲出来的,而是代码生成的——source/player.h(1477 行)是一份自定义 IDL,配合 template/ 目录下的 req / rsp / execute / switch 模板,一次性生成了 74 个请求类、113 个响应类、74 个处理器和整个分发 switch。对二开来说这是个加分项:要加新协议,改 IDL 重新生成即可,不用一个个手写。

数据库这块也全是自研轮子:连接池是手写的 DBConnectionPool(DriverManager + 链表),ORM 是 SqlHelper 加 commons-beanutils 反射映射,没有用 Druid、MyBatis 这些。全局没有 Redis、没有消息队列,状态就靠那份内存缓存兜着。

旋友圈 Java服务端源码目录
旋友圈 Java服务端源码目录

四、扯旋玩法:本质是骨牌(牌九)比牌

别被「扯旋」这个名字带偏,它不是扑克,而是一种以**中国骨牌(牌九)**为基础的庄闲比牌玩法。牌型枚举 ChexuanCardType 里全是骨牌对牌名:丁皇、天牌、地牌、人牌、和牌、梅十、板凳、长三、虎头、豹子、天王地王、天杠地杠、天关九地关九、灯笼九,一直排到杂牌。

发牌算法 GameAlgorithm.initCardGroup() 是八门、每门四张(八个座位、每人四张),玩家把手里四张牌组成两手分别和别人比大小。一局的推进由桌面状态机 ChexuanTableStatus 控制:

等待 → 准备 → 发牌 → 压注 → 组牌 → 搓牌 → 结算

这正好对应界面上的一整套操作:入座、下注(游戏里叫「钵钵」)、组牌、搓牌看牌、开牌结算。结算与抽水的核心逻辑集中在 ChexuanTabale.java(1782 行)里,押注汇入「皮池」,最终按服务费比例抽水分配。下图右侧就是扯旋的牌桌,左中两张是战绩数据页和「我的俱乐部」列表:

旋友圈 战绩俱乐部与扯旋牌桌
旋友圈 战绩俱乐部与扯旋牌桌

需要说明的是,algorithm/ 目录里还躺着斗地主、牛牛、五子棋、炸金花的整套牌型算法,vo/ 里也有它们的战绩日志对象——但这些在本项目里没有被接入运行,属于原框架留下的「死代码」。对二开反而是好事:底子现成,想加一款斗地主或牛牛,接一个 logic 再在房间配置里注册就能复用。

五、真正的重心:俱乐部 + 联盟 + 信用分 + 合伙人分红

如果说玩法只是「一款扯旋」,那这套源码真正值钱、也最难自己从零写的部分,是它完整的熟人局运营体系。数据模型集中在 db/entity/ 下,对应一组 MySQL 表:

  • 俱乐部(xy_club_info):记录创建者、所属联盟、信用系统开关、俱乐部基金、推广开关、联盟额度;类里写死了 theContributions = 0.05,也就是俱乐部抽成 5%。

  • 信用分体系:玩家上桌下注不是直接扣金币,而是先从个人「信誉额度」和联盟额度里走,XyClubMemberInfo 实现了增加、减少、带入、结算、贡献、带入退回六种额度流水,每一笔都落到 xy_club_changes_quota 表。

  • 合伙人与分红:成员表里带「是否合伙人」「上级合伙人」「红利分配比例」「累计 / 剩余红利」,每局结算后按「输赢 × 贡献比例」抽成,再按分配比例给上级合伙人计红利,写进专门的贡献日志和分红日志表。协议侧有成为合伙人、合伙人抽成、调整分红比例等一整套消息。

  • 联盟(xy_union_info):多个俱乐部组成联盟共享额度,额度调拨走 xy_union_changes_quota。

  • 围观:LogicWatchWar 支持站起围观、拉取围观玩家信息。

换句话说,这不是「建个房打几局」的简单房卡,而是一套带信用授信、多级抽成、联盟额度调拨的代理运营底座——这也解释了界面上那些「信用授权 49950」「俱乐部基金」「我的联盟」的来历。

六、客户端:Unity 全源码,带签名能直接打包

客户端是 Unity 2019.2.17f1 + UGUI(不是 NGUI),596 个 C# 脚本纯源码、无加密无混淆,工程完整(四个业务场景、109 个 prefab、meta 齐全),可直接用对应版本 Unity 打开。更关键的是 Assets/ 下带着安卓签名文件 xuanyouquan.keystore——配好服务端后理论上导入即可编译签名出 APK。

脚本结构里,网络协议消息体占了大头(Message/ 下 283 个,分 in / out / execute / struct 四层,和服务端的 74 / 113 / 74 三套一一对应),界面逻辑 120 个(登录、大厅、俱乐部、对局面板),外加 9 个全局管理器。通讯用的是 Socket.IO over WebSocket 加同一套自研二进制协议,收发入口在 MySoc.cs。

第三方 SDK 集成得很轻,只有一个重量级的——腾讯 GCloud 语音(GVoice),安卓 / iOS 原生库和语音模型都在,牌桌上的实时语音靠它;其余就是二维码生成(邀请加入房间)、相册、剪贴板这类通用原生桥。要注意的是,工程里 WeiChatReqLoginReq 这个微信登录消息类虽然定义了,但全工程没有任何地方真正调用,也没打包微信 SDK——微信登录只是留了字段没接通,实际登录走的是手机号 / 账号密码 / 游客。二开如果要真微信登录,得自己补 SDK。

另外,客户端资源走的是 Resources.Load 随包编译,没有 Lua、没有可用的 AssetBundle 热更(ResourceManager 里有一段 AB 兜底代码,但工程里并没有打出对应资源包,属半成品预留)。

旋友圈 Unity客户端源码目录
旋友圈 Unity客户端源码目录

七、部署要点与大致耗时

服务器侧的必要条件不复杂:

项

要求

运行环境

JDK(Java 服务端)+ MySQL 8(驱动为 com.mysql.cj.jdbc.Driver)

端口

游戏主服 8051;后台 SOAP 管理服务 7051(默认关闭,需手动开)

客户端

Unity 2019.2.17f1 打开 xuanyouquanUnity 编译

中间件

无需 Redis / MQ

落地步骤大致是:建好 MySQL 库(配置里库名为 xuanxuanyouquan)导入表结构,改 config/dbConfig.xml 里的数据库地址、账号、密码,起 Java 服务端;客户端只需改 SocketIOComponent.cs 里那处硬编码的服务器地址(ws://IP:8051 与后台 XyqAdmin 的 HTTP 地址),指向自己的服务器,再编译出包即可。服务端还预留了 JAX-WS 的 SOAP 后台接口(开关服、加币、在线人数、改参数等),供外部(多半是 PHP)后台调用,但默认被注释掉了、需要自己打开。第三方对接方面,微信登录走 api.weixin.qq.com、短信走中国网建、支付预留了 unpay / jtpay 通道,都需要自己的账号密钥。

对熟手来说,服务端配库起服约一两个小时,客户端改地址出包再算半天到一天,主要时间花在准备 MySQL、语音 AppID 和签名这些外部账号上,代码本身不是卡点。

八、二次开发空间

这套东西的二开自由度整体不错,因为上层业务全是明文源码:

  • 可自由改:扯旋玩法与牌型算法、抽水比例(theContributions 与 matchingConfig 里的服务费)、场次 / 底分 / 入离场、俱乐部与联盟与合伙人的分红规则、信用额度流水——都能直接动。

  • 加新玩法成本低:斗地主、牛牛、五子棋、炸金花的算法已经现成躺在 algorithm/ 里,接 logic 加注册即可;协议又是 IDL 代码生成的,加消息很快。

  • 换皮容易:客户端界面逻辑与资源分离,改图标、UI、音效即可换品牌;服务器地址集中在一处,改一行就能连自己的服。

  • 受限点:网络底座 comm.jar 是闭源黑盒,想换传输层、改帧格式、加压缩加密,得先反编译或用 IDL 重生成上层;整体是单进程内存态、无 Redis / MQ、自研连接池,要做水平扩展、分区或热更需要较大改造。

九、二开前务必先做的安全清理

最后必须点一句,这套源码里有几处上线前必须封堵的隐患,二开的人别直接拿去跑:

  • 配置文件里残留了历史环境的明文数据库账号密码(本副本当前库的密码已被打码,但注释里旧库的口令是明文)。

  • 后台 SOAP 接口里有 addMoney 这类可直接加币的 GM 方法,一旦对外暴露就是大洞。

  • 发牌算法里存在按座位作弊发牌 / 做牌的入口(initCardGroup(cheatCard, seatNo)、matchCards())——这在这类源码里常见,但对外运营前应当审计并处理。

小结

旋友圈扯旋是一套双端全源码、非组件的房卡棋牌:Java Netty 服务端加 Unity 客户端,扯旋(骨牌 / 牌九)玩法一款,真正的价值在那套俱乐部 + 联盟 + 信用分 + 合伙人分红的运营体系,且服务端逻辑与客户端工程都明文可改、客户端带签名可打包。它适合两类人:想拿一套现成的信用分俱乐部棋牌换皮运营的团队,以及想在一个「能编能跑、协议可生成、算法有现成」的框架上深度二开、扩玩法的开发者。短板是网络内核闭源、单进程内存态架构偏老,以及一些必须先清理的安全入口。

下载地址

会员免费

本资源为会员专享,登录后可下载