php摇杆Tiger摇奖
先说下整体思路,代码已附下方。
1、递归产生一个非中奖数(即非连续数字:'111','222','333','444','555','666','777','888')
2、点击摇奖,把奖项通过设置的中奖概率顺序排序(如代码:maopao)
3、放入中奖产生(如代码:get_rand)
4、若中奖则重新从(即连续数字:'111','222','333','444','555','666','777','888') 中随机一个,若未中奖则返回(1)随机数
- /*中奖产生*/
- public function get_rand($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;
- }
- /*
- *随机数
- * */
- function randNum(){
- $randNum=mt_rand(1,8).mt_rand(1,8).mt_rand(1,8);
- $award_arr=array('111','222','333','444','555','666','777','888');
- if(in_array($randNum,$award_arr)){
- return $this->randNum();
- }
- return $randNum;
- }
- public function maopao($arr){
- for($i=0;$i<count($arr)-1;$i++){
- for($j=$i+1;$j<count($arr);$j++){
- if($arr[$j]['nums']<$arr[$i]['nums']){
- $temp=$arr[$i];
- $arr[$i]=$arr[$j];
- $arr[$j]=$temp;
- }
- }
- }
- return $arr;
- }
- /*摇奖*/
- public function luckDraw($userId){
- ini_set('date.timezone','Asia/Shanghai');
- $tigerrock_user_obj=new IModel('tigerrock_user');
- //用户摇奖信息:已摇奖次数等
- $tiger_data=$tigerrock_user_obj->getObj('user_id='.$userId,'id,award_type,rock_num,award_num,rock_time');
- if(!$tiger_data){ //如果没有摇奖,则新建用户记录
- $add_data=array(
- 'user_id'=>$userId,
- 'rock_num'=>1,
- 'award_num'=>0,
- 'award_type'=>1,
- 'rock_time'=>date('Y-m-d',time())
- );
- $tigerrock_user_obj=new IModel('tigerrock_user');
- $tigerrock_user_obj->setData($add_data);
- $tiger_data['id']=$tigerrock_user_obj->add();
- $proId=0;
- $rock_num=0;
- $award_num=0;
- }else{
- $award_type=$tiger_data['award_type'];
- $rock_num=$tiger_data['rock_num'];
- $award_num=$tiger_data['award_num'];
- //判断是否为当天摇奖,不是则清空,是则累加
- if(empty($tiger_data['rock_time'])||strtotime($tiger_data['rock_time'])-strtotime(date('Y-m-d'))!=0){
- $a_data=array(
- 'rock_time'=>"'".date('Y-m-d')."'",
- 'rock_num'=>0,
- );
- $tigerrock_user1_obj=new IModel('tigerrock_user');
- $tigerrock_user1_obj->update('id='.$tiger_data['id'],$a_data);
- $rock_num=0;
- }
- if($award_num>0){
- $award_num=$award_num-1;
- }else{
- $award_num=0;
- }
- }
- $total_amount=$this->tiger_proValue(); //奖金池--总金额
- $randNum=$this->randNum(); //生成3位不同的随机数
- dump_str($randNum,'randNum');
- $randNum_arr=str_split($randNum); //把随机数切割成数组
- $rock_num1=$randNum_arr[0];
- $rock_num2=$randNum_arr[1];
- $rock_num3=$randNum_arr[2];
- //摇奖统计
- $TC_OBJ=new IModel('tigerrock_count');
- $countData=$TC_OBJ->getObj('id=1','today_num,total_num,today_date');
- //新一天的第一次抽奖
- if(empty($countData['today_date'])||strtotime($countData['today_date'])-strtotime(date('Y-m-d',time()))!=0){
- $use_updata=array(
- 'usenums'=>0,
- 'usetime'=>"'".date('Y-m-d',time())."'",
- );
- $tconfig_obj=new IModel('tigerrock_config');
- $tconfig_obj->update('1=1',$use_updata); //更新清空所有历史一天中奖数以及时间
- $conf1_updata=array(
- 'today_date'=>"'".date('Y-m-d',time())."'",
- 'today_num'=>0,
- );
- $countData['today_num']=0;
- $tount_obj=new IModel('tigerrock_count');
- $tount_obj->update('id=1',$conf1_updata); //更新清空历史一天抽奖总次数
- }
- $member_obj=new IModel('member');
- //查询用户积分
- $point=$member_obj->getObj('member_id='.$userId,'member_points');
- //是否超出免费抽奖次数
- if($rock_num>2){
- if($point<5){
- return array(
- 'code'=>'200',
- 'msg'=>'可使用经验值不足',
- 'data'=>array('point'=>$point,'rock_num'=>$rock_num+1,'rock_num1'=>$rock_num1,'rock_num2'=>$rock_num2,'rock_num3'=>$rock_num3,'is_award'=>0,'total_amount'=>$total_amount)
- );
- }
- $point=$point-5;
- $member_obj=new IModel('member');
- $member_obj->update('member_id='.$userId,array('member_points'=>$point));
- }
- $updata_data=array(
- 'award_num'=>$award_num,
- 'rock_time'=>"'".date('Y-m-d',time())."'",
- 'rock_num'=>$rock_num+1,
- );
- //更新个人摇奖次数
- $tigerrock_user_obj=new IModel('tigerrock_user');
- $tigerrock_user_obj->update('id='.$tiger_data['id'],$updata_data);
- /*加入摇奖日志*/
- $rock_log=new IModel('tigerrock_log');
- $data=array(
- 'user_id'=>$userId,
- 'nums'=>$randNum,
- 'time'=>"'".date('Y-m-d H:i:s',time())."'",
- );
- $rock_log->setData($data);
- $rock_log->add();
- $today_num=$countData['today_num'];
- $TC_OBJ->update('id=1',array('total_num'=>$countData['total_num']+1,'today_num'=>$today_num+1 )); //修改总数量
- $tclass_obj=new IModel('tigerrock_class');
- $classData=$tclass_obj->getObj('start_num<'.$today_num.' and end_num>='.$today_num,'end_num,id');
- $rock=$classData['end_num'];
- $classId=$classData['id'];
- if(!$classData){
- $rock=1000;
- $classId=1;
- }
- $tc_obj=new IModel('tigerrock_config'); //获取摇奖配置数据
- $proId_arr=$tc_obj->query('classId='.$classId.' and is_del=0 and status=1','id,nums,usenums,usetime,proId');
- $proId_arr=$this->maopao($proId_arr); //通过奖品数量排序
- $prize_arr=array();
- $goodNum=0;
- $prize_arr[0]=array();
- $tp_obj=new IModel('tigerrock_products');
- foreach($proId_arr as $v){ //统计总奖品数量
- $tp_data=$tp_obj->getObj('id='.$v['proId'],'stock,winnings');
- if($tp_data['stock']-$tp_data['winnings']<=0){//如果库存不足
- $prize_arr[]=array('id'=>(int)$v['id'],'prize'=>$v['id'],'v'=>0);
- }else{
- $prize_arr[]=array('id'=>(int)$v['id'],'prize'=>$v['id'],'v'=>(int)$v['nums']-$v['usenums']);
- }
- $goodNum+=(int)$v['nums']-$v['usenums'];
- }
- $prize_arr[]=array('id'=>1,'prize'=>0,'v'=>$rock-$today_num);
- unset($prize_arr[0]);
- $arr=array();
- foreach ($prize_arr as $key => $val) {
- $arr[$val['id']] = $val['v'];
- }
- $rid =$this->get_rand($arr); //根据概率获取奖项id
- // $tl_obj=new IModel('tigerrock_log');
- // $tl_obj->setData(array('user_id'=>$userId,'nums'=>$randNum,'time'=>date('Y-m-d H:i:s',time())));
- // $tl_obj->add();
- if($rid!=1){
- $TC_OBJ=new IQuery('tigerrock_config as tc');
- $TC_OBJ->fields='tp.id,tp.name as good_name,tp.img,tp.discription,tc.nums,tp.stock,tp.winnings,tp.id as tpid,tc.usenums,tc.usetime';
- $TC_OBJ->where='tc.is_del=0 and tc.status=1 and tc.id='.$rid;
- $TC_OBJ->join='left join tigerrock_products as tp on tp.id=tc.proId';
- $pro_data1=$TC_OBJ->find();
- $pro_data=array();
- if($pro_data1){
- $pro_data=$pro_data1[0];
- }
- /*未绑定手机中将过滤*/
- $u_obj=new IModel('member');
- $phone_status=$u_obj->getObj('member_id='.$userId,'member_mobile_bind');
- if(!$phone_status){
- $pro_data='';
- }
- //获取用户是否已中奖
- // $ta_obj=new IModel('tigerrock_award');
- // $award_id=$ta_obj->getObj('user_id='.$userId.' and status=1','id');
- // if($award_id){
- // $pro_data='';
- // }
- //中奖次数达到设定次数
- if(isset($pro_data['nums'])&&isset($pro_data['usenums'])&&$pro_data['nums']<=(int)$pro_data['usenums']){
- $pro_data='';
- }
- //验证实际商品库存,如果库存不足,则不中奖且更新中奖设置
- if($pro_data['stock']<$pro_data['winnings']){
- $pro_data='';
- $tc_obj->update('id='.$rid,array('status'=>0));
- }
- if(!$pro_data||empty($pro_data)){
- return array(
- 'code'=>'200',
- 'msg'=>'差一点点,再试一把!',
- 'data'=>array('point'=>$point,'rock_num'=>$rock_num+1,'rock_num1'=>$rock_num1,'rock_num2'=>$rock_num2,'rock_num3'=>$rock_num3,'is_award'=>0,'total_amount'=>$total_amount)
- );
- }else{
- //更新库存以及可用奖品数量
- $tc_obj=new IModel('tigerrock_config'); //更新已使用数
- $tc_obj->update(' status=1 and id='.$rid,array('usenums'=>$pro_data['usenums']+1));
- /*更新库存*/
- /*$tco_obj=new IQuery('tigerrock_config as tc');
- $tco_obj->fields='tp.stock,tp.id';
- $tco_obj->join=' left join '.C('DB.DB_PREFIX').'tigerrock_products tp on tp.id=tc.proId';
- $tco_obj->where='tc.id='.$rid;
- $tco_obj->limit='1';
- $product_data=$tco_obj->find();
- $tp_where='id='.$product_data[0]['id'];
- $tp_obj=new IModel('tigerrock_products');
- $tp_obj->update($tp_where,array('stock'=>$product_data[0]['stock']-1));*/
- //更新奖品表中的已中奖数
- $tp_obj=new IModel('tigerrock_products');
- $tp_obj->update('id='.$pro_data['tpid'],array('winnings'=>$pro_data['winnings']+1));
- $award_data=array(
- 'user_id'=>$userId,
- 'proId'=>$pro_data['id'],
- 'time'=>date('Y-m-d')
- );
- $tigerrock_award_oj=new IModel('tigerrock_award');
- $tigerrock_award_oj->setData($award_data);
- $award_id=$tigerrock_award_oj->add();
- $pro_data['img']=imgChangePath($pro_data['img']);
- $aNum=rand(0,7);
- $award_arr=array('111','222','333','444','555','666','777','888'); //中奖号码池
- $tl_obj=new IModel('tigerrock_log'); //添加中奖记录
- $tl_obj->setData(array('user_id'=>$userId,'nums'=>$award_arr[$aNum],'time'=>date('Y-m-d H:i:s',time())));
- $tl_obj->add();
- $randNum_arr=str_split($award_arr[$aNum]); //切割三位数中奖码
- $pro_data['id']=$award_id;
- $pro_data['rock_num1']=$randNum_arr[0];
- $pro_data['rock_num2']=$randNum_arr[1];
- $pro_data['rock_num3']=$randNum_arr[2];
- $pro_data['point']=$point;
- $pro_data['rock_num']=$rock_num+1;
- $pro_data['is_award']=1;
- $pro_data['total_amount']=$total_amount;
- return array(
- 'code'=>'200',
- 'msg'=>'恭喜你中奖了',
- 'data'=>$pro_data
- );
- }
- }else{
- return array(
- 'code'=>'200',
- 'msg'=>'差一点点就中了,再试一把!',
- 'data'=>array('point'=>$point,'rock_num'=>$rock_num+1,'rock_num1'=>$rock_num1,'rock_num2'=>$rock_num2,'rock_num3'=>$rock_num3,'is_award'=>0,'total_amount'=>$total_amount)
- );
- }
- }
php摇杆Tiger摇奖的更多相关文章
- JAVA小项目之摇奖机
功能: 点击”摇杆“开始: 两种结束滚动方式,A:点击”摇杆“ B:分别点击 对应结果框的按钮: 实现最后减速停下来效果,模拟真实摇奖机. 知识点:A.线程的控制,B.图片轮播原理 效果图: 窗口 ...
- P235 实战练习(集合类2)、摇奖程序和验证码(修改版)
1.分别向Set集合以及List集合中添加“A”.“a”.“c”.“C”.“a”5个元素,观察重复值“a”能否在List集合以及Set集合中成功添加. package org.hanqi.practi ...
- C语言,一个彩票摇奖程序摇出22选5的中奖号码
摇奖机摇奖,无非就是利用它的随机性,让球从摇奖机中随机地掉出,就成了中奖号码.而C语言中也同样有个rand()函数可以产生随机数,利用这个rand()函数产生的随机数,同样可以代替从摇奖机中随机摇出的 ...
- 异步委托 多线程实现摇奖器 winform版
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- [AHOI2001]彩票摇奖
[AHOI2001]彩票摇奖 题目描述 为了丰富人民群众的生活.支持某些社会公益事业,北塔市设置了一 项彩票.该彩票的规则是: (1) 每张彩票上印有 7 个各不相同的号码,且这些号码的取指范围为 1 ...
- 题解 P2550 【[AHOI2001]彩票摇奖】
题目链接 大家有没有发现数据范围好小呀 我们只需要开7~8的数组就好!! 中间比较的时候懒得用for循环比较了.直接爆搜. 废话不多说,直接上代码. #include<bits/stdc++.h ...
- P1074 彩票摇奖
题目描述 为了丰富人民群众的生活.支持某些社会公益事业,北塔市设置了一项彩票.该彩票的规则是: (1) 每张彩票上印有 7 个各不相同的号码,且这些号码的取指范围为 1~33. (2) 每次在兑奖前都 ...
- C#摇奖程序
private void Form1_Load(object sender, EventArgs e) { //取消跨线层访问控件的判断 Control.CheckForIllegalCrossThr ...
- 模拟摇奖:从1-36中随机抽出8个不重复的数字(math)
public class Yaojiang { public static void main(String[] args) { // TODO 自动生成的方法存根 int[] a=new int[8 ...
随机推荐
- html页面的CSS、DIV命名规则
CSS命名规则 头:header 内容:content/containe 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中:l ...
- php.ini 安全配置
(1) 打开php的安全模式 php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/ ...
- Shell脚本
shell script,是一种为shell编写的脚本程序. 业界所说的shell通常是指shell脚本.shell和shell script.
- 报错mongoose.connection.db.collectionnames is not a function
mongoose.connection.db.collectionNames方法已经无效 建议使用mongoose.connection.db.listCollections()
- java程序打包成jar
1. 建立文件夹:proj,在该文件夹下建立3个子文件夹:lib,src 2. 在lib文件夹中放置依赖的jar包 3. 在src中放置类文件:com.cnjava.demo.Main.java 4. ...
- 无法启动"D\projects\hello\Debug\hello.exe" 系统找不到指定的文件。[LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏]
这两天安装Visual Studio遇到这样的一个问题,用自己的电脑和公司的电脑都出现同样的问题.两台电脑都是新系统,按理来说是没有问题的.但是一出现问题,对于我这个小白来说,还是耗费了挺多精力都无果 ...
- System Error Codes
很明显,以下的文字来自微软MSDN 链接http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx M ...
- Python:如何删除文件中的空白行?
def delblankline(infile,outfile): infopen = open(infile,'r') outfopen = open(outfile,'w') lines = in ...
- 八皇后问题_Qt_界面程序实现
//核心代码如下 //Queen--放置皇后 #include "queue.h" queue::queue() { *; ; this->board = new bool[ ...
- phpcms调用一个指定的栏目的url和栏目名称
{$CATEGORY[$catid]['url']} 指定栏目URL代码 {$CATEGORY[$catid]['catname']} 指定栏目名称代码 {$CATEGORYS[41]['url']} ...