架构图
graph TB
A(客户端APP)
CR(崇仁打盾)
YH(宜黄红心5)
P(公共服)
PP(个人中心-帐号资料等)
PC(社交-聊天/搜索/语音等)
PG(游戏-列表/回放等)
PM(游戏币-充值/消费等)
PS(系统-公告/通知等)
D(MYSQL/REDIS)
C(运营人员)
S(运营后台)
A-- 游戏时长链tcp -->CR
A-- 游戏时长链tcp -->YH
A-- 长链tcp -->P
subgraph 重用
P-- 内嵌模块 -->PP
P-- 内嵌模块 -->PC
P-- 内嵌模块 -->PG
P-- 内嵌模块 -->PM
P-- 内嵌模块 -->PS
end
C-- WEB -->S
CR-- 链接池 -->D
YH-- 链接池 -->D
PP-- 链接池 -->D
PC-- 链接池 -->D
PG-- 链接池 -->D
PM-- 链接池 -->D
PS-- 链接池 -->D
S-- 链接池 -->D
三缺一大厅加入房间
sequenceDiagram
participant C as 客户端
participant P as 公共服
participant R as Redis
participant G as 游戏服
C ->> P: 三缺一大厅EventThreeOne
P ->> R: 向game_gateway_playId_grade频道转发消息
R ->> G: 订阅频道,收到消息
G ->> R: 向public_gateway频道回包处理结果
R ->> P: 订阅频道,收到处理,转化为EventReturn
P ->> C: 如果用户在本服务登陆,则回包给EventReturn
前后端交互图
sequenceDiagram
participant C as 客户端
participant SP as 公共服
participant R as Redis
participant M as Mysql
participant SG as 游戏服
C ->> SP: 获取验证码
SP ->> R: 是否有未使用的验证码
alt 有未使用的验证码
R -->> SP: 返回验证码
else 没有未使用的验证码
SP ->> R: 生成验证码,保存
end
SP ->> SP: 调用第三方短信接口
Note Over C: 用户接收验证码
C ->> SP: 使用验证码请求登录
SP ->> R: 获取验证码
SP ->> SP: 验证验证码
alt 验证成功
SP ->> R: 删除验证码
SP ->> M: 获取用户基本信息(用户不存在先插入用户信息)
M -->> SP: 返回用户信息
SP ->> M: 获取用户的房间信息
M -->> SP: 返回用户的游戏房间信息
SP -->> C: 返回Token、房间等信息
else 验证失败
SP -->> C: 登录失败
end
alt 用户在游戏房间内
C ->> SG: 登录游戏服务器
SG -->> C: 返回登录成功
C ->> SG: 用户进入房间继续游戏
else 用户没有在游戏房间内
C ->> C: 用户进入一级大厅,开始心跳请求
C ->> SP: 获取用户其他信息
SP -->> C: 返回用户其他信息
Note Over C: 等待用户的其他请求
end
C ->> SP: 请游戏场次列表
SP ->> R: 获取游戏的场次列表
R -->> SP: 返回游戏的场次列表
SP -->> C: 返回游戏的场次列表
Note Over C: 展示一级大厅
C ->> SP: 进入某个场次
SP ->>+ R: 查询该场次信息
R -->>- SP: 返回该场次信息
SP ->>+ M: 获取该用户的资料
M -->>- SP: 返回该用户的资料
SP ->> SP: 判断用户的游戏币数
SP -->> C: 返回该场次的游戏服务器地址
C ->> SG: 用户登录到游戏服务器
SG ->>+ R: 用户Token查询用户的ID
R -->>- SG: 返回用户的ID
SG ->>+ M: 查询用户的基本信息
M -->>- SG: 返回用户的基本信息
SG ->>+ R: 获取用户的房间信息
R -->>- SG: 返回用户的房间信息
SG ->> R: 保存用户的经纬度
SG -->> C: 返回登录成功
SG -->> C: 推送二级大厅信息
C ->> SG: 用户进入某个房间(桌)
SG -->> C: 推送房间信息
SG -->> C: 推送定位信息
SG -->> C: 如果已经准备好,推送游戏信息
SG -->> C: 如果人数满足,推送发牌信息
SG -->> C: 推送房间列表变化信息
游戏服登陆流程图
graph TD
APP(客户端)
room{是否在房间内?}
lobby(进入大厅)
game{是否在游戏中?}
dismass{是否在解散中?}
oldstatus{解散前是否游戏中?}
run(游戏中)
vote(推解散投票信息)
APP -- 登陆 --> room
room -- 否,推房间列表 --> lobby
lobby -- 推房间变化 --> lobby
room -- 是,推房间信息 --> dismass
dismass -- 是 --> oldstatus
oldstatus -- 是,推游戏信息 --> vote
oldstatus -- 否 --> vote
dismass -- 否 --> game
game -- 是,推游戏信息 --> run
game -- 否,推玩家变化 --> game
run -- 推玩家/牌变化 --> run
游戏服解散流程图
graph TD
APP(客户端)
ask(广播解散,提示投票)
result{是否同意解散}
agree{是否游戏中}
refuse(发不解散通知,推游戏信息)
disagree{是否在游戏中}
APP -- 发起解散 --> ask
ask -- 玩家投票 --> ask
ask -- 统计投票,超时算同意 --> result
result -- 同意 --> agree
result -- 不同意 --> refuse
refuse --> disagree
disagree -- 是 --> 推游戏信息
agree -- 否 --> 发解散通知
agree -- 是 --> 发小局结算
前后端tcp包结构
graph LR
len[包体长度 2字节 ]
event[事件id 2字节]
seq[包序列号 2字节]
pb[PB结构体]
subgraph 数据包 小端
len-->event
subgraph 包体内容
event-->seq
seq-->pb
end
end
- 先获取2Byte包体的长度,根据获取的长度获取包体的内容
- 包序列号
- 客户端每个tcp包都带上
- 服务端直接回包,值和发送包一样.
- 服务端主动发送的包seq都为0
扑克牌定义
| 牌ID |
描述 |
| 03 – 15 |
方块3 - 方块2 |
| 23 – 35 |
梅花3 - 梅花2 |
| 43 – 55 |
红桃3 - 红桃2 |
| 63 – 75 |
黑桃3 - 黑桃2 |
| 83 |
小王 |
| 84 |
大王 |
| 85 |
癞子王 |
麻将牌定义
| 牌ID |
描述 |
| 1 – 9 |
1万 - 9万 |
| 11 – 19 |
1筒 - 9筒 |
| 21 – 29 |
1条 - 9条 |
| 31 – 34 |
东南西北 |
| 41-43 |
中发白 |
游戏事件范围定义
| 事件ID |
描述 |
| 9100~9199 |
公共服 |
| 9800~9899 |
打盾 |
| 10000~10099 |
宜黄红心5 |
| 10300~10399 |
丰城双剑 |
| 9900~9999 |
红中麻将 |
| 9600~9699 |
红中麻将2人场 |
| 10100~10199 |
宜黄麻将2人场 |
| 10200~10299 |
宜黄麻将 |
| 9400-9499 |
崇仁麻将2人场 |
| 9500-9599 |
崇仁麻将 |
| 9000-9099 |
乐安麻将2人场 |
| 9200-9299 |
乐安麻将 |
游戏ID
| 游戏ID |
游戏名称 |
| 8600 |
打盾二人场 |
| 8700 |
跑得快二人场 |
| 8800 |
斗地主 |
| 8900 |
跑得快 |
| 9000 |
乐安麻将二人场 |
| 9100 |
公共服 |
| 9200 |
乐安麻将 |
| 9400 |
崇仁麻将2人场 |
| 9500 |
崇仁麻将 |
| 9600 |
红中麻将2人场 |
| 9800 |
打盾 |
| 9900 |
红中麻将 |
| 10000 |
宜黄红心5 |
| 10100 |
宜黄麻将2人场 |
| 10200 |
宜黄麻将 |
| 10300 |
丰城双剑 |
地区定义
| 地区ID |
描述 |
| 9800 |
崇仁 |
| 10000 |
宜黄 |
| 9700 |
乐安 |
| 9900 |
东乡 |
| 9600 |
临川 |
| 10300 |
丰城 |