zl程序教程

您现在的位置是:首页 >  前端

当前栏目

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

jQuery实例游戏PHP 实现 抽奖
2023-06-13 09:15:39 时间

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

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

HTML部分:

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

复制代码代码如下:


<divclass="demo">
   <divclass="wrap">
       <divid="msg"></div>
          <divid="dice"><spanclass="dicedice_1"id="dice1"></span>
       <spanclass="dicedice_6"id="dice2"></span></div>
   </div>
   <ulid="prize">
       <liid="d_0"><imgsrc="images/0.gif"alt="开始"></li>
       <liid="d_1"><imgsrc="images/1.gif"alt="现金100元"></li>
       <liid="d_2"><imgsrc="images/2.gif"alt="泰迪熊宝宝"></li>
       <liid="d_3"><imgsrc="images/7.gif"alt="谢谢参与"></li>
       <liid="d_4"><imgsrc="images/3.gif"alt="iphone5s"></li>
       <liid="d_5"><imgsrc="images/4.gif"alt="笔记本电脑"></li>
       <liid="d_6"><imgsrc="images/7.gif"alt="谢谢参与"></li>
       <liid="d_7"><imgsrc="images/5.gif"alt="单反相机"></li>
       <liid="d_8"><imgsrc="images/6.gif"alt="轿车"></li>
       <liid="d_9"><imgsrc="images/7.gif"alt="谢谢参与"></li>
   </ul>
</div>

CSS部分:

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

复制代码代码如下:


.demo{width:650px;height:420px;margin:60pxauto10pxauto;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:1pxsolid#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}
#prizeli{position:absolute;width:150px;height:112px;border:1pxsolid#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(){
       $("#prizeli.mask").remove();
       $(".wrap").append("<divid="dice_mask"></div>");//加遮罩
       vardice1=$("#dice1");
       vardice2=$("#dice2");
       $.getJSON("dice.php",function(json){
           varnum1=json[0];
           varnum2=json[1];
           diceroll(dice1,num1);//掷色子1动画
           diceroll(dice2,num2);//掷色子2动画
           varnum=parseInt(num1)+parseInt(num2);
           $("#msg").css("top","-10px").fadeIn(500).text(num+"点").animate({top:"-50px"},"1000").fadeOut(500);
           roll(0,num);//逐步运动动画
       });
   });
});

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

复制代码代码如下:
functiondiceroll(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相等时,停止动画,并且移除色子的遮罩(防止重复点击)。

复制代码代码如下:
functionroll(i,step){
   vartime=setInterval(function(){
       if(i>9){
           vart=i-10;
           $("#d_"+t).append("<divclass="mask"></div>");
           $("#d_"+(t-1)+".mask").remove();
       }
       $("#d_"+i).append("<divclass="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_arras$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);//打乱顺序
echojson_encode($arr_a);

函数getRand()用来计算概率

复制代码代码如下:
//计算概率
functiongetRand($proArr){
   $result="";
 
   //概率数组的总概率精度
   $proSum=array_sum($proArr);
 
   //概率数组循环
   foreach($proArras$key=>$proCur){
       $randNum=mt_rand(1,$proSum);
       if($randNum<=$proCur){
           $result=$key;
           break;
       }else{
           $proSum-=$proCur;
       }
   }
   unset($proArr);
   return$result;

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