创四方·大部落

 找回密码
 立即注册
搜索
查看: 216|回复: 8

[游戏开发] 15计科2班-服务端组A组杨祯鑫组-作品帖

[复制链接]

1

主题

5

帖子

49

积分

新手上路

Rank: 1

积分
49
发表于 2018-10-7 21:36:49 | 显示全部楼层 |阅读模式
本帖最后由 Young 于 2018-10-7 21:40 编辑

C:客户端     S:服务端  
传输协议采用http  

一、用户登录 Login
客户端进行登录操作(Client->Server)
    请求登录数据{"uid"用户ID:,"pwd":密匙}以POST方式发送给服务端
服务端返回JSON格式的字符串(Server->Client)  
    登入正常:‘{"status":"0","time":服务器时间,"info":具体信息,url:匹配的服务网址}’
    登入失败:‘{"status":"1","time":服务器时间,"info":具体信息}’
status定义如下标准:

  具体值       状态                 说明
   “0”      登录正常       服务端正常接受到用户请求,进行信息反馈
   “1”      登录失败       服务端判断客户端信息不合法,并且返回错误信息(账号不存在,密码错误或其他错误信息)

info信息定义如下标准

   具体值                        状态                       说明
“账号不存在”                无法查找到该账号            提交了空或无效的用户名
“密码错误”(用户名正确)        账号密码不匹配              用户名和密码不匹配
"登录成功"                  账号和密码匹配                正常登录


二、用户注册 Regist
(Client->Server)
    请求注册数据{"uname":用户昵称,"pwd":密匙}以POST方式发送给服务端
(Server->Client)
    服务端接受数据为其分配uid并生成当前时间戳进行保存
    {"status":0,"uid":用户id,"name":用户名,  "password":用户密码,"time": 当前服务器时间戳"}  


三、用户对战匹配 Match
(Client->Server)
客户端
    请求数据{“uid” = 用户ID,"time"=系统时间戳}。
(Server->Client)
    服务端将上线且“ongame”为flase的用户进行匹配,匹配成功将用户“ongame”置为true
    若A超出匹配时间或当前无用户可以匹配则发送匹配失败信息
    {"uid": 对战用户ID,“uname”:对战用户昵称,“time": "当前时间戳"}


四、用户数据查询 Query
(Client->Server)
    请求数据{"uid":当前用户的ID}
(Server->Client)  
    服务端返回用户的以往的对战数据
    {“uid”:用户ID,“uname”:用户昵称,“win”:胜场次数,“lost”:败场次数}


五、计算步数 Counter
(Client->Server)
    服务端需要验证用户下棋的坐标是否正确
    发送数据{"uid":当前用户的ID,"step":1,"PositionX":X轴坐标,"PositionY":Y轴坐标}
(Server->Client)  
    服务端将C1数据发送给C2,并进行步数统计,胜方将多一步于败方,直接转到结算界面
    {"PositionX":X轴坐标,"PositionY":Y轴坐标}   


六、游戏过程数据 ProcessData
(Server->Client)  
    服务端未接受到操作方的数据时,不断发送倒计时提醒操作。如果时间未获得操作信息,则直接跳到结算页面
    {"countdown": 剩余操作时间}
(Client->Server)
    客户端发送数据{"uid":当前用户的ID,"operation":true},并发送当前下棋的坐标。


七、C1/C2 投降 Surrender
(Client->Server)
    客户端在倒计时时间内发生请求,提前结束游戏,并进入结算
    客户端请求{"uid":用户ID,"Confirm":true,"Message":发送给赢家信息}
(Server->Client)  
    {"uid":用户ID,"Message":发送给赢家信息}   //败方向胜方发送消息,并跳转到结算页面


八、再次对战 FightAgain
(Client->Server)
C1/C2在结束后重新发送对战请求
    {“uid”:用户ID,"FightAgain":true/flase}
    拒绝或超时就断开双方的会话,用户选择匹配或退出游戏发送给服务端
    {"uid":用户ID,"match":true/false,"exit":true/false}
(Server->Cilent)
    在等待期间,服务端向客户端发送倒计时信息
    {"countdown":倒计时时间}


九、游戏结束并结算 Record
(Server->Client)
    服务端发送胜负数据提示给客户端,并在后台保存用户的对战记录
    {“uid”:用户ID,“win”:true/false,“lost”:true/false}
(Client->Server)
    客户端请求数据
    {"uid":用户ID,"online":false}
回复

使用道具 举报

1

主题

5

帖子

49

积分

新手上路

Rank: 1

积分
49
 楼主| 发表于 2018-10-7 21:37:45 | 显示全部楼层
回复

使用道具 举报

1

主题

5

帖子

49

积分

新手上路

Rank: 1

积分
49
 楼主| 发表于 2018-10-15 08:30:16 | 显示全部楼层
本帖最后由 Young 于 2018-10-15 21:58 编辑

作废信息
回复

使用道具 举报

0

主题

5

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2018-10-15 22:06:02 | 显示全部楼层

重制通讯协议

本帖最后由 @ao 于 2018-10-16 18:59 编辑

C:客户端     S:服务端  
传输协议采用http  
客户端发出request。以post方式发出请求参数
服务器端返回response。以json格式返回数据
response的总体格式为:
        {state:状态,data:具体数据对象}
        state: 状态。0正常,1失败,2错误。
        data: 返回的具体数据。state=0时,data的定义由以下各接口具体定义。state=1或2时,data为具体失败或错误的提示信息。

1、获取服务端时间接口 getTime
该接口用于查询服务端时间,当客户端与服务端时间不匹配时,可利用该接口重新同步时间
request:

response:
          {state:0,data:服务端时间戳}

2、注册接口 regist
该接口中包含了获取服务端时间,以便在注册操作中,顺带完成时间同步
request:
        name:用户名
        password:密码
response:
        { state:0, datauserId:用户id,time:服务端时间戳)}
服务端接受数据,无账户冲突,为其分配uid并生成当前时间戳进行保存
{"state":1, data: "用户名已存在"}
服务端接受数据,有账户冲突,返回提示信息令用户重新输入
{"state":2, date: "服务超时"}
服务端接受数据,有”服务超时”错误,返回提示信息令用户重新输入

3、登录接口 login
该接口中包含了获取服务端时间,以便在登录操作中,顺带完成时间同步
request:
        name:用户名
        password:密码
response:
        { state:0,datauserId:用户id,time:服务端时间戳)}
登录正常
{"state":1, datatime:服务器时间戳,info:具体信息)}
登录失败,具体信息为“无此账号”或“密码错误(用户名正确)”

4、查询用户信息接口 getUserInfo
request:
        userId:用户id
response:
        {state:0,datauserId:用户id,name:用户名, win:胜场次数,lost:败场次数)}
服务端返回用户的以往的对战数据
{state:1,datauserId:用户id,info:”查无此用户”)}
数据库中找不到id,返回错误信息

5、匹配玩家接口 match
request:
        userId:用户id
response:
        未匹配成功  {gameId:0}
        gameId:为0代表未匹配成功。
        匹配成功  {gameId:游戏id,player0:玩家id,play1:玩家id,initData:游戏初始化数据,startTime:游戏开始的时间戳}
        gameId:一旦匹配成功,就要建立一个游戏,在数据库的game表中创建一条记录,用于存储这个游戏的相关数据,gameId即是game表中创建的记录的主键值。
        player0:玩家的id,同时也是先手的玩家id。该数据的格式应与getUserInfo接口中定义的格式相同。
        initData:游戏初始化数据,随机初始化的棋盘数据
        startTime:游戏开始的时间戳,该时间应为匹配成功后,一定时间段之后。

6、游戏状态查询  getGameInfo
该接口是,当前等待对方操作的玩家,间隔一定时间就应查询的接口,以获取游戏状态的变化
request:
        gameId:游戏id
response:
        游戏未结束  {gameState:0,turn:当前的回合数,currentPlayer:当前可以操作的玩家id,timeLimit:当前操作的截止时间戳,lastOperate:最后一次操作的数据,gameData:游戏局面的数据}
        游戏结束  {gameState:1,turn:回合数,totalTime:游戏总用时,winner:获胜的玩家id(若平局则为0),lastOperate:最后一次操作的数据,gameData:游戏当前局面的数据}

7、游戏操作接口 doOperate
request:
        gameId:游戏id
        userId:用户id
        turn:回合数
        operate:具体操作
response:
        {result:操作结果,gameInfo:{gameState:0,……}}
        result:0:操作成功,1:操作超时,1以上:其他错误,根据具体游戏进行定义
        gameInfo:与getGameInfo接口返回数据相同
8、用户对战先后顺序接口gameSeq
request:
        gameId:游戏id,time:当前时间戳,coin:硬币正反面
response:
        {state:0,data usersid: 用户ID,time:当前时间戳,coin:为0用户A先出子,为1用户B先出子)}
9、游戏计时接口timeKeep
request:
                gameId:游戏id
response:
                data:{ timeLeft: 剩余操作时间, userId:用户id }
每次下完棋开始计时,暂定为倒计时40s
10、棋盘坐标接口coord
request:
                gameId:游戏id,turn:回合数,xy:游戏坐标(为数字,为8x+y),operateDir:操作方向
                up(xy-8)down(xy+8)  left(xy-1)  right(xy+1)
response:
                xy:游戏坐标(为数字,为8x+y)
11、C1/C2投降(求和)接口surren
request:
                gameId:游戏id
                userId:用户id
                surrenInfo:投降信息(0为投降。1为求和)
                time:当前时间戳
response:
                data:有人申请投降/求和,是否同意?
                若双发都选是,则调用游戏结束接口,存在选否时,则继续游戏,调用游戏计时接口。当投降成功时,投降方lose+1,被投降方win+1,当求和成功时,求和方与被求和方win+1。
12、再次对战接口fightAgain
request:
                gameId:游戏id
                userId:用户id
                refight:{1:再次挑战}
response:
                data:是否再来一盘?
                若双方都选是,则调用游戏操作接口,若存在有选否时,调用游戏结束接口
13、游戏结束接口gameOver
request:
                gameId:游戏id
                userId:用户id
                time:当前时间戳
                gameEnd:游戏结束
response:
                userId:用户id
                time:当前时间戳
                data:游戏结束
                赢方win+1,输方lose+1

回复

使用道具 举报

0

主题

5

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 7 天前 | 显示全部楼层
@ao 发表于 2018-10-15 22:06
C:客户端     S:服务端  
传输协议采用http  
客户端发出request。以post方式发出请求参数

这个是:(导致的
回复

使用道具 举报

0

主题

5

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 7 天前 | 显示全部楼层
本帖最后由 @ao 于 2018-10-16 22:44 编辑

反映一个bug,提交的时候没有字数限制,提交修改时明明字数没增加,就会提醒字数超过1000上限,无法提交修改。还有一个不理想的地方:层主无法删除自己楼层,只能修改(想删掉之前的内容,增加新的一层内容,却不能删除,只能修改成短的内容)。还有一个问题,发帖的时候无法加题目(主题),而修改的时候却可以增加或修改题目(主题),amazing!
回复

使用道具 举报

0

主题

5

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 7 天前 | 显示全部楼层
C:客户端     S:服务端  
传输协议采用http  
客户端发出request。以post方式发出请求参数
服务器端返回response。以json格式返回数据
response的总体格式为:
        {state:状态,data:具体数据对象}
        state: 状态。0正常,1失败,2错误。
        data: 返回的具体数据。state=0时,data的定义由以下各接口具体定义。state=1或2时,data为具体失败或错误的提示信息。

1、获取服务端时间接口 getTime
该接口用于查询服务端时间,当客户端与服务端时间不匹配时,可利用该接口重新同步时间
request:

response:
          {state:0,data:服务端时间戳}

2、注册接口 regist
该接口中包含了获取服务端时间,以便在注册操作中,顺带完成时间同步
request:
        name:用户名
        password:密码
response:
        { state:0, data:(userId:用户id,time:服务端时间戳)}
服务端接受数据,无账户冲突,为其分配uid并生成当前时间戳进行保存
{"state":1, data: "用户名已存在"}
服务端接受数据,有账户冲突,返回提示信息令用户重新输入
{"state":2, date: "服务超时"}
服务端接受数据,有”服务超时”错误,返回提示信息令用户重新输入

3、登录接口 login
该接口中包含了获取服务端时间,以便在登录操作中,顺带完成时间同步
request:
        name:用户名
        password:密码
response:
        { state:0,data:(userId:用户id,time:服务端时间戳)}
登录正常
{"state":1, data:(time:服务器时间戳,info:具体信息)}
登录失败,具体信息为“无此账号”或“密码错误(用户名正确)”

4、查询用户信息接口 getUserInfo
request:
        userId:用户id
response:
        {state:0,data:(userId:用户id,name:用户名, win:胜场次数,lost:败场次数)}
服务端返回用户的以往的对战数据
{state:1,data:(userId:用户id,info:”查无此用户”)}
数据库中找不到id,返回错误信息

5、匹配玩家接口 match
request:
        userId:用户id
response:
        未匹配成功  {gameId:0}
        gameId:为0代表未匹配成功。
        匹配成功  {gameId:游戏id,player0:玩家id,play1:玩家id,initData:游戏初始化数据,startTime:游戏开始的时间戳}
        gameId:一旦匹配成功,就要建立一个游戏,在数据库的game表中创建一条记录,用于存储这个游戏的相关数据,gameId即是game表中创建的记录的主键值。
        player0:玩家的id,同时也是先手的玩家id。该数据的格式应与getUserInfo接口中定义的格式相同。
        initData:游戏初始化数据,随机初始化的棋盘数据
        startTime:游戏开始的时间戳,该时间应为匹配成功后,一定时间段之后。

6、游戏状态查询  getGameInfo
该接口是,当前等待对方操作的玩家,间隔一定时间就应查询的接口,以获取游戏状态的变化
request:
        gameId:游戏id
response:
        游戏未结束  {gameState:0,turn:当前的回合数,currentPlayer:当前可以操作的玩家id,timeLimit:当前操作的截止时间戳,lastOperate:最后一次操作的数据,gameData:游戏局面的数据}
        游戏结束  {gameState:1,turn:回合数,totalTime:游戏总用时,winner:获胜的玩家id(若平局则为0),lastOperate:最后一次操作的数据,gameData:游戏当前局面的数据}

7、游戏操作接口 doOperate
request:
        gameId:游戏id
        userId:用户id
        turn:回合数
        operate:具体操作
response:
        {result:操作结果,gameInfo:{gameState:0,……}}
        result:0:操作成功,1:操作超时,1以上:其他错误,根据具体游戏进行定义
        gameInfo:与getGameInfo接口返回数据相同
8、用户对战先后顺序接口gameSeq
request:
        gameId:游戏id,time:当前时间戳,coin:硬币正反面
response:
        {state:0,data:(usersid: 用户ID,time:当前时间戳,coin:为0用户A先出子,为1用户B先出子)}
9、游戏计时接口timeKeep
request:
                gameId:游戏id
response:
                data:{ timeLeft: 剩余操作时间, userId:用户id }
每次下完棋开始计时,暂定为倒计时40s
10、棋盘坐标接口coord
request:
                gameId:游戏id,turn:回合数,xy:游戏坐标(为数字,为8x+y),operateDir:操作方向
                up(xy-8)down(xy+8)  left(xy-1)  right(xy+1)
response:
                xy:游戏坐标(为数字,为8x+y)
11、C1/C2投降(求和)接口surren
request:
                gameId:游戏id
                userId:用户id
                surrenInfo:投降信息(0为投降。1为求和)
                time:当前时间戳
response:
                data:有人申请投降/求和,是否同意?
                若双发都选是,则调用游戏结束接口,存在选否时,则继续游戏,调用游戏计时接口。当投降成功时,投降方lose+1,被投降方win+1,当求和成功时,求和方与被求和方win+1。
12、再次对战接口fightAgain
request:
                gameId:游戏id
                userId:用户id
                refight:{1:再次挑战}
response:
                data:是否再来一盘?
                若双方都选是,则调用游戏操作接口,若存在有选否时,调用游戏结束接口
13、游戏结束接口gameOver
request:
                gameId:游戏id
                userId:用户id
                time:当前时间戳
                gameEnd:{1:游戏结束}
response:
                userId:用户id
                time:当前时间戳
                data:游戏结束
                赢方win+1,输方lose+1

回复

使用道具 举报

3

主题

8

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 6 天前 | 显示全部楼层
本帖最后由 mractivate 于 2018-10-17 20:36 编辑

采用http方式进行通信
客户端发出request。以post方式发出请求参数
服务器端返回response。以json格式返回数据
response的总体格式为:
        {state:状态,data:具体数据对象}
        state: 状态。0正常,1失败,2错误。
        data: 返回的具体数据。state=0时,data的定义由以下各接口具体定义。state=1或2时,data为具体失败或错误的提示信息。

1、获取服务端时间接口 getTime
该接口用于查询服务端时间,当客户端与服务端时间不匹配时,可利用该接口重新同步时间
request:无
response:
        服务端时间戳
(注意这里为避免重复书写,所以只写response中,state=0时,data的取值格式,以此处为例,最终完整的格式为{state:0,data:服务端时间戳})

2、注册接口 regist
该接口中包含了获取服务端时间,以便在注册操作中,顺带完成时间同步
request:
        name:用户名
        password:密码
response:
        {userId:用户id,time:服务端时间戳}

3、登录接口 login
该接口中包含了获取服务端时间,以便在登录操作中,顺带完成时间同步
request:
        name:用户名
        password:密码
response:
        {userId:用户id,time:服务端时间戳}

4、查询用户信息接口 getUserInfo
request:
        userId:用户id
response:
        {userId:用户id,name:用户名, win:胜场次数,lost:败场次数}

5、匹配玩家接口 match
request:
        userId:用户id
response:
        未匹配成功  {gameId:0}
        gameId:为0代表未匹配成功。
        匹配成功  {gameId:游戏id,player0:玩家id,player1:玩家id,initData:[000000,000001,......],startTime:游戏开始的时间戳}          gameId:一旦匹配成功,就要建立一个游戏,在数据库的game表中创建一条记录,用于存储这个游戏的相关数据,gameId即是game表中创建的记录的主键值。
        player0:玩家id,同时也是先手的玩家id。
        initData:游戏初始化数据,例如:暗棋游戏,随机初始化的棋盘数据。弹珠游戏,双方的出场阵容。
        startTime:游戏开始的时间戳,该时间应为匹配成功后,一定时间段之后。
详细说明:
initData:游戏初始化数据  
initData是一个长度为32的整型数组,每个数字,对应一个棋盘的位置的状态
第一位表示:棋格的状态:有子/无子,第二位表示:翻开/未翻开 , 第三位表示:player0的棋子/player1的棋子 , 低三位表示:棋子类型 例如:兵炮馬車。。。



6、游戏状态查询  getGameInfo
该接口是,当前等待对方操作的玩家,间隔一定时间就应查询的接口,以获取游戏状态的变化
request:
        gameId:游戏id
response:
        游戏未结束  {gameState:0,turn:当前的回合数,currentPlayer:当前可以操作的玩家id,timeLimit:当前操作的截止时间戳,lastOperate:最后一次操作的数据,gameData:[000000,000001,......]}
        游戏结束  {gameState:1,turn:回合数,totalTime:游戏总用时,winner:获胜的玩家id(若平局则为0),lastOperate:最后一次操作的数据,gameData:游戏当前局面的数据}

详细说明:
lastOperate:最后一次操作的数据: {coordinate:[x1,y1,x2,y2],turn:本次操作所属的回合数}


详细说明:

gameData:initData


7、游戏操作接口 doOperate
request:
        gameId:游戏id
        userId:用户id
        turn:回合数
        operate:具体操作
response:
        {result:操作结果,gameInfo:{gameState:0,……}}
        result:0:操作成功,1:操作超时,1以上:其他错误,根据具体游戏进行定义
        gameInfo:
        游戏未结束  {gameState:0,turn:当前的回合数,currentPlayer:当前可以操作的玩家id,timeLimit:当前操作的截止时间戳,lastOperate:最后一次操作的数据,gameData:游戏局面的数据}
        游戏结束  {gameState:1,turn:回合数,totalTime:游戏总用时,winner:获胜的玩家id(若平局则为0),lastOperate:lastOperate:最后一次操作的数据: {coordinate:[x1,y1,x2,y2],turn:本次操作所属的回合数}
gameData:initData}

8、C1/C2投降,接口surren

C1:request:
                gameId:游戏id
                userId:用户id
                time:当前时间戳
                surrenInfo:标志位(0为同意投降,1为不同意投降)

则当B玩家访问服务器进行下一步操作时,服务端response:
                gameId:游戏id
                userId:用户id
                surrenInfo:投降信息(0为同意投降。1为不同意投降
                time:当前时间戳,
C2:request:
                gameId:游戏id
                userId:用户id
                surrenInfo:投降信息(0为同意投降。1为不同意投降
                time:当前时间戳
当服务端  收到的C1/C2  的surrenInfo:标志位(0为同意投降,1为不同意投降)   为00时:游戏结束gameState:1    为 01,10时:调用游戏状态查询接口
服务端:response:

              gameInfo:
                   游戏未结束  {gameState:0,turn:当前的回合数,currentPlayer:当前可以操作的玩家id,timeLimit:当前操作的截止时间戳,lastOperate:最后一次操作的数据,gameData:游戏局面的数据}
                   游戏结束  {gameState:1,turn:回合数,totalTime:游戏总用时,winner:获胜的玩家id(若平局则为0),lastOperate:lastOperate:最后一次操作的数据: {coordinate:
[x1,y1,x2,y2]
,
turn:本次操作所属的回合数},
gameData:initData}



回复

使用道具 举报

0

主题

5

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 6 天前 | 显示全部楼层
@ao 发表于 2018-10-16 22:39
C:客户端     S:服务端  
传输协议采用http  
客户端发出request。以post方式发出请求参数

补充部分:
initData:游戏初始化数据
lastOperate:最后一次操作的数据
gameData:游戏局面的数据  
用数组表示棋盘状态:
{0(一个格子内有无棋子,无为0有为1)  0(若有,棋子是否翻开,否为0,是为1)  0(若翻开了,棋子是player0还是play1的棋子,play0为0,play1为1)  000(确定是哪一方的棋子后,确定棋子的类型[000兵,001炮,010马,011车,100相,101士,110将])}      用64(2的6次方)个数字代表64种情况,共32个int数据(规则规定开局有28个棋子,有4个的状态为0XXXXX)。
initData:
request:
                gameId:游戏id
response:
                initData: intData[x][y] 如(38)100110[1][1] ~(40)101000[4][8](32个)

lastOperate: 可以理解为最新的一部操作的数据
request:
                gameId:游戏id
         userId:用户id
         turn:回合数
         operate:具体操作
                xy:游戏坐标(一般为两个)
response:
                lastOperate: lastOperate[x][y] 如(38)100110[1][1]、(40)101000[4][8](一般返回2个)
                currentPlayer:当前可以操作的玩家id
                turn:当前的回合数
                timeLimit:当前操作的截止时间戳

gameData:
request:
                gameId:游戏id
         userId:用户id
         turn:回合数
response:
                initData: intData[x][y] 如(38)100110[1][1] ~(40)101000[4][8](32个)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

创四方·大部落 ( 闽ICP备17018841号 )

GMT+8, 2018-10-23 10:08

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表