1、连续VIP等级的奖励领取(二进制移位)

1、策划规定

正常在游戏中会有规定VIP等级,而充值达到一定的VIP等级就可以领取对应的奖励,这边这样规定:

  • vip等级从0开始到13,0表示首冲但是未达到vip1的金额,未充值用负数表示
  • 充值到对应的vip等级可以领取该等级及之前等级的所有奖励
  • 奖励的领取不分先后,领取之后就无法继续领取

2、思路分享

        这边也是从GOS项目中看到的方案,觉得很巧妙,就记录下来了。这边主要是用二进制移位的方式来处理。需要记录VIP等级VipLv。举个例子:当VIpLv为0的时候表示首充。那么对0进行移位就可以得到 1<< 0 = 2^0 = 1.也就是说在这种情况下,如果该VIP等级的奖励被领取了,那么就会有:

VipLv 移位得到的结果
0 2^0 = 1
1 2^1 = 2
2 2^2 =4

        我们当然期待通过最简单的方式来存储当前等级被领取情况,以及当前等级及之前等级奖励是否全部被领取的情况

需要存储这两个属性的原因是

  • 第一个属性:如果对应VipLv的奖励被领取了,那么就不能再进行领取
  • 第二个属性:如果当前所有Vip等级的奖励有没被领取的话,可以通过一定的标识告知玩家(比如说红点)

        如果使用两个属性来存储自然是最简单也是最容易想到的,我们甚至可以不需要用二进制,而直接存储被领取等级数组就可以了,但是这种情况下,就需要通过增加数组的元素来存储,并且判定的时候需要遍历查找。那么如果我们需要只通过一个字段(非数组)来存储呢,要怎么去处理?

        这就是这个做法比较聪明的地方,这边只有一个字段存储,该字段表示当前被领取的vip等级的和,比如我们叫它rewardRecieveNum,这种方式必须借助2^n次方的特性才能成立。

        如果我们当前的Viplv为5,领取了0,1,3等级的奖励之后,rewardRecieveNum = 2^0 + 2^1 + 2^3 = 11,那么我们怎么去计算上面两种情况呢:

  • 对于对应VipLv的奖励是否被领取,我们可以通过与操作来实现,11可以表示为二进制的1011,然后如果我们计算VipLv为0的奖励是否领取,我们可以得到2^0表示的二进制 0001,0001 & 1011 = 1,如果我们计算VipLv为2的奖励是否被领取,则可以得到2^2= 4 ,0100 & 1011 = 0 ,说明奖励未被领取,其实二级制的每一位只对应我们的VipLv的每一个等级,所以不会出现VipLv的二进制数占两位的情况,因此该条件下成立
  • 对于是否所有的VipLv奖励都被领取,相对更加简单,我们只需要计算当前的rewardRecieveNum的值是否等于所有VipLv对应二进制数的和即可,比如说 5 =/= 2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 - 1,注意这边在统计数的最后要减掉一个1,因为+1就是进位,代表的是高一位的值,而不是所有低位的和。

3、可能存在的问题

        采用这种方式虽然很巧妙,但是在代码中必须写好注释

        如果Vip等级档位非常多,2的次方溢出的问题,正常游戏感觉VIP等级档位不会非常多,如果特殊情况,也需要考虑到对应的问题

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章