一个客户端过来, 首先要校验自己的身份(去自己的账号系统里面校验), 校验结束以后数据暂时存在中心服务器里
客户端这个时候进入斗地主的服务器,
这个时候 客户端会先向斗地主服务器进行一些简单的交流
"服务器你好, 请问你是什么版本的? 你里面现在大概有多少人?"
"我是斗地主服务器, 我的版本是1.0, 我现在里面有XX个桌子. 有XX个人"
"可以告诉我前100个桌子的情况吗?"
"前100个桌子的情况分别是 : 第1个桌子 3个人已经开始游戏, 第2个桌子3个人, 已经开始游戏, .... 第50个桌子1个人, 正在等待中"
"服务器, 我想加入XXX号桌子 / 服务器, 帮我快速找一个空位座下吧?"
"好的, 已经安排你做在XXX号桌子. XXX号桌子里面的情况是这样的"
"有一个新玩家进来"
"又有一个新玩家进来"
扫描二维码关注公众号,回复:
11912459 查看本文章
"游戏现在正式开始"
"你们的手牌是 XXXXX"
"请问你要叫地主吗?"
"叫地主"
"其他人抢地主的情况是这样的"
"最终地主是XXX"
"游戏正式开始, 请出牌"
"我过"
"好的, 其他人出的牌是"
"游戏结束, 你们分别得到了多少钱"
"我还要玩/不玩了"
以上差不多就是游戏中要用到的大部分协议了
首先我们简单定义一份协议
协议分成客户端向服务器请求. 服务器回复客户端, 一问一答这种结构 Request Respone, 还有服务器主动给客户端进行广播的这种结构 BoardCast
用pb简单定义一份协议先, golang用json简直是坑爹
syntax = "proto2";
package ddzpb;
// 斗地主协议
// "服务器你好, 请问你是什么版本的? 你里面现在大概有多少人?"
message TGetServerInfoReq
{
// 空包
}
//"我是斗地主服务器, 我的版本是1.0, 我现在里面有XX个桌子. 有XX个人"
message TGetServerInfoRsp
{
optional string Version = 1; // 版本号
optional int32 TableCount = 2; // 桌子数量
optional int32 PlayerCount = 3; // 玩家数量
}
//"可以告诉我前100个桌子的情况吗?"
message TGetTableInfoReq
{
optional int32 TableFrom = 1; // 从哪个桌子开始
optional int32 TableCount = 2; // 发送多少个桌子的数据
}
// 桌子的信息
message TTableInfo
{
optional int32 Status = 1; // 桌子状态, 已经开始, 或者还没开始
optional int32 PlayerCount = 2; // 里面有多少人
}
// "前100个桌子的情况分别是 : 第1个桌子 3个人已经开始游戏, 第2个桌子3个人, 已经开始游戏, .... 第50个桌子1个人, 正在等待中"
message TGetTableInfoRsp
{
optional int32 TableCount = 1;
repeated TTableInfo TableInfos = 2;
}
//"服务器, 我想加入XXX号桌子 / 服务器, 帮我快速找一个空位座下吧?"
message TJoinTableReq
{
optional int32 TableIndex = 1; // 需要加入的桌子编号, 不填就快速加入
}
///"好的, 已经安排你做在XXX号桌子. XXX号桌子里面的情况是这样的"
message TJoinTableRsp
{
optional string ErrorMsg = 1;
optional string ErrorCode = 2;
optional TTableInfo TableInfo = 3;
}
// 玩家信息
message TPlayerInfo
{
}
//"有一个新玩家进来"
// "又有一个新玩家进来"
message TPlayerComeInBc
{
optional int32 Status = 1;
optional TPlayerInfo PlayerInfo = 2;
}
//"游戏现在正式开始"
message TGameStartBc
{
optional int32 Position = 1; // 你的桌位是
}
// "你们的手牌是 XXXXX"
message TDealCardBc
{
optional int32 CardCount = 1; // 你的手牌数量是
repeated int32 CardValue = 2; // 手牌的数值是
}
//"请问你要叫地主吗?"
message TCallDZBc
{
optional int32 DZPosition = 1; // 地主当前的位置
// 后面可能会加上什么明牌啊,, 或者当前倍数之类的扩展
}
// 叫地主"
message TCallDZReq
{
optional int32 CallDZ = 1; // 叫地主的结果 1 叫地主 2明牌叫地主 其他不叫
}
// 叫地主的结果.. 同时广播其他人叫地主的情况 TCallDZBc
message TCallDZRsp
{
optional string ErrorMsg = 1;
optional string ErrorCode = 2;
}
//"游戏正式开始, 请出牌"
message TOutCardBc
{
optional int32 Position = 1; // 轮到当前某个位置的玩家进行出牌
optional int32 StartPosition = 2; // 本轮开始的玩家的位置
optional int32 LargePosition = 3; // 本轮目前最大牌的玩家位置(也就是上一个出过牌的人)
optional int32 Round = 4; // 轮次是
optional int32 Hand = 5; // 手次是
optional int32 CardType = 6; // 已经出的牌的类型是
optional int32 CardPoint = 7; // 已经出的牌的点数是
optional int32 OutCount = 8; // 上一次出牌的牌的数量
repeated int32 OutCards = 9; // 上一次出牌的牌的具体内容
}
// 我过, 我要出对三
message TOutCardReq
{
optional int32 Status = 1; // 状态, 其实可以不要
optional int32 OutCount = 2; // 上一次出牌的牌的数量
repeated int32 OutCards = 3; // 上一次出牌的牌的具体内容
}
// 同时广播其他人叫地主的情况 TCallDZBc
message TOutCardRsp
{
optional string ErrorMsg = 1;
optional string ErrorCode = 2;
}
// 游戏结束
message TGameOverBc
{
optional int32 WinnerPosition = 1; // 胜利者的位置
// 其他的倍数信息
// 最终卡牌
message TEndingCard
{
optional int32 Position = 1; // 剩余牌的位置
optional int32 LeftCount = 2; // 剩余牌的数量
optional int32 LeftCards = 3; // 剩余的卡牌的具体内容
}
repeated TEndingCard EndingCards = 7;
optional int32 OutCount = 8; // 上一次出牌的牌的数量
repeated int32 OutCards = 9; // 上一次出牌的牌的具体内容
}