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

1、递归产生一个非中奖数(即非连续数字:'111','222','333','444','555','666','777','888')

2、点击摇奖,把奖项通过设置的中奖概率顺序排序(如代码:maopao)

3、放入中奖产生(如代码:get_rand)

4、若中奖则重新从(即连续数字:'111','222','333','444','555','666','777','888')  中随机一个,若未中奖则返回(1)随机数

  1. /*中奖产生*/
  2. public function get_rand($proArr) {
  3.   $result = '';
  4.   //概率数组的总概率精度
  5.   $proSum = array_sum($proArr);
  6.   //概率数组循环
  7.   foreach ($proArr as $key => $proCur) {
  8. $randNum = mt_rand(1, $proSum);
  9. if ($randNum <= $proCur) {
  10. $result = $key;
  11. break;
  12. } else {
  13. $proSum -= $proCur;
  14. }
  15. }
  16. unset ($proArr);
  17. return $result;
  18. }
  19.  
  20. /*
  21. *随机数
  22. * */
  23. function randNum(){
  24.  
  25.   $randNum=mt_rand(1,8).mt_rand(1,8).mt_rand(1,8);
  26.  
  27.   $award_arr=array('111','222','333','444','555','666','777','888');
  28.  
  29.   if(in_array($randNum,$award_arr)){
  30.  
  31.     return $this->randNum();
  32.   }
  33.  
  34. return $randNum;
  35. }
  36.  
  37. public function maopao($arr){
  38.   for($i=0;$i<count($arr)-1;$i++){
  39.  
  40.   for($j=$i+1;$j<count($arr);$j++){
  41.  
  42.   if($arr[$j]['nums']<$arr[$i]['nums']){
  43.  
  44.   $temp=$arr[$i];
  45.   $arr[$i]=$arr[$j];
  46.   $arr[$j]=$temp;
  47.       }
  48.  
  49.     }
  50.  
  51.   }
  52. return $arr;
  53. }
  54.  
  55. /*摇奖*/
  56. public function luckDraw($userId){
  57.  
  58. ini_set('date.timezone','Asia/Shanghai');
  59.  
  60. $tigerrock_user_obj=new IModel('tigerrock_user');
  61. //用户摇奖信息:已摇奖次数等
  62. $tiger_data=$tigerrock_user_obj->getObj('user_id='.$userId,'id,award_type,rock_num,award_num,rock_time');
  63.  
  64. if(!$tiger_data){ //如果没有摇奖,则新建用户记录
  65.  
  66. $add_data=array(
  67. 'user_id'=>$userId,
  68. 'rock_num'=>1,
  69. 'award_num'=>0,
  70. 'award_type'=>1,
  71. 'rock_time'=>date('Y-m-d',time())
  72. );
  73. $tigerrock_user_obj=new IModel('tigerrock_user');
  74. $tigerrock_user_obj->setData($add_data);
  75. $tiger_data['id']=$tigerrock_user_obj->add();
  76.  
  77. $proId=0;
  78. $rock_num=0;
  79. $award_num=0;
  80.  
  81. }else{
  82.  
  83. $award_type=$tiger_data['award_type'];
  84. $rock_num=$tiger_data['rock_num'];
  85. $award_num=$tiger_data['award_num'];
  86. //判断是否为当天摇奖,不是则清空,是则累加
  87. if(empty($tiger_data['rock_time'])||strtotime($tiger_data['rock_time'])-strtotime(date('Y-m-d'))!=0){
  88. $a_data=array(
  89. 'rock_time'=>"'".date('Y-m-d')."'",
  90. 'rock_num'=>0,
  91. );
  92. $tigerrock_user1_obj=new IModel('tigerrock_user');
  93. $tigerrock_user1_obj->update('id='.$tiger_data['id'],$a_data);
  94. $rock_num=0;
  95. }
  96.  
  97. if($award_num>0){
  98. $award_num=$award_num-1;
  99. }else{
  100. $award_num=0;
  101. }
  102. }
  103. $total_amount=$this->tiger_proValue(); //奖金池--总金额
  104. $randNum=$this->randNum(); //生成3位不同的随机数
  105. dump_str($randNum,'randNum');
  106. $randNum_arr=str_split($randNum); //把随机数切割成数组
  107.  
  108. $rock_num1=$randNum_arr[0];
  109. $rock_num2=$randNum_arr[1];
  110. $rock_num3=$randNum_arr[2];
  111.  
  112. //摇奖统计
  113. $TC_OBJ=new IModel('tigerrock_count');
  114. $countData=$TC_OBJ->getObj('id=1','today_num,total_num,today_date');
  115.  
  116. //新一天的第一次抽奖
  117. if(empty($countData['today_date'])||strtotime($countData['today_date'])-strtotime(date('Y-m-d',time()))!=0){
  118.  
  119. $use_updata=array(
  120. 'usenums'=>0,
  121. 'usetime'=>"'".date('Y-m-d',time())."'",
  122. );
  123.  
  124. $tconfig_obj=new IModel('tigerrock_config');
  125. $tconfig_obj->update('1=1',$use_updata); //更新清空所有历史一天中奖数以及时间
  126.  
  127. $conf1_updata=array(
  128. 'today_date'=>"'".date('Y-m-d',time())."'",
  129. 'today_num'=>0,
  130. );
  131. $countData['today_num']=0;
  132. $tount_obj=new IModel('tigerrock_count');
  133. $tount_obj->update('id=1',$conf1_updata); //更新清空历史一天抽奖总次数
  134.  
  135. }
  136.  
  137. $member_obj=new IModel('member');
  138. //查询用户积分
  139. $point=$member_obj->getObj('member_id='.$userId,'member_points');
  140. //是否超出免费抽奖次数
  141. if($rock_num>2){
  142.  
  143. if($point<5){
  144. return array(
  145. 'code'=>'200',
  146. 'msg'=>'可使用经验值不足',
  147. '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)
  148. );
  149. }
  150.  
  151. $point=$point-5;
  152.  
  153. $member_obj=new IModel('member');
  154.  
  155. $member_obj->update('member_id='.$userId,array('member_points'=>$point));
  156.  
  157. }
  158.  
  159. $updata_data=array(
  160. 'award_num'=>$award_num,
  161. 'rock_time'=>"'".date('Y-m-d',time())."'",
  162. 'rock_num'=>$rock_num+1,
  163.  
  164. );
  165.  
  166. //更新个人摇奖次数
  167. $tigerrock_user_obj=new IModel('tigerrock_user');
  168. $tigerrock_user_obj->update('id='.$tiger_data['id'],$updata_data);
  169.  
  170. /*加入摇奖日志*/
  171. $rock_log=new IModel('tigerrock_log');
  172.  
  173. $data=array(
  174. 'user_id'=>$userId,
  175. 'nums'=>$randNum,
  176. 'time'=>"'".date('Y-m-d H:i:s',time())."'",
  177. );
  178.  
  179. $rock_log->setData($data);
  180.  
  181. $rock_log->add();
  182.  
  183. $today_num=$countData['today_num'];
  184.  
  185. $TC_OBJ->update('id=1',array('total_num'=>$countData['total_num']+1,'today_num'=>$today_num+1 )); //修改总数量
  186.  
  187. $tclass_obj=new IModel('tigerrock_class');
  188. $classData=$tclass_obj->getObj('start_num<'.$today_num.' and end_num>='.$today_num,'end_num,id');
  189.  
  190. $rock=$classData['end_num'];
  191. $classId=$classData['id'];
  192.  
  193. if(!$classData){
  194. $rock=1000;
  195. $classId=1;
  196. }
  197.  
  198. $tc_obj=new IModel('tigerrock_config'); //获取摇奖配置数据
  199. $proId_arr=$tc_obj->query('classId='.$classId.' and is_del=0 and status=1','id,nums,usenums,usetime,proId');
  200.  
  201. $proId_arr=$this->maopao($proId_arr); //通过奖品数量排序
  202. $prize_arr=array();
  203. $goodNum=0;
  204. $prize_arr[0]=array();
  205. $tp_obj=new IModel('tigerrock_products');
  206. foreach($proId_arr as $v){ //统计总奖品数量
  207. $tp_data=$tp_obj->getObj('id='.$v['proId'],'stock,winnings');
  208. if($tp_data['stock']-$tp_data['winnings']<=0){//如果库存不足
  209. $prize_arr[]=array('id'=>(int)$v['id'],'prize'=>$v['id'],'v'=>0);
  210. }else{
  211. $prize_arr[]=array('id'=>(int)$v['id'],'prize'=>$v['id'],'v'=>(int)$v['nums']-$v['usenums']);
  212. }
  213. $goodNum+=(int)$v['nums']-$v['usenums'];
  214. }
  215. $prize_arr[]=array('id'=>1,'prize'=>0,'v'=>$rock-$today_num);
  216. unset($prize_arr[0]);
  217. $arr=array();
  218. foreach ($prize_arr as $key => $val) {
  219. $arr[$val['id']] = $val['v'];
  220. }
  221. $rid =$this->get_rand($arr); //根据概率获取奖项id
  222.  
  223. // $tl_obj=new IModel('tigerrock_log');
  224. // $tl_obj->setData(array('user_id'=>$userId,'nums'=>$randNum,'time'=>date('Y-m-d H:i:s',time())));
  225. // $tl_obj->add();
  226.  
  227. if($rid!=1){
  228.  
  229. $TC_OBJ=new IQuery('tigerrock_config as tc');
  230. $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';
  231. $TC_OBJ->where='tc.is_del=0 and tc.status=1 and tc.id='.$rid;
  232. $TC_OBJ->join='left join tigerrock_products as tp on tp.id=tc.proId';
  233. $pro_data1=$TC_OBJ->find();
  234. $pro_data=array();
  235. if($pro_data1){
  236.  
  237. $pro_data=$pro_data1[0];
  238. }
  239.  
  240. /*未绑定手机中将过滤*/
  241. $u_obj=new IModel('member');
  242. $phone_status=$u_obj->getObj('member_id='.$userId,'member_mobile_bind');
  243. if(!$phone_status){
  244. $pro_data='';
  245. }
  246.  
  247. //获取用户是否已中奖
  248. // $ta_obj=new IModel('tigerrock_award');
  249. // $award_id=$ta_obj->getObj('user_id='.$userId.' and status=1','id');
  250.  
  251. // if($award_id){
  252. // $pro_data='';
  253. // }
  254.  
  255. //中奖次数达到设定次数
  256. if(isset($pro_data['nums'])&&isset($pro_data['usenums'])&&$pro_data['nums']<=(int)$pro_data['usenums']){
  257.  
  258. $pro_data='';
  259. }
  260.  
  261. //验证实际商品库存,如果库存不足,则不中奖且更新中奖设置
  262. if($pro_data['stock']<$pro_data['winnings']){
  263. $pro_data='';
  264. $tc_obj->update('id='.$rid,array('status'=>0));
  265. }
  266.  
  267. if(!$pro_data||empty($pro_data)){
  268. return array(
  269. 'code'=>'200',
  270. 'msg'=>'差一点点,再试一把!',
  271. '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)
  272. );
  273.  
  274. }else{
  275.  
  276. //更新库存以及可用奖品数量
  277.  
  278. $tc_obj=new IModel('tigerrock_config'); //更新已使用数
  279. $tc_obj->update(' status=1 and id='.$rid,array('usenums'=>$pro_data['usenums']+1));
  280.  
  281. /*更新库存*/
  282.  
  283. /*$tco_obj=new IQuery('tigerrock_config as tc');
  284. $tco_obj->fields='tp.stock,tp.id';
  285. $tco_obj->join=' left join '.C('DB.DB_PREFIX').'tigerrock_products tp on tp.id=tc.proId';
  286. $tco_obj->where='tc.id='.$rid;
  287. $tco_obj->limit='1';
  288. $product_data=$tco_obj->find();
  289. $tp_where='id='.$product_data[0]['id'];
  290. $tp_obj=new IModel('tigerrock_products');
  291. $tp_obj->update($tp_where,array('stock'=>$product_data[0]['stock']-1));*/
  292.  
  293. //更新奖品表中的已中奖数
  294. $tp_obj=new IModel('tigerrock_products');
  295. $tp_obj->update('id='.$pro_data['tpid'],array('winnings'=>$pro_data['winnings']+1));
  296.  
  297. $award_data=array(
  298. 'user_id'=>$userId,
  299. 'proId'=>$pro_data['id'],
  300. 'time'=>date('Y-m-d')
  301. );
  302.  
  303. $tigerrock_award_oj=new IModel('tigerrock_award');
  304.  
  305. $tigerrock_award_oj->setData($award_data);
  306.  
  307. $award_id=$tigerrock_award_oj->add();
  308.  
  309. $pro_data['img']=imgChangePath($pro_data['img']);
  310.  
  311. $aNum=rand(0,7);
  312. $award_arr=array('111','222','333','444','555','666','777','888'); //中奖号码池
  313.  
  314. $tl_obj=new IModel('tigerrock_log'); //添加中奖记录
  315. $tl_obj->setData(array('user_id'=>$userId,'nums'=>$award_arr[$aNum],'time'=>date('Y-m-d H:i:s',time())));
  316. $tl_obj->add();
  317.  
  318. $randNum_arr=str_split($award_arr[$aNum]); //切割三位数中奖码
  319.  
  320. $pro_data['id']=$award_id;
  321. $pro_data['rock_num1']=$randNum_arr[0];
  322. $pro_data['rock_num2']=$randNum_arr[1];
  323. $pro_data['rock_num3']=$randNum_arr[2];
  324. $pro_data['point']=$point;
  325. $pro_data['rock_num']=$rock_num+1;
  326. $pro_data['is_award']=1;
  327. $pro_data['total_amount']=$total_amount;
  328.  
  329. return array(
  330. 'code'=>'200',
  331. 'msg'=>'恭喜你中奖了',
  332. 'data'=>$pro_data
  333. );
  334.  
  335. }
  336.  
  337. }else{
  338.  
  339. return array(
  340. 'code'=>'200',
  341. 'msg'=>'差一点点就中了,再试一把!',
  342. '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)
  343. );
  344. }
  345.  
  346. }

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. html页面的CSS、DIV命名规则

    CSS命名规则 头:header 内容:content/containe 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中:l ...

  2. php.ini 安全配置

    (1) 打开php的安全模式 php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/ ...

  3. Shell脚本

    shell script,是一种为shell编写的脚本程序. 业界所说的shell通常是指shell脚本.shell和shell script.

  4. 报错mongoose.connection.db.collectionnames is not a function

    mongoose.connection.db.collectionNames方法已经无效 建议使用mongoose.connection.db.listCollections()

  5. java程序打包成jar

    1. 建立文件夹:proj,在该文件夹下建立3个子文件夹:lib,src 2. 在lib文件夹中放置依赖的jar包 3. 在src中放置类文件:com.cnjava.demo.Main.java 4. ...

  6. 无法启动"D\projects\hello\Debug\hello.exe" 系统找不到指定的文件。[LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏]

    这两天安装Visual Studio遇到这样的一个问题,用自己的电脑和公司的电脑都出现同样的问题.两台电脑都是新系统,按理来说是没有问题的.但是一出现问题,对于我这个小白来说,还是耗费了挺多精力都无果 ...

  7. System Error Codes

    很明显,以下的文字来自微软MSDN 链接http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx M ...

  8. Python:如何删除文件中的空白行?

    def delblankline(infile,outfile): infopen = open(infile,'r') outfopen = open(outfile,'w') lines = in ...

  9. 八皇后问题_Qt_界面程序实现

    //核心代码如下 //Queen--放置皇后 #include "queue.h" queue::queue() { *; ; this->board = new bool[ ...

  10. phpcms调用一个指定的栏目的url和栏目名称

    {$CATEGORY[$catid]['url']} 指定栏目URL代码 {$CATEGORY[$catid]['catname']} 指定栏目名称代码 {$CATEGORYS[41]['url']} ...