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 相关文章推荐
网站当前的在线人数
Oct 09 PHP
PHP 数组遍历顺序理解
Sep 09 PHP
php foreach 使用&amp;(与运算符)引用赋值要注意的问题
Feb 16 PHP
在VS2008中编译MYSQL5.1.48的方法
Jul 03 PHP
ThinkPHP写第一个模块应用
Feb 20 PHP
PHP 自定义错误处理函数的使用详解
May 10 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
php查找指定目录下指定大小文件的方法
Nov 28 PHP
smarty模板引擎之内建函数用法
Mar 30 PHP
php基于SQLite实现的分页功能示例
Jun 21 PHP
解决在Laravel 中处理OPTIONS请求的问题
Oct 11 PHP
laravel5环境隐藏index.php后缀(apache)的方法
Oct 12 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 采集程序中常用的函数
2009/12/09 PHP
php对数组排序代码分享
2014/02/24 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
addRule在firefox下的兼容写法
2006/11/30 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
JS模拟键盘打字效果的方法
2015/08/05 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
vue操作下拉选择器获取选择的数据的id方法
2018/08/24 Javascript
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
Python写入CSV文件的方法
2015/07/08 Python
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
flask应用部署到服务器的方法
2019/07/12 Python
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
手机促销活动方案
2014/02/05 职场文书
出国英文推荐信
2014/05/10 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
民主评议党员自我鉴定
2014/10/21 职场文书
党员个人党性分析材料
2014/12/18 职场文书
golang中的空slice案例
2021/04/27 Golang
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫