1. 程式人生 > >微信紅包的實現

微信紅包的實現

運用 pub str ann instance print ++ 輸出 set

封裝一個微信用包類,主要的功能有|:

紅包中存有錢,多少個人分;每個分到的錢數,及獲收紅包的時間;

主要的功能有

打開紅包;(如果打開紅包的人數沒有達到上限,則可以打開,並隨機獲得金額)

查看紅包分配信息;

設置截止日期;(如果超過最大金額,則再打時提示過期)

思路:微信紅包類應該具有的屬性有紅包金額,紅包數,過期時間,領紅包的人,時間等。

難點在於:將紅包如何分成幾份,等可能的被其他人搶到,而且不會出現為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 }

微信紅包的實現