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

举报
黄啊码 发表于 2022/06/29 00:30:57 2022/06/29
【摘要】  黄啊码向来简单粗暴,来,代码伺候 js代码如下: //index.js//获取应用实例const app = getApp() //计数器var interval = null; //值越大旋转时间越长 即旋转速度var intime = 50; Page({ data: { color: [0.5, 0....

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

js代码如下:


  
  1. //index.js
  2. //获取应用实例
  3. const app = getApp()
  4. //计数器
  5. var interval = null;
  6. //值越大旋转时间越长 即旋转速度
  7. var intime = 50;
  8. Page({
  9. data: {
  10. color: [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5],
  11. //9张奖品图片
  12. images: [],
  13. btnconfirm: '/images/dianjichoujiang.png',
  14. clickLuck:'clickLuck',
  15. luckPosition:2,
  16. prizeWeight:[],
  17. titles:[],
  18. },
  19. onLoad:function(){
  20. var that=this;
  21. wx.request({
  22. url: 'XXXXXXX',
  23. method:'POST',
  24. header: {
  25. 'content-type': 'application/json' // 默认值
  26. },
  27. data:{
  28. },success(res){
  29. that.setData({prizeWeight:res.data.data.percent_list});//奖项权重数组,表征各奖项的中奖机会占总数的百分比。比如一等奖的中奖率是1%,二等奖的中奖率是5%
  30. that.setData({images:res.data.data.images_list});
  31. that.setData({titles:res.data.data.title_list});
  32. //例子:prizeWeight:({5,5,10,20,30,10,10,10})记住是按顺序的,所有的加起来等于100,images就是八张图片的地址,titles就是八个标题的内容
  33. }
  34. })
  35. },
  36. //点击抽奖按钮
  37. clickLuck:function(){
  38. var e = this;
  39. var weightSum = e.data.prizeWeight.reduce(function(prev, currVal){ //计算权重之和:1+5+20+74=100
  40. return prev + currVal; //prev 是前一次累加后的数值,currVal 是本次待加的数值
  41. }, 0);
  42. console.log(weightSum);
  43. var random = Math.random()*weightSum;
  44. console.log(random);
  45. var concatWeightArr = e.data.prizeWeight.concat(random); //将随机数加入权重数组
  46. console.log(concatWeightArr);
  47. var sortedWeightArr = concatWeightArr.sort(function(a, b){return a-b;}); //将包含随机数的新权重数组按从小到大(升序)排序
  48. console.log(sortedWeightArr);
  49. var randomIndex = sortedWeightArr.indexOf(random); //索引随机数在新权重数组中的位置
  50. console.log(randomIndex);
  51. randomIndex = Math.min(randomIndex, e.data.images.length -1); //权重随机数的下标不得超过奖项数组的长度-1,重新计算随机数在奖项数组中的索引位置
  52. console.log(randomIndex);
  53. e.setData({luckPosition:randomIndex});
  54. //设置按钮不可点击
  55. e.setData({
  56. btnconfirm:'/images/dianjichoujiangd.png',
  57. clickLuck:'',
  58. })
  59. //清空计时器
  60. clearInterval(interval);
  61. var index = 0;
  62. console.log(e.data.color[0]);
  63. //循环设置每一项的透明度
  64. interval = setInterval(function () {
  65. if (index > 7) {
  66. index = 0;
  67. e.data.color[7] = 0.5
  68. } else if (index != 0) {
  69. e.data.color[index - 1] = 0.5
  70. }
  71. e.data.color[index] = 1
  72. e.setData({
  73. color: e.data.color,
  74. })
  75. index++;
  76. }, intime);
  77. //模拟网络请求时间 设为两秒
  78. var stoptime = 2000;
  79. setTimeout(function () {
  80. e.stop(e.data.luckPosition);
  81. }, stoptime)
  82. },
  83. stop: function (which){
  84. var e = this;
  85. //清空计数器
  86. clearInterval(interval);
  87. //初始化当前位置
  88. var current = -1;
  89. var color = e.data.color;
  90. for (var i = 0; i < color.length; i++) {
  91. if (color[i] == 1) {
  92. current = i;
  93. }
  94. }
  95. //下标从1开始
  96. var index = current + 1;
  97. e.stopLuck(which, index, intime, 10);
  98. },
  99. /**
  100. * which:中奖位置
  101. * index:当前位置
  102. * time:时间标记
  103. * splittime:每次增加的时间 值越大减速越快
  104. */
  105. stopLuck: function (which, index,time,splittime){
  106. var e = this;
  107. //值越大出现中奖结果后减速时间越长
  108. var color = e.data.color;
  109. setTimeout(function () {
  110. //重置前一个位置
  111. if (index > 7) {
  112. index = 0;
  113. color[7] = 0.5
  114. } else if (index != 0) {
  115. color[index - 1] = 0.5
  116. }
  117. //当前位置为选中状态
  118. color[index] = 1
  119. e.setData({
  120. color: color,
  121. })
  122. //如果旋转时间过短或者当前位置不等于中奖位置则递归执行
  123. //直到旋转至中奖位置
  124. if (time < 400 || index != which){
  125. //越来越慢
  126. splittime++;
  127. time += splittime;
  128. //当前位置+1
  129. index++;
  130. e.stopLuck(which, index, time, splittime);
  131. }else{
  132. //1秒后显示弹窗
  133. setTimeout(function () {
  134. wx.showModal({
  135. title: '提示',
  136. content: e.data.titles[which],
  137. showCancel: false,
  138. success: function (res) {
  139. if (res.confirm) {
  140. //设置按钮可以点击
  141. e.setData({
  142. btnconfirm: '/images/dianjichoujiang.png',
  143. clickLuck: 'clickLuck',
  144. })
  145. }
  146. }
  147. })
  148. }, 1000);
  149. }
  150. }, time);
  151. console.log(time);
  152. }
  153. })

前端:


  
  1. <!--index.wxml-->
  2. <view class="container">
  3. <view class='frame_view'>
  4. <view class='frame_row'>
  5. <image class='frame_item' style='opacity:{{color[0]}}' src='{{images[0]}}'></image>
  6. <image class='frame_item' style='opacity:{{color[1]}}' src='{{images[1]}}'></image>
  7. <image class='frame_item' style='opacity:{{color[2]}}' src='{{images[2]}}'></image>
  8. </view>
  9. <view class='frame_row'>
  10. <image class='frame_item' style='opacity:{{color[7]}}' src='{{images[7]}}'></image>
  11. <image class='frame_item' src='{{btnconfirm}}' bindtap='{{clickLuck}}'></image>
  12. <image class='frame_item' style='opacity:{{color[3]}}' src='{{images[3]}}'></image>
  13. </view>
  14. <view class='frame_row'>
  15. <image class='frame_item' style='opacity:{{color[6]}}' src='{{images[6]}}'></image>
  16. <image class='frame_item' style='opacity:{{color[5]}}' src='{{images[5]}}'></image>
  17. <image class='frame_item' style='opacity:{{color[4]}}' src='{{images[4]}}'></image>
  18. </view>
  19. </view>
  20. </view>

 wxss:


  
  1. /**index.wxss**/
  2. .frame_view{
  3. bottom: 160rpx;
  4. left: 60rpx;
  5. right: 60rpx;
  6. width:590rpx;
  7. height:590rpx;
  8. padding: 20rpx;
  9. background: #792db3;
  10. z-index: 3;
  11. display: flex;
  12. flex-direction: column;
  13. justify-content: space-between;
  14. align-items: center;
  15. border-radius: 30rpx;
  16. }
  17. .frame_row{
  18. width:580rpx;
  19. height:180rpx;
  20. display: flex;
  21. flex-direction: row;
  22. justify-content: space-between;
  23. align-items: center;
  24. }
  25. .frame_item{
  26. width:180rpx;
  27. height:180rpx;
  28. }

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

看啥?进来扫码,一起玩代码石墨文档是一款轻便、简洁的在线协作文档工具,PC端和移动端全覆盖,支持多人同时对文档编辑和评论,让你与他人轻松完成协作撰稿、方案讨论、会议记录和资料共享等工作。https://shimo.im/docs/8PGqp3cHtwVxcTPp

文章来源: markwcm.blog.csdn.net,作者:黄啊码,版权归原作者所有,如需转载,请联系作者。

原文链接:markwcm.blog.csdn.net/article/details/121751638

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。