这个是有可能发生的,客户端同时 A挑战B,B挑战C。我的理解是对2个对象同时上锁,不知道各位同仁是否有更好地建议!

解决方案 »

  1.   

    个人感觉这些情况不应该通过锁来解决,而是制定的规则问题,比如针对第一种情况,假如A先战胜了C,现将A、C交换位置,然后B战胜了C,这时候可以判断A和B之前的排名,A排名比B靠前,可以将B放在A现在位置的后面,反之则把B放在A现在位置的前面。
      

  2.   

    详细一点说,A挑战B,出结果A战胜了B,那么一个“如果B名次高于A,则A、B名次互换“的事件排入一个单线程队列,事件执行时检查A和B的名次,若满足条件则互换。单线程队列相当于对于其中的任何一个事件,事件执行时已经确保锁定了整个队列。为什么要检查A和B的名次? 因为当 “如果B名次高于A,则A、B名次互换“ 这个事件排进队列时,无法判断是不是已经有名次低于A的C挑战B成功的事件排在了队列的前面。这里还需要确保玩家在挑战列表内只能看到比自己名次高的挑战对象。
      

  3.   

    如果根据挑战结果,排名变化的逻辑不同,还可能有更复杂的需求,比如下面这种排名:A
    B
    C
    D
    E
    FE挑战B,同时F挑战B,F先结束,胜,排名变成:A
    F
    C
    D
    E
    B然后这时E也获胜:一种设计是E的挑战白费了,名次不变,这样如果玩家注意到辛辛苦苦挑战白费,可能会不爽。另一种更合理的逻辑是E挑战成功后排名变成:A
    F
    E
    C
    D
    B相当于E名次窜到CD之前,而CD的名次向后顺延。这种设计的合理之处在于“任何一个玩家X,如果他的名次在另一个玩家Y之前,那么他要么直接战胜过Y,要么战胜过战胜过Y的玩家Z,即X直接或间接强于Y”。E挑战B时,B排在CD之前,即E挑战B时B强于CD,那么战胜了B的E也强于CD,所以把E排在他们前面,而对于C和D,由于有两人同时战胜了强于他们的B,所以他们的名次被向后顺延。这里会产生更复杂的情况,因为C和D可能同时挑战了别人和被别人挑战,所以当E战胜,发现B不在原位时,不能单纯以CD作为参照物往上爬,同样的道理F作为参照物也是靠不住的,——事实上没有一个玩家是靠得住的参照物,因为大家都可能在变;也不能单纯用E挑战B时他们的排位差值,因为CDF都可能在E结束之前爬得更高,同时也可能有下面的玩家爬上来挤进从E到F的这一段内……这种复杂需求要解决也不是没有办法,比如当任何一个玩家X在挑战比他高的玩家Y时,可以往Y的手里放一个参照物,参照物有可变的属性标明假如挑战获胜是互换还是爬到参照物的后一名,当Y因为各种原因要换位时,参照物传递给下一个合适的玩家………
      

  4.   

    我觉得这种混战排名肯定乱,打个比方,A赢了B,B赢了C,C赢了A,那最后谁是怎么排呢?A第一?C不服;C第一?B不服;B第一?A不服。
    当然,还是有一种情况解决的,就像现在的天天飞车,很好的解决了这个问题。每个人只关注自己的排名,比如说上面那种情况。在每个角色的排名里,他本人都是第二名,互不影响。在别人的排名里,都是第一或第三名,奖品只发给个人排名里的,那每个人都拿到第二名的奖品。不冲突。
    如果照上面说的,可以混战而排名的话。
    一,每个挑战对象在比赛的时候,不能接受或被接受挑战(就好比你网上玩斗地主,你在玩的时候,别人是进不来你的房间和你玩的)
    二,允许比赛的时候被动接受第三者的挑战(这个感觉有点乱)。
    无论上述哪种方式,排名按时间挑战结果。比如说A和C在比寒的时候,B挑战A。AC先结束,A赢A第一,这时候B赢了A,B第一,如果这时候C又赢了B,C第一。
      

  5.   

    大哥,你的逻辑有问题啊,a挑战b,b挑战c,c挑战a,他们之前总得有个先后顺序吧,比如a>b>c,那么请问a挑战c干嘛???a脑残???
      

  6.   

    制定规则:排名高不能挑战排名低,A挑战B的时候,B也同时挑战C,A战胜,B也战胜等==a>b>c??????我素什么都不懂的小白,求指教
      

  7.   

    实时游戏,服务器socket实现,这个可能发生,需在更新排名结果处加锁一个一个执行;
    非实时游戏,这个需要是不行的,必须一个人只能同时被另一个人挑战;