前端+php实现概率抽奖

转前端之后,后台工程师大大跑路了只能兼任他的位置写点东西了

前端+后台抽奖代码网上一大堆,引用一位仁兄前面的代码(比较懒抱歉,后面数据处理,奖项判断是否抽完我将会标红,因为前面的代码网上太多了都能找到)

引用部分-start--------------------->

准备工作

首先要准备素材,抽奖的界面用到两张图片,圆盘图片和指针图片,实际应用中可以根据不同的需求制作不同的圆盘图片。

接着制作html页面,实例中我们在body中加入如下代码:

<div class="demo">     <div id="disk"></div>     <div id="start"><img src="start.png" id="startbtn"></div> </div> 

我们用#disk来放置圆盘背景图片,在css中控制,用#start来放置指针图片start.png。

然后我们使用CSS来控制指针和圆盘的位置,代码如下:

.demo{width:417px; height:417px; position:relative; margin:50px auto} #disk{width:417px; height:417px; background:url(disk.jpg) no-repeat} #start{width:163px; height:320px; position:absolute; top:46px; left:130px;} #start img{cursor:pointer} 

jQuery

要想让指针转动起来,如果不借助flash的话,我们可以使用html5的canvas实现图片的旋转,但是需要考虑浏览器兼容性,而一款jQuery插件完全可以实现图片(任意html元素)旋转并兼容各大浏览器,它就是jQueryRotate.js。

使用jQueryRotate.js可以将图片旋转任意角度,可以绑定鼠标事件,可以设置旋转过程动画效果以及callback回调函数。

使用方法当然是先在head中载入jquery库文件以及jQueryRotate.js,然后我们使用以下代码就可以实现指针转动了。

$(function(){     $("#startbtn").rotate({         bind:{             click:function(){//绑定click单击事件                  var a = Math.floor(Math.random() * 360); //生成随机数                  $(this).rotate({                          duration:3000,//转动时间间隔(转动速度)                          angle: 0,  //开始角度                         animateTo:3600+a, //转动角度,10圈+                         easing: $.easing.easeOutSine, //动画扩展                         callback: function(){ //回调函数                             alert(‘中奖了!‘);                         }                  });             }         }     }); }); 

上面的代码实现了:当单击指针“开始抽奖”按钮,指针开始转动,转动角度为3600+a,即10圈后再转动随机产生的a角度,当转动角度到达3600+a度时停止转动。

需要注意的是,easing:动画扩展我们需要结合动画扩展插件才能实现。关于easing插件在这篇文章中有介绍:jQuery Easing 动画效果扩展

本文到此已完成了转盘转动指针的过程,但是需要结合抽奖控制才算一个完整的抽奖程序,我们在下篇文章中将介绍使用PHP来控制抽奖几率,以及如何应用jQuery与PHP完成抽奖的交互过程,敬请关注。

PHP

首先,我们根据抽奖圆盘上的奖项设置对应角度和中奖几率,我们在data.php中构建一个多维数组:

$prize_arr = array(     ‘0‘ => array(‘id‘=>1,‘min‘=>1,‘max‘=>29,‘prize‘=>‘一等奖‘,‘v‘=>1),     ‘1‘ => array(‘id‘=>2,‘min‘=>302,‘max‘=>328,‘prize‘=>‘二等奖‘,‘v‘=>2),     ‘2‘ => array(‘id‘=>3,‘min‘=>242,‘max‘=>268,‘prize‘=>‘三等奖‘,‘v‘=>5),     ‘3‘ => array(‘id‘=>4,‘min‘=>182,‘max‘=>208,‘prize‘=>‘四等奖‘,‘v‘=>7),     ‘4‘ => array(‘id‘=>5,‘min‘=>122,‘max‘=>148,‘prize‘=>‘五等奖‘,‘v‘=>10),     ‘5‘ => array(‘id‘=>6,‘min‘=>62,‘max‘=>88,‘prize‘=>‘六等奖‘,‘v‘=>25),     ‘6‘ => array(‘id‘=>7,‘min‘=>array(32,92,152,212,272,332), ‘max‘=>array(58,118,178,238,298,358),‘prize‘=>‘七等奖‘,‘v‘=>50) ); 

数组$prize_arr,id用来标识不同的奖项,min表示圆盘中各奖项区间对应的最小角度,max表示最大角度,如一等奖对应的最小角度:0,最大角度30,这里我们设置max值为1、max值为29,是为了避免抽奖后指针指向两个相邻奖项的中线。由于圆盘中设置了多个七等奖,所以我们在数组中设置每个七等奖对应的角度范围。prize表示奖项内容,v表示中奖几率,我们会发现,数组中七个奖项的v的总和为100,如果v的值为1,则代表中奖几率为1%,依此类推。

关于中奖概率算法,本站文章:PHP+jQuery实现翻板抽奖有介绍经典的概率算法,本文直接将代码拿来。

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; } 

函数getRand()会根据数组中设置的几率计算出符合条件的id,我们可以接着调用getRand()。

foreach ($prize_arr as $key => $val) {     $arr[$val[‘id‘]] = $val[‘v‘]; }  $rid = getRand($arr); //根据概率获取奖项id  $res = $prize_arr[$rid-1]; //中奖项 $min = $res[‘min‘]; $max = $res[‘max‘]; if($res[‘id‘]==7){ //七等奖     $i = mt_rand(0,5);     $result[‘angle‘] = mt_rand($min[$i],$max[$i]); }else{     $result[‘angle‘] = mt_rand($min,$max); //随机生成一个角度 } $result[‘prize‘] = $res[‘prize‘];  echo json_encode($result); 

代码中,我们调用getRand(),获得通过概率运算后得到的奖项,然后根据奖项中配置的角度范围,在最小角度和最大角度间生成一个角度值,并构建数组,包含角度angle和奖项prize,最终以json格式输出。

jQuery

在上文的基础上,我们对前端jQuery代码进行改造,当点击“开始抽奖”按钮后,向后台data.php发送一个ajax请求,如果请求成功并返回奖项信息,则转动指针,将指针最终指向位置转动到data.php返回的角度值。

$(function(){      $("#startbtn").click(function(){         lottery();     }); }); function lottery(){     $.ajax({         type: ‘POST‘,         url: ‘data.php‘,         dataType: ‘json‘,         cache: false,         error: function(){             alert(‘出错了!‘);             return false;         },         success:function(json){             $("#startbtn").unbind(‘click‘).css("cursor","default");             var a = json.angle; //角度             var p = json.prize; //奖项             $("#startbtn").rotate({                 duration:3000, //转动时间                 angle: 0,                 animateTo:1800+a, //转动角度                 easing: $.easing.easeOutSine,                 callback: function(){                     var con = confirm(‘恭喜你,中得‘+p+‘\n还要再来一次吗?‘);                     if(con){                         lottery();                     }else{                         return false;                     }                 }             });         }     }); } 引用部分-end--------------------->

写到这里很多朋友就开始不知道后期怎么办了,数据表怎么建?我的业务要求比较简单不在乎用户抽多少次,玩一次游戏就可以抽一次,抽完之后如果中奖就填信息,没中奖就刷新H5页面,废话不多说思考以下问题1)奖品抽完这个奖品的中奖概率为02)表单应该怎么建

好的上面也说了,只有抽中了才需要填写信息,比如用户抽中了一等奖此时应该传给后台的东西为用户手机号,用户名字,用户中了什么奖品,好的那么表格就只需要四个参数  id  name(用户名字) phone(用户手机号码) prize(用户所中奖品)

显而易见中奖概率问题也迎刃而解了

找寻字段中prize中奖奖品名字判断目前奖品有几个人中奖了,如果中奖的人数小于奖品数概率正常否则概率为0

以下上代码,希望对各位有所帮助

<?php

header("Content-Type: text/html; charset=utf-8");//防止界面乱码
$tip=mysql_connect(‘localhost‘,‘username‘,‘password‘);//数据库用户名,密码
mysql_select_db("dbname", $tip);
mysql_query("SET NAMES utf8");//解决数据库中有汉字时显示在前台出现乱码问题
$resval1 = mysql_query("SELECT * FROM tablename WHERE prize=‘一等奖‘");
$n1=mysql_num_rows($resval1);//查询数据表中一等奖已经有几条数据

$resval2 = mysql_query("SELECT * FROM tablename WHERE prize=‘二等奖‘");
$n2=mysql_num_rows($resval2);//查询数据表中二等奖已经有几条数据
$resval3 = mysql_query("SELECT * FROM tablename WHERE prize=‘三等奖‘");
$n3=mysql_num_rows($resval3);//查询数据表中三等奖已经有几条数据
$resval4 = mysql_query("SELECT * FROM tablename WHERE prize=‘参与奖‘");
$n4=mysql_num_rows($resval4);//查询数据表中参与奖已经有几条数据
$r1=($n1<1)?0.1:0;
$r2=($n2<3)?1:0;
$r3=($n3<6)?3:0;
$r4=($n4<10)?0.5:0;
$r5=100-$r1-$r2-$r3-$r4*2;
//echo $r1.$r2.$r3.$r4.$r5;

//print_r(mysql_fetch_array($result));//取得第一条数据

//概率分布
$prize_arr = array(
‘0‘ => array(‘id‘=>1,‘min‘=>1, ‘max‘=>35,‘prize‘=>‘一等奖‘,‘v‘=>$r1),
‘1‘ => array(‘id‘=>2,‘min‘=>72,‘max‘=>107,‘prize‘=>‘二等奖‘,‘v‘=>$r2),
‘2‘ => array(‘id‘=>3,‘min‘=>144,‘max‘=>187,‘prize‘=>‘三等奖‘,‘v‘=>$r3),
‘3‘ => array(‘id‘=>4, ‘min‘=>216,‘max‘=>251,‘prize‘=>‘参与奖‘, ‘v‘=>$r4),
‘4‘ => array(‘id‘=>5,‘min‘=>288,‘max‘=>323,‘prize‘=>‘参与奖‘,‘v‘=>$r4),
‘5‘ => array(‘id‘=>6,‘min‘=>array(36,108,180,252,324),‘max‘=>array(71,143,215,287,359),‘prize‘=>‘谢谢参与‘,‘v‘=>$r5)
);

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;
}

foreach ($prize_arr as $key =>$val) {
$arr[$val[‘id‘]] = $val[‘v‘];
}

$rid = getRand($arr); //根据概率获取奖项id

$res = $prize_arr[$rid-1]; //中奖项
$min = $res[‘min‘];
$max = $res[‘max‘];
if($res[‘id‘]==6){ //七等奖
$i = mt_rand(0,5);
$result[‘angle‘] = mt_rand($min[$i],$max[$i]);
}else{
$result[‘angle‘] = mt_rand($min,$max); //随机生成一个角度
}
$result[‘prize‘] = $res[‘prize‘];

echo json_encode($result);

?>

谢谢!!



原文地址:https://www.cnblogs.com/iwen1992/p/10439098.html

时间: 2024-10-10 16:27:09

前端+php实现概率抽奖的相关文章

多件商品根据概率抽奖

最近在项目中分配了一个抽奖模块的任务,这里先说一下需求把:每个抽奖活动后台会配置多个中奖奖品,分为特殊奖品和普通奖品,所有奖品的中奖概率之和加起来为1.用户端用户抽奖需要根据概率来随机抽中一个商品.开始我脑子生出来的第一想法是生成一个随机数,然后让这个随机数跟概率去比较,取小于这个随机数的最大一个概率对应的商品为中奖商品,后来一想,发现自己想的太简单直观了,这样抽中的商品中奖概率不满足配置的中奖概率.在网上搜了一下相关的问题,然后就弄清楚了.说来惭愧,这么一个简单的算法题,自己竟然第一时间没有没

概率抽奖

[TestMethod] public void CheckTrue() { var reg = CommonTools.CheckTrue(1.001M); } /// <summary> /// 根据中奖率判断是否中奖 /// </summary> /// <param name="percent">中奖率(0~100)</param> /// <returns></returns> public static

javascript抽奖插件+概率计算

写了一个抽奖的jquery插件和计算概率的方法, 结合起来就是一个简单的概率抽奖, 不过实际项目中基本不会把抽奖概率的计算放在前端处理~. 概率计算 function Probability(conf) { this.probArr = conf || []; this.range = [], this.len = this.probArr.length; if (this.len > 0) { this.init(); } } Probability.prototype = { init: f

不同概率的抽奖

今天为大家写个小程序. 工作中有遇到一些抽奖的活动,但是你懂得,抽奖物品的概率肯定不是一样,你会发现好的东西很难抽到,经常抽到一些垃圾的东西,嘿嘿,这就是本文要说的,我们要控制抽奖物品的概率.还有顺便说一句,网上这种小程序几乎没有,很多都是等概率的抽奖balabala- 需求很简单,为了更加形象,这里我们列一个表格来显示我们抽奖的物品和对应的概率(没有边框,大家凑合着看看吧,不想改造Octopress的样式了) 序号 物品名称 物品ID 抽奖概率 1 物品1 P1 0.2 2 物品2 P2 0.

php抽奖程序

//php概率抽奖算法 1.获取总的概率数 2.随机从1到总概率数 3.判断获取的随机数是否在小于等于(就是你随机的数是否在数组值得范围中比如数组为array(1,2,3,4,5,6)则随机出了一个数为3 3是存在array中 所以将键就赋给一个变量 ,如果随机一个数为 7了 那得减去这个范围 一直到能在数组中寻找到 $sum=$sum-$val 像这样(随机数为7 则7-1=6))数组中的值 function get_rand($arr) { $result=""; $sum=arr

PHP新写的大转盘抽奖源码

中奖概率 抽奖大转盘演示:http://www.sucaihuo.com/php/3301.html function getRand($proArr, $proCount) { $result = ''; $proSum = 0; foreach ($proCount as $key => $val) { if ($val <= 0) { continue; } else { $proSum = $proSum + $proArr[$key]; } } foreach ($proArr as

重要信息记录

酷勤网 – 程序员的那点事! 酷勤网 设为首页 加入收藏 订阅本站 首页 编程 产品 职业 管理 资讯 考试 游戏 读书 主题 下载 书籍百科 书籍书评 当前位置:首页 > 职业 > 求职招聘 > 正文 阿里.百度.搜狐等公司社招面试记录与总结 浏览次数:448次 博客园 2016年05月09日 字号: 大 中 小 分享到:QQ空间新浪微博腾讯微博人人网豆瓣网开心网更多0 这个跳槽季大概面试了近十家公司,也拿到了几个Offer,现在面试告一段落,简单总结下面经, 我现在主要的方向是Jav

js转盘大抽奖 自定义概率

公司项目搞优惠活动,让做一个转盘抽奖的活动,转盘抽奖让他转起来 按照概率停止其实都麻烦,但是概率如果设置在前端就会很大的安全漏洞,所以无论为了安全性还是后期的维护问题都要把概率写到后台配置里然后读取配置.那么问题来了,我们需要把后台的概率结果和前端自己的转盘想对应,我的大致思路是这样的,后台返回概率结果之后,对应的可定有奖品,然后给每个奖品一个不变的标识,根据这个返回的标识我们前端进行相应的转盘指针停留的位置.我们后台鼻尖懒 他不想改接口了 就直接让我去对应配置里的奖品名字,好吧就这样算是搞完了

C# 做一个指定概率的抽奖程序

static void Main(string[] args) { //各物品的概率保存在数组里 float[] area = new float[4]{ 0.980f, 0.550f, 0.230f, 0.010f }; //单次测试 //Console.WriteLine(Get(area)); //批量测试 int[] result = new int[4]{ 0, 0, 0, 0 }; for (int i = 0; i < 1770000; i++) //为了比对结果方便,这里循环的次