日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

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

發(fā)布時(shí)間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php ajax 概率 转盘,php+jquery实现转盘抽奖 概率可任意调 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)盤抽獎(jiǎng),炫麗的一般是flash做的。不懂flash而又不需要那么炫麗,可以簡(jiǎn)單的通過jquery來實(shí)現(xiàn)。網(wǎng)上教程有很多,跟著做了一下,也貼出來吧。要實(shí)現(xiàn)轉(zhuǎn)盤抽獎(jiǎng),有兩個(gè)關(guān)鍵點(diǎn),一是讓轉(zhuǎn)盤或指針轉(zhuǎn)起來并控制停止角度,一是概率控制。

對(duì)于轉(zhuǎn)起來控制停止角度這個(gè)問題,網(wǎng)上各教程都是用的jqueryrotate這個(gè)jquery插件,兼容性好使用也簡(jiǎn)單,要我本人自己寫也不知道怎么寫好,還是拿來即可。對(duì)于概率控制,網(wǎng)上也一致的是這個(gè)經(jīng)典算法:

function getRand($proArr) {

$result = '';

//概率數(shù)組的總概率精度

$proSum = array_sum($proArr);

//概率數(shù)組循環(huán)

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

$randNum = mt_rand(1, $proSum);

if ($randNum <= $proCur) {

$result = $key;

break;

} else {

$proSum -= $proCur;

}

}

unset ($proArr);

return $result;

}

這里參數(shù)是一個(gè)概率數(shù)組,某一項(xiàng)的出現(xiàn)的概率是其概率精度/總概率精度。比如概率數(shù)組是array(‘1’=>’40’,’2’=>’60’),那么‘1’這一項(xiàng)出現(xiàn)的概率就是40/(40+60)。為什么是這個(gè)結(jié)果呢,好吧,簡(jiǎn)單的概率計(jì)算:

php經(jīng)典概率算法解析

(原諒我為了輸這分?jǐn)?shù),還去百度了一下,囧…)

對(duì)于概率數(shù)組的來源,實(shí)際應(yīng)用中應(yīng)該是從數(shù)據(jù)庫(kù)里面取,這樣方便做各種業(yè)務(wù)判斷,比如某一獎(jiǎng)項(xiàng)的概率除了人工干預(yù)還根據(jù)抽中次數(shù)自動(dòng)變化。我這里為了顯示,就寫到一個(gè)數(shù)組里面,而且這找的轉(zhuǎn)盤素材同一獎(jiǎng)項(xiàng)還有多處出現(xiàn),故用這樣一個(gè)數(shù)組來存儲(chǔ)(這里根據(jù)實(shí)際業(yè)務(wù)而定,不是重點(diǎn))。

//獎(jiǎng)項(xiàng)數(shù)據(jù)

$prize_arr=array(

'youpan'=>array('angle'=>array('16-40','196-220'),'prize'=>'U盤1個(gè)','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朵,繼續(xù)努力','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是角度,最小角度與最大角度用‘-’隔開,有多個(gè)。這個(gè)角度是控制轉(zhuǎn)盤或指針最終停下來時(shí)離起點(diǎn)的角度,范圍是0~360。根據(jù)實(shí)際素材而定,我這找的圖不規(guī)則,作圖的人坑爹,調(diào)了多次才得到比較精準(zhǔn)的角度。v則是概率。

根據(jù)上面的獎(jiǎng)項(xiàng)設(shè)定,通過下面的函數(shù)返回轉(zhuǎn)動(dòng)信息到前臺(tái):

//獲得旋轉(zhuǎn)信息

function getRotate($prize_arr) {

$data=array();

$option=$_GET;//根據(jù)前臺(tái)的選擇更改原定默認(rèn)概率

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

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

}

$prize=getPrize($prize_arr);//通過概率原理設(shè)計(jì)函數(shù)獲得其中一個(gè)獎(jiǎng)項(xiàng)

$angle=$prize['angle'];

shuffle($angle);//打亂角度數(shù)組

$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);//為了不那么單調(diào),隨機(jī)一下轉(zhuǎn)動(dòng)時(shí)間和轉(zhuǎn)動(dòng)圈數(shù)

echo json_encode($data);

}

至此后端的程序完畢。前端還得有個(gè)調(diào)整概率的功能,腦子里想到的就是滑動(dòng)條,html5有這個(gè)特性,但樣式簡(jiǎn)單也兼容性也有問題。百度了一下知道jqueryui有相關(guān)控件,但不怕笑話作為新人還沒用過jqueryui,無意發(fā)現(xiàn)了noUiSlider這個(gè)專為不使用jqueryui實(shí)現(xiàn)滑動(dòng)條而生的插件,短小精悍。最近又瞄了瞄BootStrap,順手又拿來排版一下這前端頁(yè)面,好吧,基本沒用到它的什么東西。

現(xiàn)在時(shí)間凌晨1:52,夜已深,后面繼續(xù)。。。

2014/5/14 23:13,繼續(xù)。

對(duì)于改變概率值,上邊說了使用noUiSlider,用法可以到官網(wǎng)查看:

$(".youpan").noUiSlider({

start:[10],//起始值

range:{//范圍

'min':0,

'max':99,

},

connect:'lower',//寫上左邊就變色

serialization: {

lower: [

$.Link({

target: $('#youpan')//數(shù)值在哪里顯示

})

],

format: {

decimals: 0,//數(shù)值保留幾位小數(shù)

mark: ','

}

}

});

在頁(yè)面加載函數(shù)里邊給每個(gè)需要滑動(dòng)的元素綁定以上事件即可。更改各項(xiàng)值放在一個(gè)form表單,點(diǎn)擊開始抽獎(jiǎng)收集表單的信息ajax發(fā)送到后臺(tái)計(jì)算出具體的旋轉(zhuǎn)信息,再進(jìn)行轉(zhuǎn)動(dòng)抽獎(jiǎng)。發(fā)送ajax的函數(shù)如下:

function getPrize() {

var result=null;

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

$.ajax({

url:"03.php",

type:"GET",

data:option,

dataType:"json",

cache:false,

async:false,//同步,否則無法把后臺(tái)信息信息捕獲

error:function(){

alert('出錯(cuò)了');

return false;

},

success:function(data){

result=data;

}

});

return result;}

接下來是關(guān)鍵的根據(jù)后臺(tái)的信息進(jìn)行轉(zhuǎn)動(dòng)并控制停止角度,主要是jqueryrotate的用法,詳細(xì)的可以點(diǎn)擊上邊高亮的鏈接查看。下邊也有注釋:

function rotate() {

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

$("#start").rotate({

bind:{

click:function(){

$(this).unbind('click').css("cursor","default");//取消點(diǎn)擊事件

var value=getPrize();

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

$(this).rotate({

duration:value.duration,//多少毫秒內(nèi)完成轉(zhuǎn)動(dòng)

angle:0,//起始角度

animateTo:value.n*360+value.angle,//一共轉(zhuǎn)動(dòng)多少角度

easing:eval(effect),//轉(zhuǎn)動(dòng)動(dòng)畫擴(kuò)展

callback:function(){//結(jié)束時(shí)的回調(diào)函數(shù)

alert(value.message);

}

})

}

}

})

}

轉(zhuǎn)動(dòng)動(dòng)畫那里,注意得eval()一下,否則得到的只是一個(gè)字符串不是動(dòng)畫函數(shù)。這個(gè)動(dòng)畫也是用的jQuery Easing這個(gè)插件,插件再借用插件,很常見的事,什么都自己寫,是很不現(xiàn)實(shí)的,童鞋。這些動(dòng)畫效果用在這里有一兩個(gè)動(dòng)不了,不知為何。把這個(gè)rotate函數(shù)放到頁(yè)面加載函數(shù)中,在頁(yè)面加載完畢即可進(jìn)行轉(zhuǎn)動(dòng)抽獎(jiǎng)。點(diǎn)擊之后取消點(diǎn)擊事件,是為了防止轉(zhuǎn)動(dòng)過程中或者抽完一次后繼續(xù)點(diǎn)擊。當(dāng)然我這里有“再來一發(fā)”就是給再綁上。具體看業(yè)務(wù)需要,怎么搞都行。

至此,一個(gè)簡(jiǎn)單的轉(zhuǎn)盤抽獎(jiǎng)就完成了,雖然簡(jiǎn)陋了點(diǎn)但也能滿足一般的業(yè)務(wù)需要。有什么問題或者改進(jìn)意見,歡迎各位看官提出。^~^

update:2015/06/17

鑒于有同學(xué)說不懂03.php里邊的內(nèi)容,順便貼出來吧。按需修改。

//獎(jiǎng)項(xiàng)數(shù)據(jù)

$prize_arr=array(

'youpan'=>array('angle'=>array('16-40','196-220'),'prize'=>'U盤1個(gè)','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朵,繼續(xù)努力','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),

);

//根據(jù)獎(jiǎng)項(xiàng)數(shù)據(jù)獲得具體獎(jiǎng)項(xiàng)

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);//隨機(jī)數(shù)

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

return $v;

}else{

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

}

}

}

//獲得旋轉(zhuǎn)信息

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

}

getRotate($prize_arr);

Update:2015/11/23

鑒于經(jīng)常有人問要源代碼打包,其實(shí)是只是很基本的一點(diǎn)東西而已,離應(yīng)用于實(shí)際項(xiàng)目還有很長(zhǎng)距離。

代碼打包下載(引入的相關(guān)js與圖片自行復(fù)制了):代碼打包

總結(jié)

以上是生活随笔為你收集整理的php ajax 概率 转盘,php+jquery实现转盘抽奖 概率可任意调的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。