文章目录

  • 1.实现旋转
  • 2.控制得奖概率
  • 3. 控制旋转动画落点
  • 4.测试概率
  • 完整代码

本想找一个现成的,结果发现网上只有能实现转了,但是效果并不是让人很满意,于是我就借鉴一个样式,重新改了js实现,效果如下:

图片素材:(网上一搜就有=-=)

pointer.png

turntable.png

turntable-bg.jpg

1.实现旋转

原理很简单,就是通过css动画来实现旋转动画,用js来控制旋转度,

img[src^="turntable"] {position: absolute;z-index: 5;top: 60px;left: 116px;transition: all 4s;}
//配合oTurntable.style.transform = "rotate(" +transformRotate+ "deg)";

2.控制得奖概率

控制概率,我将100当做概率,概率为 [randmArr[i-1],randmArr[i]),通过控制差值,来控制概率,当然这只是简单的demo,最好用map对象,更合理

  var randmArr = [1,5,10,20,35,55,100] //概率计算为randmArr[i-1]和randmArr[i]之间const rdm =parseInt(Math.random() * (100 - 1) + 1);//随机的数var num = 7console.log('rdm='+rdm);// 统计随机数次数if (!obj[rdm]) {obj[rdm] = 1;} else {obj[rdm] ++;}for(var i = 0;i<randmArr.length;i++){if(i===0){if(rdm>=0&&rdm<=randmArr[0]){num = i+1break}} else {if(rdm>randmArr[i-1]&&rdm<=randmArr[i]){num = i+1break}}}

3. 控制旋转动画落点

虽然js是控制,单动画落点,也需要和我们所得一致,同时我们思考,一般抽奖都会固定旋转几圈,所以我们需要给个初始的旋转圈数,同时下一次旋转又是从上一次落点的基础上进行的,为了控制我们每次都是从原点开始,这样才能控制好落点和js一致,于是我设置初始圈为3圈,而第三圈为,第一次旋转后剩下度数(360-n),这样就能达到每次都是从原点开始,

          nextrdm = Math.floor((num* cat)-24); //定义本次抽奖结果var biginRotate = 2*360+(360-prevrdm) //定义默认的旋转圈数,同时补全使轮盘置零,prevrdm = nextrdm //缓存本次次的角度transformRotate=nextrdm+biginRotate+transformRotate //本次旋转的度oTurntable.style.transform = "rotate(" +transformRotate+ "deg)";

4.测试概率

写是写完了,但不测试都是瞎扯淡,所以我定义了2个对象,用了记录每次所得的随机数和次数,还有中几等奖的次数

obj 和 form对象

  const rdm =parseInt(Math.random() * (100 - 1) + 1);//随机的数
// 统计随机数次数
if (!obj[rdm]) {obj[rdm] = 1;
} else {obj[rdm] ++;
}// 统计中奖概率
if ( !form['a'+num]) {form['a'+num] = 1;
} else {form['a'+num]++
}

示意图

打印发现其实随机比较公平的,但是毕竟我用的100,中奖概率还是比较大了,如果需要再小可以继续放小,

完整代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="description" content=""><meta name="author" content="marendu"><title>转盘抽奖效果</title><!-- 这里是css部分 --><style>#bg {width: 650px;height: 600px;margin: 0 auto;background: url(turntable-bg.jpg) no-repeat;position: relative;}img[src^="pointer"] {position: absolute;z-index: 10;top: 155px;left: 247px;}img[src^="turntable"] {position: absolute;z-index: 5;top: 60px;left: 116px;transition: all 4s;}</style>
</head>
<body><!-- 这里是HTML结构部分 --><div id="bg"><img src="pointer.png" alt="pointer"><img src="turntable.png" alt="turntable"></div><button onclick="btn()">概率统计</button><button onclick="test()">测试100次抽奖</button><!-- 这里是js部分 --><script>var oPointer = document.getElementsByTagName("img")[0];var oTurntable = document.getElementsByTagName("img")[1];var cat = 51.4; //总共7个扇形区域,每个区域约51.4度var offOn = true; //是否正在抽奖var transformRotate = 0 //转圈度数var randmArr = [1,5,10,20,35,55,100] //概率计算为randmArr[i-1]和randmArr[i]之间// 打印概率function btn(){console.log(form);console.log(obj);let num = 0Object.keys(obj).map(item=>{num += obj[item]})console.log(num);}oPointer.onclick = function () {if (offOn) {offOn = !offOn;ratating();}}let n= 0var testTime = nullfunction test(){testTime = setInterval(()=>{n++if(n>99){clearInterval(testTime)}ratating();},300);}//旋转//TODO: 规定中奖区间,通过区间判定值var prevrdm = 0; //缓存上一次的旋转度var obj ={} //产生的随机数的次数var form = {} //统计中奖的概率var timer = nullfunction ratating() {var timer = null;const rdm =parseInt(Math.random() * (100 - 1) + 1);//随机的数var num = 7var nextrdm = 0; //本次旋转度console.log('rdm='+rdm);// 统计随机数次数if (!obj[rdm]) {obj[rdm] = 1;} else {obj[rdm] ++;}for(var i = 0;i<randmArr.length;i++){if(i===0){if(rdm>=0&&rdm<=randmArr[0]){num = i+1break}} else {if(rdm>randmArr[i-1]&&rdm<=randmArr[i]){num = i+1break}}}console.log('num='+num);clearTimeout(timer);timer = nulltimer = setTimeout(function () {nextrdm = Math.floor((num* cat)-24); //定义本次抽奖结果var biginRotate = 2*360+(360-prevrdm) //定义默认的旋转圈数,同时补全使轮盘置零,prevrdm = nextrdmtransformRotate=nextrdm+biginRotate+transformRotate //本次旋转的度// 测试中奖的概率时,把下面注释掉,同时将timeout时间设置为0oTurntable.style.transform = "rotate(" +transformRotate+ "deg)";setTimeout(function () {offOn = !offOn;// 统计中奖概率if ( !form['a'+num]) {form['a'+num] = 1;} else {form['a'+num]++}console.log('transformRotate='+transformRotate);if (nextrdm <= cat * 1) { console.warn("一等奖"); console.log("nextrdm=" + nextrdm + "rdm=" + rdm + "," + "4999元"); }else if (nextrdm <= cat * 2) { console.warn("二等奖"); console.log("nextrdm=" + nextrdm + "rdm=" + rdm + "," + "50元"); }else if (nextrdm <= cat * 3) { console.warn("三等奖"); console.log("nextrdm=" + nextrdm + "rdm=" + rdm + "," + "10元"); }else if (nextrdm <= cat * 4) { console.warn("四等奖"); console.log("nextrdm=" + nextrdm + "rdm=" + rdm + "," + "5元"); }else if (nextrdm <= cat * 5) { console.warn("五等奖"); console.log("nextrdm=" + nextrdm + "rdm=" + rdm + "," + "免息服务"); }else if (nextrdm <= cat * 6) { console.warn("六等奖"); console.log("nextrdm=" + nextrdm + "rdm=" + rdm + "," + "提交白金"); }else if (nextrdm <= cat * 7) { console.warn("七等奖"); console.log("nextrdm=" + nextrdm + "rdm=" + rdm + "," + "未中奖"); }}, 0);}, 30);}</script>
</body>
</html>

原生js实现轮盘抽奖,控制中奖概率(完整示例)相关推荐

  1. 原生JS开箱随机抽奖代码

    下载地址原生JS制作开箱随机抽奖小游戏,思路比较简单,十分实用!您可以随意定制抽奖奖品,点击开启按钮,箱子筛选随机产生中奖结果弹窗提示.ps:演示内容无任何含义. dd:

  2. Js实现轮盘抽奖功能,一招帮你解决选择困难症

    不知道今天自己该吃什么,一招帮你解决选择困难症. 通过html+css+js实现一个轮盘抽奖功能.我们可以将平时吃的饭菜输入到代码中,每到纠结的时候只需点开抽一次就可以了. 实现步骤 html代码: ...

  3. java 9宫格抽奖_原生JS实现九宫格抽奖

    本文实例为大家分享了JS实现九宫格抽奖的具体代码,供大家参考,具体内容如下 上代码: 谢谢惠顾 十万元现金 谢谢惠顾 iphone11 抽奖 美的冰箱 谢谢惠顾 50元红包 谢谢惠顾 CSS样式代码: ...

  4. php跳一跳小游戏,原生JS实现的跳一跳小游戏完整实例

    本文实例讲述了原生JS实现的跳一跳小游戏.分享给大家供大家参考,具体如下: 以下说的是闲暇编写的一个小游戏--跳一跳,类似于微信的跳一跳,大体实现功能有: 1.先随机生成地图: 2.按住按钮释放后完成 ...

  5. html实现跳跳棋游戏,原生JS实现的跳一跳小游戏完整实例

    本文实例讲述了原生JS实现的跳一跳小游戏.分享给大家供大家参考,具体如下: 以下说的是闲暇编写的一个小游戏--跳一跳,类似于微信的跳一跳,大体实现功能有: 1.先随机生成地图: 2.按住按钮释放后完成 ...

  6. html鼠标互动旋转立方体,css3 transform及原生js实现鼠标拖动3D立方体旋转的示例介绍...

    本文通过原生JS,点击事件,鼠标按下.鼠标抬起和鼠标移动事件,实现3D立方体的拖动旋转,并将旋转角度实时的反应至界面上显示. 实现原理:通过获取鼠标点击屏幕时的坐标和鼠标移动时的坐标,来获得鼠标在X轴 ...

  7. 原生js 实现九宫格抽奖功能

    1.先绘制一个九宫格轮盘 <div class="bodydom"><div class="block">鸿蒙紫气*1</div& ...

  8. 抽奖自定义中奖概率总结

    比如现在有5个奖品,分别是1.苹果 2.香蕉  3.橙子   4.葡萄 5.柚子 中奖机率如下: 苹果:10% 香蕉:5% 橙子:60% 葡萄:10% 柚子:5% 1.根据奖品个数和中奖机率定义一个奖 ...

  9. 原生js写简易抽奖系统

    效果图 原理: 其实这里的原理就是通过按钮的状态是开始抽奖还是停止 如果i=ture 那就触发定时器 每50毫秒更换一次中奖的内容.如果i=false,那就清除定时器,显示最后的抽奖结果 下面我给大家 ...

最新文章

  1. STP 简介----生成树算法
  2. 不用写语句的轻量级orm_为什么说sqltoy-orm远比mybatis强大
  3. UIView上的控件使用push方法跳转
  4. 健身品牌Shape获得数千万元Pre-A轮融资,清流资本领投
  5. Android DatePicker, TimePicker控件的使用
  6. python3.6是用来干嘛的_学 Python 都用来干嘛的?
  7. android 瀑布流
  8. qt connect函数_Qt 串口上位机开发Rice 上位机 学习开发
  9. NLP一键中文数据增强工具
  10. secp256r1 c语言程序,区块链中的数学-secp256k1点压缩和公钥恢复原理
  11. Master PDF Editor for Mac(PDF文档编辑软件)
  12. 模糊控制算法基础知识
  13. python下载安装教程电脑版,python下载好了怎么使用
  14. 如何利用 onlyoffice 实现文档格式转换
  15. 2.Echart----绘制饼图
  16. react脚手架创建项目报错,ReactDOM.render is no longer supported in React 18.
  17. OSChina 周三乱弹 ——grath最近睡了一主播
  18. Win10电脑定时关机怎么设置?(干货)
  19. [译]用C#创建一个屏幕保护程序
  20. Win10系统里的软件有小盾牌有啥影响吗

热门文章

  1. 什么是宝塔面板?宝塔面板的作用和功能是什么?
  2. 猿辅导教研团队重磅推出人文博雅系列课程 2023年必读书单公布
  3. python工程师学习路径
  4. 报错:UnicodeDecodeError:: ‘utf-8‘ codec can‘t decode byte 0xc8 in position 0: invalid contin
  5. Linux预科知识篇之认识计算机
  6. springboot搭建项目环境以及整合其他技术
  7. 感叹之余随手记—他山之石,可以攻玉
  8. Java开发导入腾讯地图描点_腾讯地图点聚合开发-实现地图找房功能
  9. OpenStack-Placement、nova组件部署
  10. Placement blockage types