应无所住,而生其心
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

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

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


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

效果如下


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

var run = function () {

    if (points.length == poi)
        poi = 0;
    for (var i = 0; i < 4; i++) {
        $(".mainbox >div").eq(points[poi + i]).addClass("cur").siblings().removeClass("cur");
    }
    poi++;
}

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

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

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


处理边界值

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

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

分析过程如下:

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

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

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


让火车的节数随机

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

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

把这个传到方法里边即可


设置一个开火车概率

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


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

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

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

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

var calWin = function (speed, trainlength) {
    //停下来需要有时间间隔
    setTimeout(function () {
        $("#startbut").attr("isrun", false);
        //定义
        let allscore = 0;
        poi = poi - 1;
        for (var i = 0; i < trainlength; i++) {

            let realpoi=0;
            if (poi + i >= points.length) {
                realpoi = poi + i - points.length;
            }
            else {
                realpoi = poi + i;
            }
            let obj = mapobj[realpoi];
            //直接通过tag存放的id找到对应投注的注数
            let betNumber = $("#" + obj.tag).val();
            allscore += betNumber * obj.scroe;
        }
        //在中间的位置显示中奖信息
        $(".mainbox>div").eq(17).html(allscore)
        //把分数显示到总分上边
        $("#myscore").html(allscore);
    }, speed)
}

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


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

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

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

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





欢迎加群讨论技术,群:677373950(满了,可以加,但通过不了),2群:656732739

评价