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等級檔位不會非常多,如果特殊情況,也需要考慮到對應的問題

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