对局有关通信¶
首先需要知道的是,WebSocket 通信是不是可靠的,即是否有收到消息的确认机制? 玩家在线检查 需要维护一个 Client / Host 间的心跳机制,每一段时间握手一次。 - 自玩家加入房间后就开始进行。 - 心跳握手失败持续一段时间后,认为玩家掉线 - 如果上次心跳成功与这次心跳成功间,出现了发向 Client 的信息,可能要考虑重发? 准备阶段 1. 房间状态初始化(发给加入房间的 Client):加入房间后,从 Host 获取房间内玩家信息,以及准备状态 2. 玩家准备/取消准备(Client -> Host):该玩家进行准备/取消准备 3. 状态更新(广播): - 房间加入新玩家,广播其用户信息 - 有玩家退出,广播是哪一个用户,这样前端可以把他从视图中移除; - 玩家的准备状态变化 - 对局开始 对局期间 1. 发牌(点对点,Host -> Client):告知该用户被发到了什么牌 2. 玩家动作/出牌(Client -> Host):告知 Host,用户选择了出什么牌/做什么动作 3. 玩家动作/出牌(Host -> Client):Host 告知用户,应开始选择出什么牌/做什么动作 4. 对局状态更新(广播): - 有玩家的牌数量发生变化,比如发牌/出牌之后 - 其他玩家选择的出牌/动作结果 - 有规则规定的“默认属性”发生更新:比如斗地主,玩家类就应该设置一个“身份”属性;这些默认属性是认为在前端有显示的 - 对局结束 在对局结束后,前端显示结算界面,房间自动回到准备阶段。 杂项 玩家掉线 分为连接超时,和玩家直接退出两种。 不需特别处理,直接用心跳机制这套逻辑就能完成检查。 对局进行时,规定若有玩家退出,则直接结束对局,结果记为平局,或者直接倒退回房间准备状态,不做结算。 房间的生命周期 自某用户创建并自动进入房间开始,一个房间的生命周期开始。 在房间内所有玩家均离开房间后,房间被自动摧毁,此房间不可再被访问。 有关房主 现在房主并没有用,作为后端维护的一个属性存在即可。 最开始创建房间的是房主,若房主退出房间,则房主让给进房间时间与房主间隔最近者。 当然,考虑实现难度,现有实现里面,直接把房主随机让给一个玩家就行。 后端规则引擎,应该在执行到什么东西的时候通信? 总结上面的流程,可以知道,在: - 执行到发牌组件:对于被发到牌的,点对点发送发了什么牌;对于所有玩家,广播该玩家牌数变化 - 执行到出牌/动作组件:通知 Client 做出选择,收到选择后,广播玩家出牌/动作结果;此处可以注意到牌数发生了变化,功能隔离角度而言,牌数变化和动作/出牌的广播分开发 - 执行到赋值组件,且对于某个类(比如玩家)设置的“默认属性”赋值