美文网首页
游戏匹配和结算之防御式编程

游戏匹配和结算之防御式编程

作者: 疯狂猪宝宝 | 来源:发表于2017-07-21 23:04 被阅读0次

在开发球球游戏的过程中,为了解决事先没有考虑到的问题,最终的实现和设计有所出入。其中有一部分是关于防御式编程的心得,我想单独拿出来说一下。
相关文章:游戏匹配和结算设计游戏匹配和结算实现

游戏第一个版本出去,在外网我们遇到很多意想不到的问题。比如有些玩家打完一局比赛,会反复获得奖励,我们猜测是重复结算引起的。还有些玩家打完一局比赛,没有结算,导致业务服认为玩家没有完成比赛,要求玩家重连回原来的比赛,但是连到房间服会发现房间不存在,进入黑屏状态。为此我增加了很多防御式的代码。

  1. 最初的设计里并没有RemovePlayer消息,因为我认为RemovePlayer是由结算引起的,所以业务服收到房间结算消息(RoomResult)或者玩家结算消息(PlayerResult),就可以移除掉对应玩家。但实际上,结算业务偶尔会出现问题,RoomResult/PlayerResult消息不会发送,影响到RemovePlayer的处理。增加RemovePlayer消息后,不管结算业务是否异常,都会向业务服发送RemovePlayer消息。

  2. 当玩家请求进入房间服时,发现房间不存在,第一会通知玩家返回逻辑服,第二会通知逻辑服,移除该房间,防止玩家陷入“请求进入房间服-返回业务服”的循环。

  3. 当房间服增加玩家时,可能存在相同id的老的玩家,此时需要先移除老玩家。而移除老玩家是异步执行的,这就需要在场景中管理老玩家。理论上这种情况是不会出现的,玩家只有结束一局游戏,才能在逻辑服开始下一局游戏。但是并不排除逻辑服出现异常,误认为游戏已结束,提前开始下一局游戏的匹配。

  4. 房间一旦结算,设置gameOver flag,防止重复结算。

  5. 房间的定时器一旦停止,设置terminated flag,防止定时器重新启动。

  6. 当玩家结算后,从房间服移除玩家数据。当场景结算后,从房间服移除场景内所有玩家数据和场景数据。防止在结算后,调用玩家或场景相关操作。

相关文章

  • 游戏匹配和结算之防御式编程

    在开发球球游戏的过程中,为了解决事先没有考虑到的问题,最终的实现和设计有所出入。其中有一部分是关于防御式编程的心得...

  • 游戏匹配和结算设计

    单区单服 游戏采用单区单服模式,职能上分成业务服和房间服。第一个版本的设计,业务服为单点服务器,房间服可以无限拓展...

  • 游戏匹配和结算实现

    匹配 业务服房间管理 业务服维护了房间服的Room。房间服创建Room,业务服创建对应Room,房间服销毁Room...

  • 安全编程的实现方式

    借鉴文章 契约式编程与防御式编程 https://segmentfault.com/a/1190000007558...

  • 防御式编程

    最近业余时间在阅读《代码大全》,阅读“防御式编程”章节的时候非常受启发,自己之前对系统的错误处理这块也确实随意了。...

  • 防御式编程

    编写优秀的代码 代码是程序可识别的代码 代码是程序员可识别的代码 防御性编程 防御性编程(Defensive pr...

  • 防御式编程

    防御式编程 在防御式驾驶中要建立这样一种思维,那就是你永远也不能确定另一位司机将要做什么。这样才能够确保在其他人做...

  • 契约式编程与防御式编程

    1. 防御式编程 对于 “防御式编程” ,《代码大全》给我们提供了一个定义: 人类都是不安全、不值得信任的,所有的...

  • 防御式编程EAFP vs LBYL

    防御式编程EAFP vs LBYL EAFP:easier to ask forgiveness than per...

  • 防御式编程(二)

    《代码大全2》阅读随笔 错误处理技术 一些系统遇到错误后的指导建议 返回中立值; 换下一个正确数据; 返回前次相同...

网友评论

      本文标题:游戏匹配和结算之防御式编程

      本文链接:https://www.haomeiwen.com/subject/evvjkxtx.html