navigation

架构图

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 丰城