php ajax 概率 转盘,php+jquery实现转盘抽奖 概率可任意调

php+jquery实现转盘抽奖 概率可任意调

php+jquery实现转盘抽奖 概率可任意调

Posted by: xiaomiao  2014/05/13in Code, PHP 3 Comments

A121625694-162312.png_small.png

php+jquery实现转盘抽奖

查看DEMO演示

转盘抽奖,炫丽的一般是flash做的。不懂flash而又不需要那么炫丽,可以简单的通过jquery来实现。网上教程有很多,跟着做了一下,也贴出来吧。要实现转盘抽奖,有两个关键点,一是让转盘或指针转起来并控制停止角度,一是概率控制。

对于转起来控制停止角度这个问题,网上各教程都是用的jqueryrotate这个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;

}

A121628100-162312.png_small.png

这里参数是一个概率数组,某一项的出现的概率是其概率精度/总概率精度。比如概率数组是array(’1′=>’40′,’2′=>’60′),那么‘1’这一项出现的概率就是40/(40+60)。为什么是这个结果呢,好吧,简单的概率计算:

php经典概率算法解析

php经典概率算法解析

(原谅我为了输这分数,还去百度了一下,囧…)

对于概率数组的来源,实际应用中应该是从数据库里面取,这样方便做各种业务判断,比如某一奖项的概率除了人工干预还根据抽中次数自动变化。我这里为了显示,就写到一个数组里面,而且这找的转盘素材同一奖项还有多处出现,故用这样一个数组来存储(这里根据实际业务而定,不是重点)。

//奖项数据

$prize_arr=array(

'youpan'=>array('angle'=>array('16-40','196-220'),'prize'=>'U盘1个','v'=>10),

'money_2000'=>array('angle'=>array('46-74','170-194'),'prize'=>'2000元代金卷','v'=>5),

'chong_10'=>array('angle'=>array('80-104','226-250'),'prize'=>'10元充值卡','v'=>10),

'money_1000'=>array('angle'=>array('110-134','256-284'),'prize'=>'1000元代金卷','v'=>15),

'flower'=>array('angle'=>array('144-164','286-306'),'prize'=>'鲜花1朵,继续努力','v'=>45),

'chong_50'=>array('angle'=>array('316-340'),'prize'=>'50元充值卡','v'=>5),

'book'=>array('angle'=>array('0-10','346-359'),'prize'=>'书1本','v'=>10),

);

angel是角度,最小角度与最大角度用‘-’隔开,有多个。这个角度是控制转盘或指针最终停下来时离起点的角度,范围是0~360。根据实际素材而定,我这找的图不规则,作图的人坑爹,调了多次才得到比较精准的角度。v则是概率。

根据上面的奖项设定,通过下面的函数返回转动信息到前台:

//获得旋转信息

function getRotate($prize_arr) {

$data=array();

$option=$_GET;//根据前台的选择更改原定默认概率

foreach($prize_arr as $k=>&$v) {

$v['v']=$option[$k];

}

$prize=getPrize($prize_arr);//通过概率原理设计函数获得其中一个奖项

$angle=$prize['angle'];

shuffle($angle);//打乱角度数组

$angle=$angle[0];

$angle_arr=explode('-',$angle);

$min=$angle_arr[0];

$max=$angle_arr[1];

$angle=mt_rand($min,$max);

$data['angle']=$angle;

$data['message']=$prize['prize'];

$data['duration']=mt_rand(2,5)*1000;

$data['n']=mt_rand(3,6);//为了不那么单调,随机一下转动时间和转动圈数

echo json_encode($data);

}

至此后端的程序完毕。前端还得有个调整概率的功能,脑子里想到的就是滑动条,html5有这个特性,但样式简单也兼容性也有问题。百度了一下知道jqueryui有相关控件,但不怕笑话作为新人还没用过jqueryui,无意发现了noUiSlider这个专为不使用jqueryui实现滑动条而生的插件,短小精悍。最近又瞄了瞄BootStrap,顺手又拿来排版一下这前端页面,好吧,基本没用到它的什么东西。

现在时间凌晨1:52,夜已深,后面继续。。。

2014/5/14 23:13,继续。

对于改变概率值,上边说了使用noUiSlider,用法可以到官网查看:

$(".youpan").noUiSlider({

start:[10],//起始值

range:{//范围

'min':0,

'max':99,

},

connect:'lower',//写上左边就变色

serialization: {

lower: [

$.Link({

target: $('#youpan')//数值在哪里显示

})

],

format: {

decimals: 0,//数值保留几位小数

mark: ','

}

}

});

在页面加载函数里边给每个需要滑动的元素绑定以上事件即可。更改各项值放在一个form表单,点击开始抽奖收集表单的信息ajax发送到后台计算出具体的旋转信息,再进行转动抽奖。发送ajax的函数如下:

function getPrize() {

var result=null;

var option=$("#myform").serialize();

$.ajax({

url:"03.php",

type:"GET",

data:option,

dataType:"json",

cache:false,

async:false,//同步,否则无法把后台信息信息捕获

error:function(){

alert('出错了');

return false;

},

success:function(data){

result=data;

}

});

return result;}

接下来是关键的根据后台的信息进行转动并控制停止角度,主要是jqueryrotate的用法,详细的可以点击上边高亮的链接查看。下边也有注释:

function rotate() {

$("#start").css("cursor","pointer");

$("#start").rotate({

bind:{

click:function(){

$(this).unbind('click').css("cursor","default");//取消点击事件

var value=getPrize();

var effect=$("#select").val();

$(this).rotate({

duration:value.duration,//多少毫秒内完成转动

angle:0,//起始角度

animateTo:value.n*360+value.angle,//一共转动多少角度

easing:eval(effect),//转动动画扩展

callback:function(){//结束时的回调函数

alert(value.message);

}

})

}

}

})

}

转动动画那里,注意得eval()一下,否则得到的只是一个字符串不是动画函数。这个动画也是用的jQuery Easing这个插件,插件再借用插件,很常见的事,什么都自己写,是很不现实的,童鞋。这些动画效果用在这里有一两个动不了,不知为何。把这个rotate函数放到页面加载函数中,在页面加载完毕即可进行转动抽奖。点击之后取消点击事件,是为了防止转动过程中或者抽完一次后继续点击。当然我这里有“再来一发”就是给再绑上。具体看业务需要,怎么搞都行。

至此,一个简单的转盘抽奖就完成了,虽然简陋了点但也能满足一般的业务需要。有什么问题或者改进意见,欢迎各位看官提出。^~^

update:2015/06/17

鉴于有同学说不懂03.php里边的内容,顺便贴出来吧。按需修改。

//奖项数据

$prize_arr=array(

'youpan'=>array('angle'=>array('16-40','196-220'),'prize'=>'U盘1个','v'=>10),

'money_2000'=>array('angle'=>array('46-74','170-194'),'prize'=>'2000元代金卷','v'=>5),

'chong_10'=>array('angle'=>array('80-104','226-250'),'prize'=>'10元充值卡','v'=>10),

'money_1000'=>array('angle'=>array('110-134','256-284'),'prize'=>'1000元代金卷','v'=>15),

'flower'=>array('angle'=>array('144-164','286-306'),'prize'=>'鲜花1朵,继续努力','v'=>45),

'chong_50'=>array('angle'=>array('316-340'),'prize'=>'50元充值卡','v'=>5),

'book'=>array('angle'=>array('0-10','346-359'),'prize'=>'书1本','v'=>10),

);

//根据奖项数据获得具体奖项

function getPrize($prize_arr) {

$proSum=0;

foreach($prize_arr as $v){

$proSum+=$v['v'];

}

foreach($prize_arr as $k=>$v){

$randNum=mt_rand(1,$proSum);//随机数

if($randNum<=$v['v']) {

return $v;

}else{

$proSum-=$v['v'];

}

}

}

//获得旋转信息

function getRotate($prize_arr) {

$data=array();

$option=$_GET;

foreach($prize_arr as $k=>&$v) {

$v['v']=$option[$k];

}

$prize=getPrize($prize_arr);

$angle=$prize['angle'];

shuffle($angle);//打乱

$angle=$angle[0];

$angle_arr=explode('-',$angle);

$min=$angle_arr[0];

$max=$angle_arr[1];

$angle=mt_rand($min,$max);

$data['angle']=$angle;

$data['message']=$prize['prize'];

$data['duration']=mt_rand(2,5)*1000;

$data['n']=mt_rand(3,6);

echo json_encode($data);

//echo json_encode($option);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

组件php53 php55区别,分享下php5类中三种数据类型的区别

public: 公有类型    在子类中可以通过self::var 来调用 public类型的方法或属性 可以通过parent::method 来调用父类中的方法在实例中可以能过$obj->var 来调用 public类型的方法或属性protected: 受保护类型在子类中可以通过self::var 来调用 protected类型的方法…

wins宝塔安装提示已经有php,centOS安装宝塔提示报错

安装宝塔提示这个错误、一般是DNS问题、或者更换个安装节点P rootlocalhost:~root0104.223.166.114s password: ILast failed login: Tue Jul 17 02:32:19 EDT 2018 from 112.85.42.197 on. ssh :notty IThere were 780 failed login attempts since the last successful login…

php自动抓取文章图片,从文章中提取图片,把图片保存到本地,自动提取缩略图...

开发二代旅游网站程序和CMS的时候&#xff0c;有一个需求&#xff0c;就是从网上复制的内容&#xff0c;里面包含图片的&#xff0c;需要对把图片提取出来&#xff0c;并且保存到本地&#xff0c;并且把图片的URL地址本地化&#xff0c;以下是实现的代码。开发二代旅游网站程序…

url get参数 php,怎么取得Url中Get参数

这次给大家带来怎么取得Url中Get参数&#xff0c;取得Url中Get参数的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。此时可以使用js的方式得到当前页面的url中的get参数. 核心语句是:window.location.href详细代码不解释了,有注释,你看了就懂.封装成jQ…

php tls,使用TLS在PHP中建立连接

我为特殊目的编写了一个小型SIP客户端.基本上,它使用函数fsockopen()连接到端口5060$fp fsockopen("10.0.0.1", 5060, $errno, $errstr, 30);然后基本上使用fread()和fwrite()读写SIP命令.现在,我的SIP服务操作符希望我们的客户使用SIPS,基本上是通过TLS的SIP.我花了…

简单的php探针,php探针程序的推荐

在我们之前的文章已经为大家介绍了什么是php探针&#xff0c;以及他的主要作用是什么&#xff0c;如果你接触了cms或许就会有点了解&#xff0c;当然&#xff0c;不要紧&#xff0c;看完这篇就知道php探针是做什么的了。php探针通常是用来探测空间、服务器运行的状况和php相关信…

php熊掌号怎么设置json-ld,dedecms织梦系统对接百度熊掌号并添加JSON_LD数据

百度近期推出的百度熊掌号非常的不错,我的dedecms织梦系统早早就对接好了,它能对你的原创文章进行原创保护,并评出熊掌号搜索指数,熊掌号搜索指数是对你文章的内容质量,用户喜爱、原创能力、活跃表现、领域专注五个维度进行计算评估而得到的。你的dedecms织梦网站开通熊掌号之后…

php获取信息,PHP文件信息获取函数

知识点&#xff1a;basename():获取文件名&#xff0c;传入第二个参数则只显示文件名&#xff0c;不显示后缀dirname():获取文件路径pathinfo():将文件信息存入一个数组&#xff0c;通过索引basename&#xff0c;dirname&#xff0c;extension可以获得对应的文件名&#xff0c;…

判断文件是否改变php,PHP判断文件是否被修改实例

在网站的管理系统中&#xff0c;有时需要查看某个文件是否被修改过、在什么时间被修改的、最后的修改时间是什么时候&#xff0c;本实例就可以实现这个功能&#xff0c;对表单中提交的文件进行判断&#xff0c;检测出修改时间。关键技术本实例主要应用filectime()和filemtime()…

java输入流转成输出流,[转]java 输出流转输入流

ByteArrayOutputStream.toByteArrayByteArrayInputStreamStringWriter.toStringStringReader字符流和二进制流是javaIO的两类流,输入流和输出流是javaIO的两类流如果你曾经使用过Java IO 编程&#xff0c;很可能会遇到这样一个状况&#xff0c;在一个类中向OutputStream里面写数…

matlab压控振荡器,MATLAB仿真应用_第5章(1)解析.ppt

第5章 数字通信系统的仿真(1) 5.1 概述 5.2 信源 5.3 信源编码 5.4 调制技术(模拟调制) 5.1 概述 实际的数字通信系统需要完成从信源到信宿的全部功能&#xff0c;这通常是比较复杂的。对这个系统做出的任何改动(如改变系统的结构、改变某个参数的设置等)都可能影响到整个系统的…

mysql pdo 查询一条数据,使用 PDO 关联查询 MySQL 数据

使用pdo关联查询mysql数据try {$pdo new PDO(mysql:hostlocalhost;dbnametest;, root, 123456);// 0.等值联结$sql SELECT c.name, o.id, o.customer_id, o.price FROM orders o, customer c WHERE o.customer_id c.id AND c.name :name;// 1.内联结(与上面等值联结返回的查…

php pdo 关闭,php pdo预处理

什么是预处理语句&#xff1f;可以把它看作是想要运行的 SQL 的一种编译过的模板&#xff0c;它可以使用变量参数进行定制。预处理语句可以带来两大好处&#xff1a;查询仅需解析(或预处理)一次&#xff0c;但可以用相同或不同的参数执行多次。当查询准备好后&#xff0c;数据库…

java 下载后删除,在服务器端生成文件后,下载后并删除,改了后发现文件变成空白解决思路...

当前位置:我的异常网 Java Web开发 在服务器端生成文件后,下载后并删除,改了后发现文件在服务器端生成文件后,下载后并删除,改了后发现文件变成空白解决思路www.myexceptions.net 网友分享于&#xff1a;2015-08-26 浏览&#xff1a;99次在服务器端生成文件后,下载后并删除,…

matlab出现红色括号,想让大家看下标红地方为什么说有括号问题

MATLAB特征提取代码for i1:26fstrcat(D:\bishe\,num2str(i)); imagestrcat(f,.jpg); PSimread(image);PSimresize(PS,[300,300],bilinear);%归一化大小 PSrgb2gray(PS);[m,n]size(PS); %测量图像尺寸参数GPzeros(1,256); %预创建存放灰度出现概率的向量for k0:255GP(k1)length…

mysql 数据类型怎么用,myMySQL数据库怎么更改表中某字段的数据类型? MySQL数据库使用教程...

在mysql中&#xff0c;可以使用“ALTER TABLE”语句配合“MODIFY”关键字来更改表中某字段的数据类型&#xff1b;语法格式“ALTER TABLE MODIFY ”。(推荐教程&#xff1a;mysql视频教程)在 MySQL 中&#xff0c;ALTER TABLE 语句可以改变原有表的结构&#xff0c;例如增加或删…

matlab multithreading spyder,spyder和python的关系是什么

版权所有&#xff1a;http://wWw.pxcodeS.comspyder和python的关系&#xff1a;1、Spyder是Python的一个简单的集成开发环境&#xff1b;2、它和其他的Python开发环境相比**大的优点就是模仿MATLAB的“工作空间”的功能&#xff0c;可以很方便地观察和修改数组的值。LHF少儿编程…

python私有成员和保护成员,喜大普奔!Maya 2022来了?!

距离Maya 2020第一个版本发布已经过去将近1年半。各位用户苦等Maya 2021的发布&#xff0c;不料2021没等到&#xff0c;而Maya 2022要来了&#xff1f;&#xff01;这两天小编刷Maya官网&#xff0c;在帮助页面竟然看到官方放出了“Maya 2022 新特性”的页面&#xff01;吓得小…

php web教程视频教程下载,Web全栈 PHP+React系列视频教程下载

Web全栈 PHPReact系列视频教程下载课程介绍&#xff1a;此套Web全栈 PHPReact系列视频教程覆盖PHP、前端和区块链应用开发三大热门职位&#xff0c;教程对网络基础、前端基础(HTML CSSJavaScriptjQuery)、网站基础、PHP、React、区块链等均做了详细的讲解,无源码。Web全栈 PHPR…

mac怎么配置php开发环境变量,Mac M1安装mnmp(Mac+Nginx+MySQL+PHP)开发环境

之前刚装好了 HomeBrew &#xff0c;接下来就要安装 环境了。注意&#xff1a;如果 brew install 出以下错误, 则安装时使用arch -arm64 brew install软件包名 进行安装安装 Nginxbrew install nginx安装成功后,通过 brew info nginx ,查看 nginx 信息&#xff0c;最主要是看 网…