码迷,mamicode.com
首页 > 微信 > 详细

微信红包的实现

时间:2017-08-26 22:46:55      阅读:439      评论:0      收藏:0      [点我收藏+]

标签:难点   and   get   size   ++   div   shuff   处理   double   

封装一个微信用包类,主要的功能有|:

红包中存有钱,多少个人分;每个分到的钱数,及获收红包的时间;

主要的功能有

                    打开红包;(如果打开红包的人数没有达到上限,则可以打开,并随机获得金额)

                    查看红包分配信息;

                    设置截止日期;(如果超过最大金额,则再打时提示过期)

思路:微信红包类应该具有的属性有红包金额,红包数,过期时间,领红包的人,时间等。

难点在于:将红包如何分成几份,等可能的被其他人抢到,而且不会出现为0的红包。

首先运用取随机数的类,每次取当前所剩金额的随机数,然后将这些分好的红包放到数组中的,随机打乱顺序,这样取得时候就是等可能性,每个人取得时候顺序获得数组中的红包。代码实现如下:

  1 package zuoye;
  2 import java.text.SimpleDateFormat;
  3 import java.util.*;
  4 public class zuoye_3 {
  5 
  6     public static void main(String[] args) {
  7         Scanner sc=new Scanner(System.in);
  8         Date t=new Date();                         //时间类,设定红包过期的时间
  9         Calendar c=Calendar.getInstance();
 10         c.setTime(t);
 11         c.add(Calendar.HOUR, 2);                   //2小时后过期
 12         System.out.println("请输入红包金额:");
 13         double n=sc.nextInt();
 14         System.out.println("请输入红包的数量:");
 15         int x=sc.nextInt();
 16         Money hong=new Money(n,c.getTime(),x);     //传递参数,红包金额,红包数,时间
 17         //sc.next();
 18         System.out.println("请输入抢红包的人的名字:");
 19         for(int i=0;i<x;i++)
 20         {  people ob1=new people(sc.next());         //创建几个人进行抢
 21            Date t1=new Date();    
 22           hong.qiang(ob1,t1);
 23         }
 24         hong.show();
 25     }
 26 
 27 }
 28 class Money{
 29     private double money;           //红包金额
 30     private Date time;              //到期时间
 31     private int size;               //红包数
 32     private int num;                //第几个人在抢
 33     private double nowmoney;        //红包剩余金额
 34     ArrayList<Double> str=new ArrayList<Double>(); //红包被分为存取随机金额
 35     ArrayList<people> p=new ArrayList<people>();   //抢红包的人
 36     public Money(double money, Date time, int size) {
 37         super();
 38         this.money = money; 
 39         this.time = time;
 40         this.size = size;
 41         nowmoney=money;
 42         yao();
 43     }
 44     /*
 45      * 将红包分为随机金额存到数组中,并处理如果金额为0时的情况,最后打乱顺序
 46      */
 47     private void yao()
 48     {  double m=nowmoney;         
 49         for(int i=1;i<=size;i++)
 50         {
 51             if(i==size)
 52              {str.add(m);
 53                m=0;
 54              }
 55             else
 56             {
 57                 Random r=new Random();
 58                 double x=0;
 59                 if(m!=0)
 60                 x=r.nextDouble()*m;
 61                 m-=x;
 62                 str.add(x);
 63             }
 64         }
 65         Collections.sort(str);
 66         for(int i=0;i<str.size();i++)
 67         {
 68             if(str.get(i)<0.005)
 69             {
 70                 double x=str.get(size-1)*0.01;
 71                 str.set(i,x+str.get(i));
 72                 str.set(size-1,str.get(size-1)-x);
 73             }
 74             else
 75             {
 76                 break;
 77             }
 78         }
 79         Collections.shuffle(str);
 80     }
 81     /*
 82      * 抢红包操作,参数为人和时间
 83      */
 84     void qiang(people ob,Date t){
 85         num++;
 86         if(num>size)
 87         {
 88             System.out.println("红包已经抢完了");
 89             return ;
 90         }
 91         if(t.after(time))
 92         {
 93             System.out.println("红包已经过期了");
 94             return ;
 95         }
 96             ob.money=str.get(num-1);
 97             ob.time=t;
 98             nowmoney-=ob.money;
 99             p.add(ob);
100             if(num==size)
101                 nowmoney=0;
102     }
103     /*
104      * 显示当前红包情况,被谁抢,什么时候,剩余多少
105      */
106     void show()
107     {
108         Collections.sort(p);
109         System.out.print("红包共"+this.money+"元,已有"+p.size()+"人抢,现在剩余");
110         System.out.printf("%.2f\n",this.nowmoney);
111         SimpleDateFormat c=new SimpleDateFormat("h:mm:ss");                   //设定日期的输出格式
112         for(int i=0;i<p.size();i++)
113         {
114             System.out.print(p.get(i).name+"抢到");
115             System.out.printf("%.2f",p.get(i).money);
116             System.out.println("  时间"+c.format(p.get(i).time));
117         }
118     }
119 }
120 class people implements Comparable<people>{
121     String name;
122     double money;
123     Date time;
124     public people(String name) {
125         super();
126         this.name = name;
127     }
128     @Override
129     public int compareTo(people o) {
130         
131         return (int)(o.money-this.money);
132     }
133     
134 }

 

微信红包的实现

标签:难点   and   get   size   ++   div   shuff   处理   double   

原文地址:http://www.cnblogs.com/llsq/p/7436508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!