571
社区成员
发帖
与我相关
我的任务
分享使用Unity或者其他工具,实现一个简易版小游戏,游戏类型不限。支持与局域网内另一玩家对战。需要使用QUIC协议,连接保持(4G/WIFI切换)。采用人机对战方式,支持游戏断开链接后,重新连接游戏并进行对局。保障前端安全性,防止用户篡改前端数据,伪造数据提交。
由于没有限定游戏的类型,我们计划做一个简化版的《弹弹堂》小游戏:
1.一次两个玩家,回合制。
2.每个玩家在回合内可以进行移动,也可以发射炮弹。炮弹可以给玩家体力值造成伤害,也可以破坏地形。
3.当玩家发射炮弹,或者回合内的倒计时归零时,回合结束,转移控制权。
4.当一方玩家体力值归零时,游戏结束,归零的一方失败。
其详细的流程如下图所示:

游戏的截图如下所示

注:
本次工程实践是小组内多人一同开发,主要分为客户端和服务端部分,每个人分工不同。客户端采用Unity工具,服务端采用Go语言实现。
我负责服务器部分的开发,所以接下来的内容不会涉及到客户端开发的部分,只会针对服务端进行。
从服务端的角度来看,用户,也就是玩家,有以下这些用例:
| 玩家功能 | 开始状态 | 终止状态 |
|---|---|---|
| 注册 | 用户点击注册开始填写信息 | 用户收到了注册成功或者失败的反馈 |
| 登录 | 用户输入登录信息并发送 | 用户收到了登录成功或者失败的反馈 |
| 匹配 | 用户点击“联机”按钮 | 成功匹配到其他玩家 |
| 游戏 | 匹配到玩家并游戏开始 | 分出胜负游戏结束 |
根据用到的功能画出用例示意图。

(1)用户注册
| 用例名称 | 用户注册 |
|---|---|
| 执行者 | 未注册用户 |
| 执行事件流 | 1.登录首页 |
| 2.跳转注册界面 | |
| 3.输入用户名和密码注册 | |
| 4.注册成功,返回注册信息 | |
| 异常事件流 | 输入信息有误,返回注册错误信息 |
(2)用户登录
| 用例名称 | 用户登录 |
|---|---|
| 执行者 | 已注册用户 |
| 基本事件流 | 1.登录平台首页 |
| 2.填写用户名和密码 | |
| 3.登录成功,跳转至游戏选项 | |
| 异常事件流 | 填写信息有误,提示错误 |
(3)匹配玩家
| 用例名称 | 匹配玩家 |
|---|---|
| 执行者 | 已注册玩家 |
| 基本事件流 | 1.单机界面上“联机模式”按钮 |
| 2.等待系统找与其级别匹配的玩家 | |
| 3.成功找到对应玩家,创建房间 | |
| 异常事件流 | 匹配超时,自动进入单机模式 |
(4)游戏
| 用例名称 | 游戏 |
|---|---|
| 执行者 | 已注册玩家 |
| 基本事件流 | 1.初始化房间,告诉双方对手信息和自己的位置信息 |
| 2.转发双方的操作数据,并等待胜负结算数据 | |
| 3.收到双方的结算数据,宣告结果并记录数据库 | |
| 异常事件流 | 玩家至少一方网络断开,断线一方判定战败 |
从用户的角度,我们来看看从用户登录开始到成功完成一局游戏。用户,客户端,服务器,数据库的时序示意图。

对于用户来说,只能看到客户端,服务端和数据库对其是透明的。并且也可以从中看出,服务端并不负责客户端的游戏状态转换,只是负责转发,且十分相信客户端(胜负的结算信息是由客户端主动发送的),这对前端安全来说也是一个挑战。
对于服务端来说,主要的实体类有三个:用户,登录用户列表,房间。数据库中只存储用户表,属性包括:id,密码,总游戏场数,胜利游戏场数。数据库表设计如下所示:
| 属性名 | 类型 | 描述 |
|---|---|---|
| username | varchar | 用户名,具有唯一性 |
| password | varchar | 用户登录密码,实际存储会加密处理 |
| allgame | integer | 该用户进行游戏的总场数 |
| wingame | integer | 该用户胜利的总场数 |
后两项主要用于在匹配时可以匹配到势均力敌的敌人,从而不会因为双方等级差距太大破坏游戏体验;
登录用户列表(UserList)用于存放已经登录的用户信息,主要包括用户id,用户的通信channel(这是go语言的特性)和用户的ip:端口号以方便通信;
房间(Room)用于维护对局实现双方玩家的通信交流。
登录用户列表和房间都在内存中,不会持久化到数据库。
三者的UML示意如下所示:

(1)单例模式
对登录用户的列表UserList我们采用单例模式,因为无论在任何时候,登录用户列表都是唯一的。UML示意图如下:

(2)传输对象模式
游戏的客户端会向服务器一次性传递带有多个属性的数据。传输对象是一个具有 getter/setter 方法的简单的 POJO 类,它是可序列化的,所以它可以通过网络传输。在这次项目中,无论是玩家的登录/注册信息;还是玩家在游戏中的操作/结算信息,都需要一次传输很多的内容。这里以登录为例作UML示意图:

(3)数据访问对象模式
当需要对用户信息持久化操作时,就需要这种设计模式。UML示意图如下:

作者:093
用例图和序列图的画法有点怪