先说下整体思路,代码已附下方。

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摇奖的更多相关文章

  1. JAVA小项目之摇奖机

    功能: 点击”摇杆“开始: 两种结束滚动方式,A:点击”摇杆“ B:分别点击 对应结果框的按钮: 实现最后减速停下来效果,模拟真实摇奖机. 知识点:A.线程的控制,B.图片轮播原理 效果图:   窗口 ...

  2. P235 实战练习(集合类2)、摇奖程序和验证码(修改版)

    1.分别向Set集合以及List集合中添加“A”.“a”.“c”.“C”.“a”5个元素,观察重复值“a”能否在List集合以及Set集合中成功添加. package org.hanqi.practi ...

  3. C语言,一个彩票摇奖程序摇出22选5的中奖号码

    摇奖机摇奖,无非就是利用它的随机性,让球从摇奖机中随机地掉出,就成了中奖号码.而C语言中也同样有个rand()函数可以产生随机数,利用这个rand()函数产生的随机数,同样可以代替从摇奖机中随机摇出的 ...

  4. 异步委托 多线程实现摇奖器 winform版

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  5. [AHOI2001]彩票摇奖

    [AHOI2001]彩票摇奖 题目描述 为了丰富人民群众的生活.支持某些社会公益事业,北塔市设置了一 项彩票.该彩票的规则是: (1) 每张彩票上印有 7 个各不相同的号码,且这些号码的取指范围为 1 ...

  6. 题解 P2550 【[AHOI2001]彩票摇奖】

    题目链接 大家有没有发现数据范围好小呀 我们只需要开7~8的数组就好!! 中间比较的时候懒得用for循环比较了.直接爆搜. 废话不多说,直接上代码. #include<bits/stdc++.h ...

  7. P1074 彩票摇奖

    题目描述 为了丰富人民群众的生活.支持某些社会公益事业,北塔市设置了一项彩票.该彩票的规则是: (1) 每张彩票上印有 7 个各不相同的号码,且这些号码的取指范围为 1~33. (2) 每次在兑奖前都 ...

  8. C#摇奖程序

    private void Form1_Load(object sender, EventArgs e) { //取消跨线层访问控件的判断 Control.CheckForIllegalCrossThr ...

  9. 模拟摇奖:从1-36中随机抽出8个不重复的数字(math)

    public class Yaojiang { public static void main(String[] args) { // TODO 自动生成的方法存根 int[] a=new int[8 ...

随机推荐

  1. mac 下修改jenkins的 端口号

    sudo defaults write /Library/Preferences/org.jenkins-ci httpPort 7070

  2. sql server日期时间转字符串

    一.sql server日期时间函数Sql Server中的日期与时间函数 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基 ...

  3. 解决selenium2在IE11上出错的问题,如Unable to get browser

    官方解决方案: https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver#required-configuration Re ...

  4. javascript 中的 bind (编辑中。。。。)

    这篇文章说的非常好!http://my.oschina.net/blogshi/blog/265415 我的体会就是,函数中的this,指的是运行时,它是被哪个对象调用的.因为javascrpit的函 ...

  5. [正则表达式]PCRE反向分组引用

    在常见的文本匹配场景上,经常会需要用到一些像HTML这样的嵌套标签类型的文本匹配,经过多翻折腾,拼凑出了这样的一条语句 (<([\w]+)>((?1)|[\w\s])*</\2> ...

  6. 此地址使用了一个通常用于网络浏览以外的端口。出于安全原因,Firefox 取消了该请求

    FirFox打开80以外的端口,会弹出以下提示: “此地址使用了一个通常用于网络浏览以外的端口.出于安全原因,Firefox 取消了该请求.”. 解决方法如下: 在Firefox地址栏输入about: ...

  7. putty可以远程连接linux,但上不了网(nat模式)

    话说,这个问题搞了我一个下午 = = 不过终于可以用NAT模式上网了,还是挺有成就感的 首先放张这样的图上去 证明putty 连linux 是木有问题的,但是上不了网哦~~~ 大家请注意, 当前ip是 ...

  8. java utils

    1.获取resouces中文件的绝对路径 String filePath = XXX.class.getClassLoader().getResource("/configs/interfa ...

  9. C#设计模式之工厂方法

    工厂方法模式: 1.不再提供一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成 如果出现新的按钮类型,只需要为这种新类型的按钮定义一个具体的工厂类就可以创建该新按 ...

  10. 关于Qt creator 无法使用fcitx输入中文的问题折腾

    环境: 系统ubuntu16.04amd64,qt5.4.2 安装完qt5.4后,在编写代码时,发现无法输入中文,离开qt creator 就立刻正常.原因似乎是qt对fcitx支持. 解决方法我是参 ...