JS实战-实现简易的抽卡(召唤)程序|青训营

179 阅读2分钟

需求:做一个抽奖模块,要求如下 抽中宠物的概率为0.8%,稀有道具召唤基础概率为29.2%,普通道具召唤基础概率为70%。
如果连续35次没有获得推荐宠物,则下一次召唤获得推荐宠物的概率将从原本的0.8%提升至3.8%,依此类推每次提升3%的召唤获得概率。如果连续49次没有获得推荐宠物,则第50次必出推荐宠物。若当前已许愿,则获得的推荐宠物必为许愿宠物. 各位洛批有没有觉得很熟悉,是不是有似曾相识的感觉(懂的都懂)

这个我一开始是用原生写的,后来觉得操dom太长了就换jq了.这边我就不放jq代码了,大家应该都没怎么学过jq,我当时是用jq写了正式版的,还加了一个查看记录的功能.有兴趣可以私聊我. 先贴个ui代码,大家可以把图片换成自己喜欢的图片.如果没图片就设置个背景颜色就ok.

<div class="box">
<div class="contentBox">
  <p>你的钻石余额 <i class="money">800</i></p>
  <div class="gambled"><button class="gambled1">抽一次</button> <button class="gambled10">抽十次</button></div>
  <p>抽奖次数:<i class="num">0</i> 消耗钻石:<i class="cost">0</i></p>
  <div id="gift" class="result">恭喜你!抽中了宠物</div>
  <div id="rubbish1" class="result">抽中了普通道具,无事发生</div>
  <div id="rubbish2" class="result">抽中了稀有道具,继续努力吧</div>
  <button class="reset">重置</button>
 
</div>
</div>

效果大致是这样的:

抽奖界面.png

那下面我们来看一下代码.我简单说一下思路.ps:写的可能比较长比较冗余大家别喷我,因为咱是农村人,也没学过算法,一切都是靠自己琢磨,仅供参考.

  1. 如何判定是否中奖? 我是把0~1分成了三份,然后调用Math.random()方法看数落在哪个区间,判定中了什么奖

  2. 如何在抽完一次之后增加概率? 那就是把区间扩宽一点 例如第一次 0-0.8%区间为中奖区间, 第36次就0-3.8%为中奖区间.

  3. radNum1000 >= 8+30(n-35) && radNum1000 < 300-15(n-35) 是什么意思?这个是因为小数精度丢失问题,要把他转成整数,不然会出问题.

  4. 其他:操作dom这种就不必多说.最后那个while循环是用来抽十次的,也就是说,抽十次实际上就是调用十次那个抽一次的函数.

    效果展示: 中奖之后会弹窗,然后画面大致是这样....

中奖界面.png

代码贴出来大家自己琢磨琢磨

 ( function (){
      const gift = document.querySelector('#gift');
    const rubbish1 = document.querySelector('#rubbish1');
    const rubbish2 = document.querySelector('#rubbish2');
    const resetBtn =  document.querySelector('.reset');
    const gambled1Btn = document.querySelector('.gambled1');
    const gambled10Btn = document.querySelector('.gambled10');
    let arr = [];
    function reset () {
      gambled1Btn.style.display = 'inline-block';
      gambled10Btn.style.display = 'inline-block';
      resetBtn.style.display = 'none';
      gift.style.display = 'none';
      document.querySelector('.money').innerHTML = 800;
      document.querySelector('.num').innerHTML = 0;
      document.querySelector('.cost').innerHTML = 0;
      arr = [];
    }
    function gambled1(m,n,c) {
      gift.style.display = 'none'
      rubbish2.style.display = 'none'
      rubbish1.style.display = 'none'
      const radNum = Math.random()
      let result = -1; // 1表示普通道具 2表示稀有道具 0表示中奖
      m -= 16;
      n++;
      c+=16;
      document.querySelector('.money').innerHTML = m;
      document.querySelector('.num').innerHTML = n;
      document.querySelector('.cost').innerHTML = c;
      if (n <= 35) {
        if (radNum < 0.008) {
          result = 0
       alert('恭喜你 中奖啦!')
        }
        else if (radNum >= 0.008 && radNum < 0.3) {
          result = 2
        }
        else {
          result = 1
        }
      }
      else if (n > 35 && n < 50) {
        if (radNum*1000 < 8+30*(n-35)) {
          result = 0
       alert('恭喜你 中奖啦!')
        }
        else if (radNum*1000 >= 8+30*(n-35) && radNum*1000 < 300-15*(n-35) ) {
          result = 2
        }
        else {
          result = 1
        }
      }
     else if (n == 50) {
      result = 0
      alert('保底了!大非酋')
      
     }
     switch(result) {
      case 0: 
      gift.style.display = 'block'
        resetBtn.style.display = 'block'
        gambled1Btn.style.display = 'none'
        gambled10Btn.style.display = 'none'
      break;
      case 1:
      rubbish1.style.display = 'block'
      break;
      case 2:
      rubbish2.style.display = 'block'
      break;

     }
     arr.push(result)
     console.log("第"+n+"次"+radNum)
     console.log(arr)
    }
    gambled1Btn.addEventListener('click', function() {
      let money = parseInt(document.querySelector('.money').innerHTML)
    let num = parseInt(document.querySelector('.num').innerHTML)
    let cost = parseInt(document.querySelector('.cost').innerHTML)
      gambled1(money,num,cost)
    })
    resetBtn.addEventListener('click',function() {
      reset()
    })
    gambled10Btn.addEventListener('click',function() {
      let i = 0;
      if (parseInt(document.querySelector('.money').innerHTML) < 160) {
      alert('余额不足!请充值')
      return;
    }
      do {
    let money = parseInt(document.querySelector('.money').innerHTML)
    let num = parseInt(document.querySelector('.num').innerHTML)
    let cost = parseInt(document.querySelector('.cost').innerHTML)
        gambled1(money,num,cost);
        i++;
        if (resetBtn.style.display == 'block') {
          i = 11;
        }
      }
      while(i < 10)
    })
    }) ()
    ```