Golang hace un servidor de juegos para el propietario [7]: algunas ideas sobre servidores y protocolos

Cuando llega un cliente, primero debe verificar su propia identidad (verificar en su propio sistema de cuenta), y luego de la verificación, los datos se almacenan temporalmente en el servidor central

El cliente ingresa al servidor de Doudizhu en este momento,  

En este momento, el cliente se comunicará primero con el servidor Doudizhu.

" Hola servidor, ¿qué versión tienes? ¿Cuántas personas hay ahora? "

" Soy el servidor Doudizhu, mi versión es 1.0, ahora tengo XX tablas. Hay XX personas "

" ¿Puede hablarme de las primeras 100 mesas?"

"Las primeras 100 mesas son las siguientes: 3 personas en la primera mesa han comenzado el juego, 3 personas en la segunda mesa, han comenzado el juego, .... 1 persona en la mesa 50, esperando "

" Servidor, quiero unirme a la mesa XXX / servidor, ¿pueden ayudarme a encontrar rápidamente un asiento vacío? "

" Está bien, se ha arreglado para que lo hagas en la mesa XXX. La situación en la mesa XXX es así "

" Llega un nuevo jugador "

" Entra otro jugador nuevo "

"El juego comienza oficialmente ahora "

" Tu mano es XXXXX "

" ¿Quieres llamar al propietario? "

" Llamar al propietario "

" La situación de otras personas que se apoderan de los propietarios es así "

"El propietario final es XXX "

"El juego ha comenzado oficialmente, por favor juegue las cartas "

" Pasé "

" Ok, las cartas jugadas por otros son "

"Se acabó el juego, cuánto dinero obtuviste "

" Quiero jugar / no jugar más "

 

Lo anterior son casi todos los protocolos utilizados en el juego.

Primero, simplemente definimos un acuerdo

El protocolo se divide en solicitudes del cliente al servidor. El servidor responde al cliente, una pregunta y una respuesta, esta estructura Request Respone   y la estructura que el servidor transmite activamente al cliente BoardCast

Use pb para simplemente definir un protocolo primero, golang usando json es simplemente hacer trampa

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; // 上一次出牌的牌的具体内容
}

 

 

 

Supongo que te gusta

Origin blog.csdn.net/warrially/article/details/88646740
Recomendado
Clasificación