玩剑与远征突发奇想,突然想了想抽卡逻辑,我将抽卡分为两种,一种是存在卡池缓存地(当然也存在保底),还有一种就是保底补偿的(比如开宝箱,王者水晶,荣耀水晶),以下内容都是自己瞎扯,仅仅提供了一种可行性罢了,如有其他方案,欢迎讨论。
先说第一种,这种普遍存在于卡牌游戏中,就拿剑与远征为例吧(这边我已经把剑与远征这款游戏的抽卡逻辑归于这类了),具体的我就不说了,就说一个钻石抽卡的情况。三次十连必有一张紫卡,首先会有一个30张卡片的卡池1,每次抽到紫卡就会刷新卡池1。
这里就涉及到一个问题,单抽走不走卡池呢,我认为单抽是不应该走卡池1的,先确定一个前提,那就是抽到紫卡刷新卡池。这边我们可以先假设十连必出紫卡并且单抽是走卡池的,也就是说我单抽十次或者十连一定会出紫卡,单抽10次3000钻,十连2700钻,很显然这种情况下单抽第9次出紫卡才跟十连相同的成本,很显然我可能单抽1-8次出紫卡,那就是单抽赚了,第十次才是十连赚,所以我可以大胆的猜想单抽不应该计入卡池1。
第二个问题,怎么保证卡池1中必有一张紫卡呢,这个比较简单我认为,就是从一个大卡池2中随机拿30张卡出来,如果没有紫卡就清空卡池缓存,重新获取。为什么我要说从大卡池2中获取呢,我只是做了一个大胆的假设,这样很多问题就能说得通了,首先是卡牌概率的问题,他既然都明确告诉你了白蓝紫卡的概率,引入大卡池概念明显是最简单的做法了。然后就是心愿单,他会根据你的心愿单以一种类似推荐的算法把你分给各个大卡池,这样子你就是从具有某种特征的卡池中拿的30张卡,你单抽的卡也是从对应的大卡池里边获取的。最后就是大卡池理论纯属我胡扯,主要是为了满足概率问题。这里我为什么要引入大卡池概念呢,虽然可能会占用一部分空间,但是如果通过算法实现概率的话对于服务器是一种压力,对于这种能够重复利用的资源显然运用缓存机制能够很大程度提高性能。
经过上面两个假设,单抽的概率就应该是大卡池的总体概率,而十连的概率理论上是要高于总体概率的(不过这矛盾并不大),按照自己的实现逻辑,30张卡中没有紫卡就重新获取。当然上面提到的卡,卡池只是一个形象的概念,在考虑性能的问题上,完全可以编写出只用数字表示卡片的算法(就比如从1-1000000中获取一个数,每个数代表一张卡片),这样子保证概率的情况下是可以的。
第二种保底补偿就简单很多,会在一个临界值,也就是保底给奖励,这种有一个特征,几乎都是最后几次才出。这种实现起来的话就是前边一直保持超低概率或者良心一点的随着次数的增加概率逐渐提高,当次数达到最大值发奖励,这种有一个好处就是没有了卡池的概念,仅仅需要次数映射概率即可,性能几乎没有压力。
如何判断是第一种方案还是第二种方案无非就是看第一次十连出紫的概率大不大,如果很小基本都是第三次出紫的话那基本就是第二种方案了,不过第二种方案做到第一种方案的效果也是可行的,不过第一种方案对于复杂卡池实现起来很显然简单许多,第二种方案偏向单物品,就比如开宝箱。
以上都是我自己抽象的抽卡逻辑,都是自己瞎扯,仅仅提供了一种可行性罢了,并没有考虑超大吞吐量对性能影响的实际情况,如果有大佬们知道真实地逻辑请一定要纠正我呀,拜托了!