余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

项目实战:用jQuery实现抽奖大富翁!附详细代码思路!

xiyangw 2023-09-29 13:26 25 浏览 0 评论

Hello~各位ITer!

这里是每周二三陪你技术内卷的小谷!

作为一名前端开发工程师,相信大家多少都有自己做过一些小游戏程序,比如贪吃蛇,五子棋,猜拳等等!今天向大家分享如何实现制作一个【抽奖大富翁】吧!——文末附上源码

算法思路:

大富翁是一个环形转盘,那就要将它转换成线性的;

当点击开始,直到转动停止后,在停留的方格上添加红色命中背景,提示奖品;

使用定时器来控制转盘的速度。

最终转盘效果图:

页面布局Part.1

底部放一个背景图,上面是表格布局——横向布局;

每行四个单元格,中间两行是两个,中间空出来,放按钮。

<tr>
 <td class="lottery-unit lottery-unit-0"><img src="images/1.png"></td>
  <td class="lottery-unit lottery-unit-1"><img src="images/2.png"></td>
 <td class="lottery-unit lottery-unit-2"><img src="images/4.png"></td>
    <td class="lottery-unit lottery-unit-3"><img src="images/3.png"></td>
   </tr>
<tr>
 <td class="lottery-unit lottery-unit-11"><img src="images/7.png"></td>
 <td colspan="2" rowspan="2"><a href="#"></a></td>
 <td class="lottery-unit lottery-unit-4"><img src="images/5.png"></td>
</tr>
<tr>
 <td class="lottery-unit lottery-unit-10"><img src="images/1.png"></td>
 <td class="lottery-unit lottery-unit-5"><img src="images/6.png"></td>
</tr>
<tr>
  <td class="lottery-unit lottery-unit-9"><img src="images/3.png"></td>
  <td class="lottery-unit lottery-unit-8"><img src="images/6.png"></td>
  <td class="lottery-unit lottery-unit-7"><img src="images/8.png"></td>
     <td class="lottery-unit lottery-unit-6"><img src="images/7.png"></td>
   </tr>

计时器setTimeout方法中两个参数Part.2

  };
  lottery.timer = setTimeout(roll,lottery.speed);
 }

roll:转盘滚动执行的方法;

lottey.speed:滚动的速度;

它的返回值timer是计时器实例,为了清除用。

clearTimeout(lottery.timer)。

如何快速看懂代码Part.3

我们可以运行代码后,在控制台上,打印中间结果。

这里显示抽中的算法思路Part.4

在转盘转到第50次,也就是转了5圈时使用随机数找到奖品,然后再让转盘转到那一个上面去。

这时设置红色背景色,提示奖品名称!

如何实现转动的时候先慢后快再到慢然后选中物品Part.5

最开始函数执行的时间间隔设置为100ms.开始运行;

每一次运行,就在原来的基础上减去10ms,直至到40ms;选出物拼后,每次累加20,最后一次加到110。

怎么实现抽奖后弹出你抽到的物品(换句话说:怎么实现一个耗时长的事件执行后执行下一个Part.6

计算好时间后,使用setTimeout定时器就可以。

怎么用js或jquery把函数b绑定到函数a之后执行Part.7

其实就是将函数b作为参数传入函数a,完成函数a之后执行。

//定义函数a
function a(callback){
    alert("a要做的操作");
    callback();//a执行完执行b
}
 
function b(){
    alert("b要执行的操作");
}//定义函数a
function a(callback){
    alert("a要做的操作");
    callback();//a执行完执行b
}
 
function b(){
    alert("b要执行的操作");
}

为什么要使用表格布局Part.8

因为表格就算你指定了宽高,它还是会自己调整的,自己内部会微调,指定表格主体,然后再指定里面每一个,就不会乱。

通过表格实现起来简单,不需要自己去过多的调整。

css

<style type="text/css">
#lottery{width:574px;height:584px;margin:20px auto 0;background:url(images/bg.jpg) no-repeat;padding:50px 55px;}
#lottery table td{width:142px;height:142px;text-align:center;vertical-align:middle;font-size:24px;color:#333;font-index:-999}
#lottery table td a{width:284px;height:284px;line-height:150px;display:block;text-decoration:none;}
#lottery table td.active{background-color:#ea0000;}
</style>

</head>
<body>

html

<div id="lottery">
 <table border="0" cellpadding="0" cellspacing="0">
  <tr>
   <td class="lottery-unit lottery-unit-0"><img src="images/1.png"></td>
   <td class="lottery-unit lottery-unit-1"><img src="images/2.png"></td>
   <td class="lottery-unit lottery-unit-2"><img src="images/4.png"></td>
            <td class="lottery-unit lottery-unit-3"><img src="images/3.png"></td>
  </tr>
  <tr>
   <td class="lottery-unit lottery-unit-11"><img src="images/7.png"></td>
   <td colspan="2" rowspan="2"><a href="#"></a></td>
   <td class="lottery-unit lottery-unit-4"><img src="images/5.png"></td>
  </tr>
  <tr>
   <td class="lottery-unit lottery-unit-10"><img src="images/1.png"></td>
   <td class="lottery-unit lottery-unit-5"><img src="images/6.png"></td>
  </tr>
        <tr>
   <td class="lottery-unit lottery-unit-9"><img src="images/3.png"></td>
   <td class="lottery-unit lottery-unit-8"><img src="images/6.png"></td>
   <td class="lottery-unit lottery-unit-7"><img src="images/8.png"></td>
            <td class="lottery-unit lottery-unit-6"><img src="images/7.png"></td>
  </tr>
 </table>
</div>

Jq部分

<script src="jquery-1.8.3.min.js" type="text/javascript"></script>
<script type="text/javascript">
    var lottery = {
        index: -1, //当前转动到哪个位置,起点位置
        count: 0, //总共有多少个位置
        timer: 0, //setTimeout的ID,用clearTimeout清除
        speed: 20, //初始转动速度
        times: 0, //转动次数
        cycle: 50, //转动基本次数:即至少需要转动多少次再进入抽奖环节
        prize: -1, //中奖位置
        init: function (id) {
            if ($("#" + id).find(".lottery-unit").length > 0) {
                $lottery = $("#" + id);
                $units = $lottery.find(".lottery-unit");
                this.obj = $lottery;
                this.count = $units.length;
                $lottery.find(".lottery-unit-" + this.index).addClass("active");
            };
        },
        roll: function () {
            var index = this.index;
            var count = this.count;
            var lottery = this.obj;
            $(lottery).find(".lottery-unit-" + index).removeClass("active");
            index += 1;
            if (index > count - 1) {
                index = 0;
            };
            $(lottery).find(".lottery-unit-" + index).addClass("active");
            this.index = index;
            return false;
        },
        stop: function (index) {
            this.prize = index;
            return false;
        }
    };

function roll(){
 lottery.times += 1;
 lottery.roll();
 if (lottery.times > lottery.cycle + 10 && lottery.prize == lottery.index) {
     alert(lottery.prize+"A");
  clearTimeout(lottery.timer);
  lottery.prize=-1;
  lottery.times=0;
  click=false;
 }else{
  if (lottery.times<lottery.cycle) {
   lottery.speed -= 10;
  }else if(lottery.times==lottery.cycle) {

    var index = Math.random() * (lottery.count) | 0;
   lottery.prize = index;
  }else{
   if (lottery.times > lottery.cycle+10 && ((lottery.prize==0 && lottery.index==7) || lottery.prize==lottery.index+1)) {
    lottery.speed += 110;
   }else{
    lottery.speed += 20;
   }
  }
  if (lottery.speed<40) {
   lottery.speed=40;
  };
  lottery.timer = setTimeout(roll,lottery.speed);
 }
 return false;
}

var click=false;

window.onload=function(){
 lottery.init('lottery');
 $("#lottery a").click(function(){
  if (click) {
   return false;
  }else{
   lottery.speed=100;
   roll();
   click=true;
   return false;
  }
 });
};
</script>


</body>
</html>

总结

关于“ 如何用jQuery写个抽奖转盘 ”的内容就介绍到这,感谢各位的阅读。

大家不妨亲自试一试,在此基础上根据自己的需求改造一番~

相关推荐

华为交换机配置命令总结

1、配置文件相关命令[Quidway]displaycurrent-configuration显示当前生效的配置[Quidway]displaysaved-configuration显示fla...

解决账户无法登录的故障
解决账户无法登录的故障

在优化系统时错误地根据网上的提示,将唯一的Administrator账户设置为禁用,导致重启后无法进入系统。类似的故障还有使用组策略限制本地账户登录,导致重启后...

2023-10-11 17:16 xiyangw

S5720交换机登录提示初始密码存在安全风险
S5720交换机登录提示初始密码存在安全风险

问题描述客户每次登录输密码时,提示初始密码不安全,现在客户嫌麻烦想要去掉:Username:huaweiPassword:Warning:Theinitia...

2023-10-11 17:15 xiyangw

Springboot,Mybatis修改登录用户的密码
Springboot,Mybatis修改登录用户的密码

一、Mybatis.xml<updateid="changePassword"parameterType="string...

2023-10-11 17:15 xiyangw

PHP理论知识之沐浴更衣重看PHP基础(二)
PHP理论知识之沐浴更衣重看PHP基础(二)

接上篇,咱们继续讲解PHP基础八、标准PHP组件和框架的数量很多,随之产生的问题就是:单独开发的框架没有考虑到与其他框架的通信。这样对开发者和框架本身都是不利的...

2023-10-11 17:15 xiyangw

新鲜出炉UCloud云主机“数据方舟”评测报告(5)— — 关其城
新鲜出炉UCloud云主机“数据方舟”评测报告(5)— — 关其城

2015年10月29日,UCloud云主机黑科技——“数据方舟”功能正式上线,首轮内测随即开放。截止至2015年12月6日,我们共收到了534位用户的评测申...

2023-10-11 17:14 xiyangw

业余无线电Q简语及英文缩语
业余无线电Q简语及英文缩语

Q简语:语音通信及CW通信通用(加粗为常用)QRA电台何台QRB电台间之距离QRG告之正确频率QRH频率是否变动QRI发送音调QRJ能否收到QRK信号之可...

2023-10-11 17:14 xiyangw

非常详细!如何理解表格存储的多版本、生命周期和有效版本偏差
非常详细!如何理解表格存储的多版本、生命周期和有效版本偏差

表格存储在8月份推出了容量型实例,直接支持了表级别最大版本号和生命周期,高性能实例也将会在9月中旬支持这两个特性。那么,最大版本号和生命周期以及特有的...

2023-10-11 17:14 xiyangw

H3C交换机恢复出厂和各种基本配置,这20个要点你知道吗?
H3C交换机恢复出厂和各种基本配置,这20个要点你知道吗?

私信“干货”二字,即可领取138G伺服与机器人专属及电控资料!H3C交换机不知道密码如何恢复出厂设置1、开机启动,Ctrl+B进入bootrom菜单,选择恢复出...

2023-10-11 17:13 xiyangw

在使用移动支付系统的时候如何保护信息安全?

移动支付的方式近年来不断被更新,使得Venmo(据嘉丰瑞德理财师了解,此为美国的“支付宝”)之类的支付方式已经可以某种意义上代替随身携带现金了。但是你必须防范那些第三方应用程序轻松地获取你的银行卡以及...

界面控件DevExpress WinForms MVVM入门指南——登录表单(下)

从本文档中,您将了解如何向应用程序添加登录表单。在本节教程中着重讨论了如何实现此任务,这基本上是附加应用程序功能的一部分。DevExpressUniversalSubscription官方最新版免...

linux基础命令(一)
linux基础命令(一)

为啥要学linux?您可能熟悉WindowsXP、Windows7、Windows10和MacOSX等操作系统。Linux就是这样一种强大的操...

2023-10-11 17:13 xiyangw

MySQL数据库密码忘记了,怎么办?

#头条创作挑战赛#MySQL数据库密码忘记了且没有其他可以修改账号密码的账户时怎么办呢?登录MySQL,密码输入错误/*密码错误,报如下错误*/[root@TESTDB~]#mysql-u...

MobaXterm忘记Session密码,如何查看已保存的密码
MobaXterm忘记Session密码,如何查看已保存的密码

MobaXterm工具登录过SSH终端后,如果存储了Session(存储后再连接ssh的时候只需要输入账号不需要输入密码就可以直接连接上ssh),则可以...

2023-10-11 17:12 xiyangw

华为交换机密码丢失修改方法
华为交换机密码丢失修改方法

华为S2300交换机找回密码设置一、目的交换机的console和telnet密码丢失,无法登录设备。交换机已进行过数据配置,要把密码恢复而数据配置不能丢失。二、...

2023-10-11 17:12 xiyangw

取消回复欢迎 发表评论: