网站开发进入腾信职位,邮箱注册网站查询,做效果图需要提供什么,phpcmsv9网站地图前后端通信
作为一个即时多人游戏#xff0c;不论是即时聊天还是更新玩家状态#xff0c;都需要服务端有主动推送功能#xff0c;或者客户端轮询。轮询的时间间隔可能导致游玩体验差#xff0c;因为不即时更新#xff0c;而且请求数量太多可能会打崩服务器。
建议在cs间…前后端通信
作为一个即时多人游戏不论是即时聊天还是更新玩家状态都需要服务端有主动推送功能或者客户端轮询。轮询的时间间隔可能导致游玩体验差因为不即时更新而且请求数量太多可能会打崩服务器。
建议在cs间建立websocket连接其实就是建立一个更占资源的连接但是可以长期维持这个连接通道两端都可以收发消息。
对于服务端需要额外的配置如spring这种已成体系的大框架就不原生支持ws需要额外的依赖。
ws不支持SSL有个wss就是wsSSL
通信模型就是一个server作为ws服务器可以与不同client建立连接并相互发送信息。注意在开发中是服务端这边会对每一个client新建一个连接对象并保存在内存中(HashSetConnect)。往往服务端推送是广播遍历这个HashSet对所有客户端发同一个消息。
房间隔离
作为游戏有房间的需求某些更新只需广播给某个房间里的玩家而不是全体玩家。而最基本的ws不支持房间号这些倒是socketio这种有专门支持但是socketio需要专门的服务端依赖和客户端依赖。如果需要自己基于ws实现的话可以在上面那个HashSet的基础上再套一层即HashMapRoomID,Connect。由于clien请求中会提及是哪个房间发来的请求我们找到对应房间的几个连接只对这几个玩家发送消息。
匹配机制
这个更像是产品方案设计而不是技术设计可以参考LOL等游戏的排名分机制。
我的一个思路是假设我的当前rank分是k从现在开始经过的时间为t我会搜索rank分在[ k-t, kt ]区间的、也正在匹配队列中的其他玩家即这个区间随时间不断扩大。这个方案较为简单适用于课设、毕设这种玩家数量过少、需要一定算法辅助匹配的情况。
考虑到斗地主在等待环节退出游戏的功能匹配不止是几个人匹配上就马上开一局这种类似LOL的情况。对于已经进入房间、还在准备阶段、但某人又退出的情况我们需要重新设计
如果在几秒内没有找到房间则自己开一个房间。否则进入一个匹配上的房间。匹配算法是玩家去匹配房间房间的rank分为当前房间内玩家的平均rank分在之前提到的区间范围内即被匹配上玩家进入该房间。还未满人的房间存在匹配队列中供玩家定时轮询匹配。记得在最后一个玩家退出房间后从匹配队列中移除该房间。
建立房间
除了自由匹配我们还要实现几个熟人组一局的需求。我们除了自由匹配按钮外还要提供一个额外的建立房间按钮这种房间不能被加入匹配队列中。除此之外要提供一个房间号可以用uuid或者雪花算法等生成并提供复制房间号和根据房间号查询的功能。
游戏
游戏状态
由于状态改变频繁我是用redis做分布式缓存保证一个后端节点宕机后另一个节点也能继续使用redis中的状态。 但其实这种还是慢了而且开发起来很麻烦读写要反复做序列化反序列化深层状态也不能直接hset和hget。建议还是用本地HashMap保存游戏状态。通过多节点、负载均衡每个节点管理部分牌局。 对于游戏里的对象构建Card、Room、Player等对象将这些对象保存在内存中即保存游戏状态。 Room需要记录当前出牌玩家、上一次的出牌、倍率、倒计时、地主牌等信息。 牌要记录花色、大小。
准备
开始前各自都有个准备按钮点击后进入准备中。如果房间满人且全部准备则生成随机牌除了3张地主牌其他的直接发给各个玩家房间进入叫分阶段。
倒计时
考虑到玩家会刷新界面倒计时沙漏不能放在前端由后端统一管理每秒减一并发送给各个玩家以更新。倒计时为0时触发对应事件。
叫分
按照某种顺序开始逐个叫分超时的则不叫。具体规则自行设计。选上地主的玩家获得地主牌并从他开始出牌。房间进入正式开始阶段。
提示出牌
如果上家出了牌则查询我的手牌中是否有比他大的。我这里只是简单写下这里的牌型判断和大小比较最好封装为函数因为除了提示除外直接出牌时也要比较如果不行要给用户对应显示。
permutation:ListListCard 全排列枚举手牌中所有可能2^n最大不超过2^20只在客户端计算
hint None
for cards in permutation:if cards 不合法:continueif cards 是炸弹:...if cards 是王炸:...if 相同牌型且大于:...
if hint None:...
else:...托管
自动根据提示的第一个方案出牌。
出牌校验
考虑到客户端可能会乱搞所以在服务端也要对出牌再做一次校验是否真的大于上家的牌。
出牌超时
如果出牌时超时如果上家没出则出最小的一张否则直接打不起。
打不起
清空上一次出牌。
退出重连
退出行为能通过用户点击按钮退出的行为、或网络错误断开websocket连接触发hook这两个捕获到。
如果退出在服务端更新该用户为托管并更新客户端。如果重新连接则将他的状态改为正常并将当前游戏状态推送给该用户。
对于逃跑需要在结算时给予惩罚。
结算
某玩家的牌出完后先让前端放一个出牌动画然后再让各用户展示手牌然后再显示结算框。
自行设计规则主要是根据叫分、炸弹飞机等数量做加法、乘法等对输赢玩家做金币和rank分的增减。
注意结算框是另一个推送请求在这个请求推送后直接在服务端修改该房间状态为准备中。
点击结算框的确认的玩家在前端还是留在房间内显示准备中。即后端其实已经改了但是页面转换逻辑留给前端。这样效果比较好。
人机
使用 RL 模型github.com/kwai/Douzero我做了一些调整方便使用它github.com/urlyy/DouZero_I_have_trimmed
放个图做封面图