前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【黄啊码】小程序:九宫格抽奖如何实现?可控制抽奖率

【黄啊码】小程序:九宫格抽奖如何实现?可控制抽奖率

作者头像
黄啊码
发布2022-01-10 14:17:44
1.3K0
发布2022-01-10 14:17:44
举报
文章被收录于专栏:黄啊码【CSDN同名】

黄啊码向来简单粗暴,来,代码伺候

js代码如下:

代码语言:javascript
复制
//index.js
//获取应用实例
const app = getApp()

//计数器
var interval = null;

//值越大旋转时间越长  即旋转速度
var intime = 50;

Page({
  data: {
    color: [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5],
    //9张奖品图片
    images: [],
    btnconfirm: '/images/dianjichoujiang.png',
    clickLuck:'clickLuck',
    luckPosition:2,
    prizeWeight:[],
    titles:[],
  },

  onLoad:function(){
    var that=this;
    wx.request({
        url: 'XXXXXXX', 
        method:'POST',
        header: { 
          'content-type': 'application/json' // 默认值
        },
        data:{
        },success(res){
          that.setData({prizeWeight:res.data.data.percent_list});//奖项权重数组,表征各奖项的中奖机会占总数的百分比。比如一等奖的中奖率是1%,二等奖的中奖率是5%
          that.setData({images:res.data.data.images_list});
          that.setData({titles:res.data.data.title_list});
          //例子:prizeWeight:({5,5,10,20,30,10,10,10})记住是按顺序的,所有的加起来等于100,images就是八张图片的地址,titles就是八个标题的内容
          
        }
    })
    
  },

  //点击抽奖按钮
  clickLuck:function(){
    var e = this;
    var weightSum = e.data.prizeWeight.reduce(function(prev, currVal){    //计算权重之和:1+5+20+74=100
        return prev + currVal;    //prev 是前一次累加后的数值,currVal 是本次待加的数值
    }, 0);
    console.log(weightSum);
    var random = Math.random()*weightSum;
    console.log(random);
    var concatWeightArr = e.data.prizeWeight.concat(random);    //将随机数加入权重数组
    console.log(concatWeightArr);
    var sortedWeightArr = concatWeightArr.sort(function(a, b){return a-b;});    //将包含随机数的新权重数组按从小到大(升序)排序
    console.log(sortedWeightArr);
    var randomIndex = sortedWeightArr.indexOf(random);    //索引随机数在新权重数组中的位置
    console.log(randomIndex);
    randomIndex = Math.min(randomIndex, e.data.images.length -1);    //权重随机数的下标不得超过奖项数组的长度-1,重新计算随机数在奖项数组中的索引位置
    console.log(randomIndex);
    e.setData({luckPosition:randomIndex});
    //设置按钮不可点击
    e.setData({
      btnconfirm:'/images/dianjichoujiangd.png',
      clickLuck:'',
    })
    //清空计时器
    clearInterval(interval);
    var index = 0;
    console.log(e.data.color[0]);
    //循环设置每一项的透明度
    interval = setInterval(function () {
      if (index > 7) {
        index = 0;
        e.data.color[7] = 0.5
      } else if (index != 0) {
        e.data.color[index - 1] = 0.5
      }
      e.data.color[index] = 1
      e.setData({
        color: e.data.color,
      })
      index++;
    }, intime);

    //模拟网络请求时间  设为两秒
    var stoptime = 2000;
    setTimeout(function () {
      e.stop(e.data.luckPosition);
    }, stoptime)

  },

  stop: function (which){
    var e = this;
    //清空计数器
    clearInterval(interval);
    //初始化当前位置
    var current = -1;
    var color = e.data.color;
    for (var i = 0; i < color.length; i++) {
      if (color[i] == 1) {
        current = i;
      }
    }
    //下标从1开始
    var index = current + 1;

    e.stopLuck(which, index, intime, 10);
  },


/**
 * which:中奖位置
 * index:当前位置
 * time:时间标记
 * splittime:每次增加的时间 值越大减速越快
 */
  stopLuck: function (which, index,time,splittime){
    var e = this;
    //值越大出现中奖结果后减速时间越长
    var color = e.data.color;
    setTimeout(function () {
      //重置前一个位置
      if (index > 7) {
        index = 0;
        color[7] = 0.5
      } else if (index != 0) {
        color[index - 1] = 0.5
      }
      //当前位置为选中状态
      color[index] = 1
      e.setData({
        color: color,
      })
          //如果旋转时间过短或者当前位置不等于中奖位置则递归执行
          //直到旋转至中奖位置
        if (time < 400 || index != which){
          //越来越慢
          splittime++;
          time += splittime;
          //当前位置+1
          index++;
          e.stopLuck(which, index, time, splittime);
        }else{
        //1秒后显示弹窗
          setTimeout(function () {
             wx.showModal({
               title: '提示',
               content: e.data.titles[which],
               showCancel: false,
               success: function (res) {
                 if (res.confirm) {
                   //设置按钮可以点击
                   e.setData({
                     btnconfirm: '/images/dianjichoujiang.png',
                     clickLuck: 'clickLuck',
                   })
                 }
               }
             })
              
          }, 1000);
        }
    }, time);
    console.log(time);
  }
})

前端:

代码语言:javascript
复制
<!--index.wxml-->
<view class="container">
  <view class='frame_view'>
<view class='frame_row'>
<image class='frame_item' style='opacity:{{color[0]}}' src='{{images[0]}}'></image>
<image class='frame_item' style='opacity:{{color[1]}}' src='{{images[1]}}'></image>
<image class='frame_item' style='opacity:{{color[2]}}' src='{{images[2]}}'></image>
</view>

<view class='frame_row'>
<image class='frame_item' style='opacity:{{color[7]}}' src='{{images[7]}}'></image>
<image class='frame_item' src='{{btnconfirm}}' bindtap='{{clickLuck}}'></image>
<image class='frame_item' style='opacity:{{color[3]}}' src='{{images[3]}}'></image>
</view>

<view class='frame_row'>
<image class='frame_item' style='opacity:{{color[6]}}' src='{{images[6]}}'></image>
<image class='frame_item' style='opacity:{{color[5]}}' src='{{images[5]}}'></image>
<image class='frame_item' style='opacity:{{color[4]}}' src='{{images[4]}}'></image>
</view>
</view>
</view>

wxss:

代码语言:javascript
复制
/**index.wxss**/
.frame_view{
  bottom: 160rpx;
  left: 60rpx;
  right: 60rpx;
  width:590rpx;
  height:590rpx;
  padding: 20rpx;
  background: #792db3;
  z-index: 3;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: center;
  border-radius: 30rpx;
}
.frame_row{
  width:580rpx;
  height:180rpx;
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  align-items: center;
} 
.frame_item{
  width:180rpx;
  height:180rpx;
}

嗯,就这样,朕累了,如果还不会,戳我头像,使劲戳,OK,我的宝?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档