jQuery+PHP实现的掷色子抽奖游戏实例


Posted in PHP onJanuary 04, 2015

本文实例讲述了jQuery+PHP实现的掷色子抽奖游戏详细步骤。分享给大家供大家参考。具体分析如下:

该游戏是以大富翁游戏为背景,综合运用jQuery和PHP知识,设计出以掷色子点数来达成抽奖的效果,当然抽奖概率是可控的,开发者可以将本实例稍作修改即可运用到网站中的抽奖活动场景中。效果图如下:

jQuery+PHP实现的掷色子抽奖游戏实例

完整实例代码点击此处本站下载。

HTML部分:

首先我们需要准备两粒色子和奖品素材,这些作者已经打包上传了,请大家放心下载。我们将在html页面中写下如下的html结构代码,.wrap用来放置色子和提示信息,#prize则是用来放置奖品的。

<div class='demo'> 

    <div class='wrap'> 

        <div id='msg'></div> 

           <div id='dice'><span class='dice dice_1' id='dice1'></span> 

        <span class='dice dice_6' id='dice2'></span></div> 

    </div> 

    <ul id='prize'> 

        <li id='d_0'><img src='images/0.gif' alt='开始'></li> 

        <li id='d_1'><img src='images/1.gif' alt='现金100元'></li> 

        <li id='d_2'><img src='images/2.gif' alt='泰迪熊宝宝'></li> 

        <li id='d_3'><img src='images/7.gif' alt='谢谢参与'></li> 

        <li id='d_4'><img src='images/3.gif' alt='iphone 5s'></li> 

        <li id='d_5'><img src='images/4.gif' alt='笔记本电脑'></li> 

        <li id='d_6'><img src='images/7.gif' alt='谢谢参与'></li> 

        <li id='d_7'><img src='images/5.gif' alt='单反相机'></li> 

        <li id='d_8'><img src='images/6.gif' alt='轿车'></li> 

        <li id='d_9'><img src='images/7.gif' alt='谢谢参与'></li> 

    </ul> 

</div>

CSS部分:

我们要用CSS技术来将页面布局合理规范化,我们将奖品围成一个矩形,共10个位置,将两粒色子定位在矩形的中央,抽奖时可以直接点击中间的色子。这些我们可以用CSS的定位技术来实现页面布局。

.demo{width:650px; height:420px; margin:60px auto 10px auto; position:relative; } 

.wrap{width:200px; height:100px; position:absolute; margin-left:220px; margin-top:140px; z-index:1000;} 

#msg{display:none;width:50px; height:20px; padding:4px; background:#ffc; border:1px solid #fc9;  

text-align:center; color:#f30; font-size:18px; position:absolute; z-index:1001; right:-20px; top:-10px} 

.dice{width:90px; height:90px; display:block; float:left; background:url(dice.png) no-repeat; cursor:pointer} 

#dice_mask{width:200px; height:100px; background:#fff; opacity:0; position:absolute; top:0; left:0; z-index:999} 

.dice_1{background-position:-5px -4px} 

.dice_2{background-position:-5px -107px} 

.dice_3{background-position:-5px -212px} 

.dice_4{background-position:-5px -317px} 

.dice_5{background-position:-5px -427px} 

.dice_6{background-position:-5px -535px} 

.dice_t{background-position:-5px -651px} 

.dice_s{background-position:-5px -763px} 

.dice_e{background-position:-5px -876px} 

#prize{position:relative} 

#prize li{position:absolute; width:150px; height:112px; border:1px solid #d3d3d3} 

#d_0{left:0; top:0} 

#d_1{left:160px; top:0} 

#d_2{left:320px; top:0} 

#d_3{left:480px; top:0} 

#d_4{left:480px; top:128px} 

#d_5{left:480px; top:256px} 

#d_6{left:320px; top:256px} 

#d_7{left:160px; top:256px} 

#d_8{left:0; top:256px} 

#d_9{left:0; top:128px} 

.mask{opacity: 0.6; width:150px; height:112px; line-height:32px; background:#ffc;  

z-index:1001; position:absolute; top:0; left:0; text-align:center; font-size:16px}

jQuery部分:

我们使用jQquery来完成前端动作,包括掷色子动画,仿大富翁奖品逐步运动动画,其中有防重复点击知识、ajax交互知识,动画提示知识。整个 操作流程可简单概括为:点击色子->向dice.php发送ajax请求->完成掷色子动画->提示点数->逐步运动动画到最终 奖品位置停止->完成抽奖。

$(function(){ 

    $('#dice').click(function(){ 

        $('#prize li .mask').remove(); 

        $('.wrap').append('<div id='dice_mask'></div>');//加遮罩 

        var dice1 = $('#dice1'); 

        var dice2 = $('#dice2'); 

        $.getJSON('dice.php',function(json){ 

            var num1 = json[0]; 

            var num2 = json[1]; 

            diceroll(dice1,num1);//掷色子1动画 

            diceroll(dice2,num2);//掷色子2动画 

            var num = parseInt(num1)+parseInt(num2); 

            $('#msg').css('top','-10px').fadeIn(500).text(num+'点').animate({top:'-50px'},'1000').fadeOut(500); 

            roll(0, num);//逐步运动动画 

        }); 

    }); 

});

函数diceroll()是一个色子运动动画,在本站前面的文章中已讲解过,就是通过jQuery的animate()实现的位移、延时、变化背景样式来实现的动画效果。

function diceroll(dice,num){ 

    dice.attr('class','dice');//清除上次动画后的点数 

    dice.css('cursor','default'); 

    dice.animate({left: '+2px'}, 100,function(){ 

        dice.addClass('dice_t'); 

    }).delay(200).animate({top:'-2px'},100,function(){ 

        dice.removeClass('dice_t').addClass('dice_s'); 

    }).delay(200).animate({opacity: 'show'},600,function(){ 

        dice.removeClass('dice_s').addClass('dice_e'); 

    }).delay(100).animate({left:'-2px',top:'2px'},100,function(){ 

        dice.removeClass('dice_e').addClass('dice_'+num); 

        dice.css('cursor','pointer'); 

    }); 

}

函数roll()至关重要,通过setInterval()设置一个间隔动画,每隔0.5秒时间执行一次。参数i代表初始位置,参数step代表需要执行 的步数,在本例中就是色子的点数,即需要走的步数。我们根据i给当前奖品加上.mask,当i的值与step相等时,停止动画,并且移除色子的遮罩(防止 重复点击)。

function roll(i,step){ 

    var time = setInterval(function(){ 

        if(i>9){ 

            var t = i - 10; 

            $('#d_'+t).append('<div class='mask'></div>'); 

            $('#d_'+(t-1)+' .mask').remove(); 

        } 

        $('#d_'+i).append('<div class='mask'></div>'); 

        $('#d_'+(i-1)+' .mask').remove(); 

         

        if(i==step){ 

             clearInterval(time); //如果到达指定位置则停止 

             $('#dice_mask').remove();//移除遮罩 

        } 

        i++;//继续前进 

    },500); 

}

PHP部分:

dice.php需要做的事情有:根据配置好的奖品概率,得到总点数,根据总点数进行两粒色子的点数分配,最后返回给前端页面两粒色子的点数。

//设置中奖概率 

$prize_arr = array( 

    '2' => array('id'=>2,'v'=>10), 

    '3' => array('id'=>3,'v'=>20), 

    '4' => array('id'=>4,'v'=>5), 

    '5' => array('id'=>5,'v'=>5), 

    '6' => array('id'=>6,'v'=>20), 

    '7' => array('id'=>7,'v'=>2), 

    '8' => array('id'=>8,'v'=>3), 

    '9' => array('id'=>9,'v'=>20), 

    '10' => array('id'=>10,'v'=>0), 

    '11' => array('id'=>11,'v'=>10), 

    '12' => array('id'=>12,'v'=>5), 

); 

 

foreach ($prize_arr as $key => $val) { 

    $arr[$val['id']] = $val['v']; 

} 

 

$sum = getRand($arr); //根据概率获取奖项id,得到总点数 

 

//分配色子点数 

$arrs = array( 

    '2' => array(array(1,1)), 

    '3' => array(array(1,2)), 

    '4' => array(array(1,3),array(2,2)), 

    '5' => array(array(1,4),array(2,3)), 

    '6' => array(array(1,5),array(2,4),array(3,3)), 

    '7' => array(array(1,6),array(2,7),array(3,4)), 

    '8' => array(array(2,6),array(3,5),array(4,4)), 

    '9' => array(array(3,6),array(4,5)), 

    '10' => array(array(4,6),array(5,5)), 

    '11' => array(array(5,6)), 

    '12' => array(array(6,6)) 

); 

 

$arr_rs = $arrs[$sum]; 

$i = array_rand($arr_rs);//随机取数组 

$arr_a = $arr_rs[$i]; 

shuffle($arr_a);//打乱顺序 

echo json_encode($arr_a);

函数getRand()用来计算概率

//计算概率 

function getRand($proArr) { 

    $result = ''; 

 

    //概率数组的总概率精度 

    $proSum = array_sum($proArr); 

 

    //概率数组循环 

    foreach ($proArr as $key => $proCur) { 

        $randNum = mt_rand(1, $proSum); 

        if ($randNum <= $proCur) { 

            $result = $key; 

            break; 

        } else { 

            $proSum -= $proCur; 

        } 

    } 

    unset ($proArr); 

    return $result; 

} 

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
推荐php模板技术[转]
Jan 04 PHP
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
Mar 15 PHP
php模块memcache和memcached区别分析
Jun 14 PHP
Array of country list in PHP with Zend Framework
Oct 17 PHP
析构函数与php的垃圾回收机制详解
Oct 28 PHP
php获取网站百度快照日期的方法
Jul 29 PHP
解析WordPress中函数钩子hook的作用及基本用法
Dec 22 PHP
thinkphp3.x中变量的获取和过滤方法详解
May 20 PHP
thinkPHP引入类的方法详解
Dec 08 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
Apr 09 PHP
php 可变函数使用小结
Jun 12 PHP
浅谈如何提高PHP代码的质量
May 28 PHP
php支付宝接口用法分析
Jan 04 #PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
Jan 04 #PHP
php模仿asp Application对象在线人数统计实现方法
Jan 04 #PHP
THINKPHP2.0到3.0有哪些改进之处
Jan 04 #PHP
浅谈thinkphp的实例化模型
Jan 04 #PHP
Thinkphp中的curd应用实用要点
Jan 04 #PHP
PHP+jquery实时显示网站在线人数的方法
Jan 04 #PHP
You might like
PHP 5.3.0 安装分析心得
2009/08/07 PHP
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
PHP生成sitemap.xml地图函数
2013/11/13 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
Javascript 面向对象特性
2009/12/28 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
js加入收藏夹代码(兼容ie/ff/op)
2014/05/16 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
Javascript动画效果(1)
2016/10/11 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
关于meta viewport中target-densitydpi属性详解(推荐)
2017/08/18 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
Python格式化压缩后的JS文件的方法
2015/03/05 Python
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
python中re模块知识点总结
2021/01/17 Python
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
欧尚俄罗斯网上超市:Auchan俄罗斯
2018/05/03 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
编码实现字符串转整型的函数
2012/06/02 面试题
计算机毕业大学生推荐信
2013/12/01 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
2014预备党员党课学习心得范文
2014/07/08 职场文书
先进工作者申报材料
2014/12/23 职场文书
公司董事任命书
2015/09/21 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL