一元夺宝

Posted by donkey on December 12, 2016

2016年,人生没有大变化,上半年辞职学习了下Unity游戏前端开发,另外在CSDN上写了十几篇技术文章,下半年本来是准备出去玩一阵子,然后去影视城跑跑龙套,这里并不是对拍电影有多少兴趣,只是好奇影片背后的东西,当然最后没有去成。9月份加入新公司参与《元气战姬学院》游戏服务器端开发,项目已经进行了一年多,框架都已经搭好了,剩下要做的只是一些新功能开发。责任相较于之前就没有那么重了,而我又是一个不喜欢承担太大责任的人,只想着把一些简单的事情做好,再加上工作进度不像以前那样紧凑,可以有更多时间来思考,这样一来既可以把事情做的更好,又能锻炼自己的思考能力,所以目前对我来说这份工作是适合我的。貌似有点跑题了,下面说说一元夺宝,夺宝是我入职公司做的第二个功能,大概规则就是,每个玩家出一块钱买一个很贵的东西。然后系统再从这些人中随机出来一个人,随到谁谁就拿走那个东西。其中有一点和网易的一元夺宝是有点不一样的,不一样的是每一组商品次数没有购买完也能开奖。

服务器要做的事注意以下2点:

  • 页面显示的人次数据所有玩家共享,即服务器要保证不会出现购买次数超出上限
  • 活动定开奖或参与人次满立即开奖,这里服务器要考虑的是如何保证不可控因素(如服务器维护,无法定时开奖和刷新商品)不影响到整个活动流程.

一、购买

购买这块主要是保证多个玩家同时购买时不会出现购买次数超出上限的可能,所以每次玩家购买时,我都会先将商品上锁。然而使用锁会导致程序性能低下,这里我做了个简单的优化,把每一个商品作为锁,当某一个商品被锁住时,不影响其他玩家都买别的商品,并且只在同步代码块内处理少量逻辑。 如图:

1

代码如下:

@Override  
   public void lock() throws BuyException {  
       synchronized (item) {  
           //宝物剩余人次已不足  
           if (count > item.remain)  
               throw new BuyException(244005);  
  
           //活动正在开奖  
           if (item.isOpenLottery())  
               throw new BuyException(244011);  
           //商品剩余数量减去购买数量  
           item.remain -= count;  
       }  
   }  

二、定时刷新商品、开奖

定时的东西大都是是放在一个线程里执行,但线程有可能不会执行它,原因有可能是人为因素的影响、也有可能是系统本身的问题。总之定时执行的东西还是少用为好。 假如一开始你的设计是这样:到了开奖时间线程准备执行开奖,但是不巧如果服务器恰好在这个时间内需要重启,重启后将会错过开奖时间导致开奖失败。 所以这里这样设计是不行的,那怎么办?既然找到了问题出在定时这块,那么就做一个非定时的开奖逻辑。很简单,只要在刷新商品时,同时保存该商品的开奖时间,下次线程执行时只要当前系统时间大于上一次保存的开奖时间则开奖。

刷新商品也是使用了同样的逻辑,如下图所示:

2

三、说说网易的一元夺宝

我们先来看看网易的一元夺宝规则

  • 1、商品的最后一个号码分配完毕后,将公示截止该时间点本站全部商品的最后50个参与时间;
  • 2、将这50个时间的数值进行求和(得出数值A)(每个时间按时、分、秒、毫秒的顺序组合,如20:15:25.362则为201525362);
  • 3、为保证公平公正公开,系统还会等待一小段时间,取最近下一期中国福利彩票“老时时彩”的揭晓结果(一个五位数值B);
  • 4、(数值A+数值B)除以该商品总需人次得到的余数 + 原始数 10000001,得到最终幸运号码,拥有该幸运号码者,直接获得该商品。

以上规则看似能保证公平的一条是第三条引入第三方的数字参与开奖,但是第三方数字并不能保证庄家不能作弊。比如: 有一组商品提供100个号码,每个号码卖1RMB,假如每件商品的成本是80,利润20 如果庄家用机器人凑数买了20个号码,剩下都是玩家购买的,庄家中奖几率是20%

  • 1、如果是庄家中奖,那么庄家这一组的利润是玩家消费的80RMB
  • 2、如果是玩家中奖,那么庄家亏损20RMB

所以庄家是可以作弊的,但是有一定风险性,既然每组商品都有20RMB利润,商家完全没有作弊的必要!当然我们是没有引入第三方数据参与开奖,是完全可以零风险作弊的,不过我想说的是我们并没有作弊,可是怎么样让玩家相信我们没有作弊,这个策划应该考虑是否像网易那样引入第三方数据参与开奖…