应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

JS抽奖特效练习之六:开火车

758人阅读 2019/8/22 15:31 总访问:5182844 评论:0 收藏:0 手机
分类: 前端


我们在进行js抽奖的时候有一定的概率出现开火车的情况,其实开火车不过就是一次性多走几个格子,一次性可以有多个中奖的机会

效果如下


开火车就是要一次性多走几个格子,我们很容易想到在run方法里边去加一个循环就行了嘛,循环次数就是开火车的接数。测试的时候火车接数可以先写死,比如写它个4接

  1. var run = function ({
  2.     if (points.length == poi)
  3.         poi = 0;
  4.     for (var i = 0; i < 4; i++) {
  5.         $(".mainbox >div").eq(points[poi + i]).addClass("cur").siblings().removeClass("cur");
  6.     }
  7.     poi++;
  8. }

但是看效果你会发现,还是只有一个格子在走,是因为这一句代码siblings().removeClass("cur");这样选中的效果就只有一个了,每次都把尾巴的选中效果去掉了,我们修改一下代码让每次都能选中多个

  1. var run = function ({
  2.     if (points.length == poi)
  3.         poi = 0;
  4.     //先简单暴力的把选中效果清楚掉
  5.     $(".mainbox >div").removeClass("cur");
  6.     for (var i = 0; i < 4; i++) {
  7.         $(".mainbox >div").eq(points[poi + i]).addClass("cur");
  8.     }
  9.     poi++;
  10. }

直接在选中前把样式清理掉就好,这样火车就能跑起来了。


处理边界值

火车虽然跑起来了,但是当跑到最后一个的时候,并没有从第一个位置开始,而是火车会一节一节消失了然后等一会才出现

我们分析一下就知道,因为我们循环了加了,加起来的数量可能会超过数组的总长度所以就会取不到值,所以在跑完一圈的边界值火车才会一节一节消失

分析过程如下:

23+0 = 23  最后一个,我们这里轨迹数组长度为23

23+1 = 24  相当于points[24]取不了超过了最大值  --> 我们希望的是从头开始也就是取0  也就是-->points[0];

23+2 = 25  相当于points[25]取不了超过了最大值  --> 我们希望的是从头开始也就是取1  也就是-->points[1];

..........................

找规律:超过了多少个就从几开始  比如:24超过了0就从0开始,25超过了1就从1开始  

超过的数量就是:poi + i - points.length

根据这个规律我们就可以写出来方法:

  1. for (var i = 0; i < 4; i++) {
  2.     if (poi + i >= points.length) {
  3.         //超过了多少就取多少,超过的数量就是两个相减
  4.         $(".mainbox >div").eq(points[poi + i - points.length]).addClass("cur");
  5.     }
  6.     else {
  7.         $(".mainbox >div").eq(points[poi + i]).addClass("cur");
  8.     }
  9. }


让火车的节数随机

这个就非常简单了,随机参数一个随机数作为火车的节数就行了,比如限定火车节数是2-6节

  1. //产生一个火车长度的随机数
  2. let trainlength = 1 + Math.ceil(Math.random() * 5);

把这个传到方法里边即可


设置一个开火车概率

玩老虎机不是每一次都开火车,应该是有一个概率的,这个很好控制,比如要1/20 。就产生一个20个随机数,取其中一个即可


火车能跑起来了,剩下的就是计算中奖了,火车长度至少是2,所以至少有2次中奖机会的

其实计算中奖和一个的情况只是多了一次循环而已,和那个火车运动起来一样,写个循环把总分累计起来就好

  1. var calWin = function (speed, trainlength{
  2.     setTimeout(function ({
  3.         $("#startbut").attr("isrun"false);
  4.         let allScore = 0;
  5.         for (let i = 0; i < trainlength; i++) {
  6.             //得到真实的中奖坐标,因为可能会超过最大值
  7.             let realpoi = poi - 1;
  8.             if (realpoi + i >= points.length) {
  9.                 realpoi = realpoi + i - points.length;
  10.             }
  11.             else {
  12.                 realpoi = realpoi + i
  13.             }
  14.             let obj = mapobj[realpoi];
  15.             let betNumber = $("#" + obj.tag).val();
  16.             allScore += betNumber * obj.scroe;
  17.         }      
  18.         //开火车不好显示具体的中奖图标就弄一个文字表示一下
  19.         $(".mainbox> div").eq(24).html("开火车");
  20.         $(".mainbox>div").eq(17).html(allScore)
  21.         $("#myscore").html(parseInt($("#myscore").html()) + allScore);
  22.     }, speed)
  23. }

这里要注意一下边界值的测试,我们可以使用前面所的测试技巧,写几个测试用例把边界值的情况覆盖进去即可,上面的写法边界值可能有点问题,难得删了,保留起,在贴一份

  1. var calWin = function (speed, trainlength{
  2.     //停下来需要有时间间隔
  3.     setTimeout(function ({
  4.         $("#startbut").attr("isrun"false);
  5.         //定义
  6.         let allscore = 0;
  7.         poi = poi - 1;
  8.         for (var i = 0; i < trainlength; i++) {
  9.             let realpoi=0;
  10.             if (poi + i >= points.length) {
  11.                 realpoi = poi + i - points.length;
  12.             }
  13.             else {
  14.                 realpoi = poi + i;
  15.             }
  16.             let obj = mapobj[realpoi];
  17.             //直接通过tag存放的id找到对应投注的注数
  18.             let betNumber = $("#" + obj.tag).val();
  19.             allscore += betNumber * obj.scroe;
  20.         }
  21.         //在中间的位置显示中奖信息
  22.         $(".mainbox>div").eq(17).html(allscore)
  23.         //把分数显示到总分上边
  24.         $("#myscore").html(allscore);
  25.     }, speed)
  26. }

循环中间的变量其实可以不需要,直接取对象了,这样写在测试的时候比较方便


JS抽奖特效之五之七:大满贯、大三元、小三元等

http://www.tnblog.net/aojiancc2/article/details/2598

JS抽奖特效之五:计算中奖

http://www.tnblog.net/aojiancc2/article/details/2592





欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

JS与Controller中分割字符串的方法

js: varstr=OpenRule; varstrs=newArray(); strs=str.split(&quot;,&quot;); for(vari=0;i&lt;strs.length;i++){ $(&q...

珍藏!! JS CSS不传之秘集合

&lt;!--其中5指每隔5秒刷新一次页面--&gt; &lt;metahttp-equiv=&quot;refresh&quot;content=&quot;5&quot;&gt; =========...

JSON对象和JSON字符串的区别

JSON对象是直接可以使用JQuery操作的格式,如C#中可以用对象(类名)点出属性(方法)一样var str2 = { &quot;name&quot;: ...

对象转JSON

/// &lt;summary&gt; /// 对象转json /// &lt;/summary&gt; public static string ToJson(object jsonObject) ...

来!!!今天玩 JSon

别怪我懒,其实我是真的懒///&lt;summary&gt; ///List转成json ///&lt;/summary&gt; ///&lt;typeparamname=&quot;T&quot...

JS遍历localStorage的键值对

//遍历本地存储localStorage for(vari=0;i&lt;localStorage.length;i++){ varkey=localStorage.key(i);//获取本地存储的K...

拓展JS通用方法来对应c操作

有很多时候,js不能像c#一样有那样多的方法操作,但是我们可以自己写一些方法,让他拥有:比如最常见的一些:注意:js里的...

JS的localStorage

localStorage的优势1、localStorage拓展了cookie的4K限制2、localStorage会可以将第一次请求的数据直接存储到本地,这个相...

JS监听input、keydown,有输入法时打字完成后触发事件

在给输入框绑定input或keydown事件时预期效果是有输入法时,输入中文后触发事件,不希望输一个字母就触发一次事件可以用到c...

JS截取两个字符中间的字符串

使用正则表达式来取比如我们要取brush:js;toolbar:false 这个字符串冒号和分号中间的字符串可以varclassname=&quot;brush:j...

Vue.JS+Layer实现表格数据绑定与更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

JS使用正则进行常用验证

?:问号前面的数字匹配0次或1次,也就是懒惰匹配,最多匹配一次+:匹配1次到无穷次*:匹配0次到无穷次验证只能:数字、字母...

JS字符串的替换

vartitle=&quot;我是你的大表哥&quot;; title=title.replace(&quot;大表哥&quot;,&quot;大表妹&quot;); alert(title);输...

Vue.JS 实现省市联动

HTML代码&lt;divid=&quot;pro_citys&quot;&gt; 省:&lt;selectid=&quot;provice&quot;v-on:change=&quot;prochange()&quo...

Vue.JS常见问题

一:花括号当做字符串显示的问题1:检查下绑定到vue.js的id是否重复,如果id重复了,就有可能存在这种问题,因为有可能把数...

vue.JS常用指令

v-html可以把字符串当成一个html来渲染,而不是原样输出Html类似.net mvc中的@Html.Raw()方法&lt;divv-html=&quot;item.tit...