模拟wechat红包 版本2.0
模擬微信群紅包
- 1.User類
- 2.Manager類
- 3.Member類
- 4.RedPacket類: 里面有一個(gè)打印紅包圖案的方法和一個(gè)隨機(jī)群?jiǎn)T下標(biāo)的方法
- 5.AskDesign類 -->這個(gè)是鍵盤輸入紅包金額和紅包個(gè)數(shù)的
- 6.CommonRedPacket類 -->這是實(shí)現(xiàn)普通紅包的類 普通紅包就是拆分的紅包金額是相等的
- 7.LuckyRedPacket -->拼手氣紅包
- 實(shí)現(xiàn)效果
這是一個(gè)小小的模擬微信群紅包實(shí)現(xiàn)的過(guò)程,由于能力有限,才學(xué)習(xí)java一個(gè)月,還有很多需要改進(jìn)的地方,還望大家多多指出
寫作背景: 通過(guò)老師布置的一個(gè)普通紅包作業(yè)產(chǎn)生靈感,想要試試拼手氣紅包的實(shí)現(xiàn),經(jīng)歷了數(shù)百次測(cè)試后,2.0版本終于寫好了
其中1.0版本只是作為測(cè)試,功能不完善,我就不發(fā)出來(lái)了,現(xiàn)在來(lái)一起看看代碼的實(shí)現(xiàn)
1.User類
```go package cn.com.wechat_red_packet;public class User {private String name;private double balance;public User() {super();// TODO Auto-generated constructor stub}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getBalance() {return balance;}public void setBalance(double balance) {this.balance = balance;}public User(String name, double balance) {super();this.name = name;this.balance = balance;}public void show() {System.out.println("姓名:" + getName() + "余額:" + getBalance());} }2.Manager類
package cn.com.wechat_red_packet;public class Manager extends User {public Manager() {super();// TODO Auto-generated constructor stub}public Manager(String name, double balance) {super(name, balance);// TODO Auto-generated constructor stub}public void send(double totalMoney) {setBalance(getBalance() - totalMoney);}public double send(double totalMoney, int count) {setBalance(getBalance() - totalMoney);return totalMoney/count;} }3.Member類
package cn.com.wechat_red_packet;public class Member extends User {public static int count;public Member() {super();count++;// TODO Auto-generated constructor stub}public Member(String name, double balance) {super(name, balance);count++;// TODO Auto-generated constructor stub}public void income(double money) {setBalance(getBalance() + money);} }4.RedPacket類: 里面有一個(gè)打印紅包圖案的方法和一個(gè)隨機(jī)群?jiǎn)T下標(biāo)的方法
package cn.com.wechat_red_packet;import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Scanner;public class RedPacket {protected static Scanner s = new Scanner(System.in);protected static Random rd = new Random();// 紅包圖案public static void redDesign() {System.out.println(" _________");System.out.println("|\\ /|");System.out.println("| \\ / |");System.out.println("| \\ / |");System.out.println("| ($) |");System.out.println("| |");System.out.println("| |");System.out.println("|_________|");}// 根據(jù)條件隨機(jī)選出若干群?jiǎn)T下標(biāo)存入數(shù)組 thisCount是紅包個(gè)數(shù) length是群成員總數(shù)public static int[] ifRepeat(int thisCount, int length) {// 紅包的有效個(gè)數(shù)int realCount;if (thisCount < length)realCount = thisCount;elserealCount = length;// 定義一個(gè)int數(shù)組用來(lái)存儲(chǔ)隨機(jī)生成的用戶下標(biāo)int[] intRandom = new int[realCount];// 生成數(shù)據(jù)集,用來(lái)保存不重復(fù)的隨機(jī)生成數(shù)List<Integer> mylist = new ArrayList<Integer>();Random rd = new Random();// 調(diào)用size方法,用來(lái)控制隨機(jī)數(shù)不重復(fù)while (mylist.size() < intRandom.length) {int num = rd.nextInt(length);// 如果集合類沒(méi)有num,則將它存入if (!mylist.contains(num)) {mylist.add(num); // 往集合里面添加數(shù)據(jù)。}}// 將Integer轉(zhuǎn)換成intfor (int i = 0; i < mylist.size(); i++) {intRandom[i] = (Integer) (mylist.get(i));}return intRandom;} }5.AskDesign類 -->這個(gè)是鍵盤輸入紅包金額和紅包個(gè)數(shù)的
package cn.com.wechat_red_packet;import java.util.Scanner;//提示用戶鍵盤輸入 final class AskDesign{public static double totalMoney;public static int thisCount;public static boolean menu(Manager ma,Member []m) {Scanner s = new Scanner(System.in);boolean bn;char c,ch;do {bn = false;System.out.println("親愛(ài)的群主大大,請(qǐng)輸入你要發(fā)送的紅包金額^-^");totalMoney = s.nextDouble();System.out.print("個(gè)數(shù):");thisCount = s.nextInt();System.out.println();if (totalMoney > ma.getBalance()) {System.out.println("余額不足!");System.out.println("查詢余額-y 不玩了-n");c = s.next().charAt(0);if (c == 'y' || c == 'Y') {System.out.println("您當(dāng)前賬戶余額為:" + ma.getBalance() + "元");System.out.println("是否繼續(xù)(繼續(xù)-y 不玩了-n)");ch = s.next().charAt(0);s.close();if (ch == 'y' || ch == 'Y')bn = true;elsereturn false;} elsereturn false;}} while (bn);return true;} }6.CommonRedPacket類 -->這是實(shí)現(xiàn)普通紅包的類 普通紅包就是拆分的紅包金額是相等的
package cn.com.wechat_red_packet;import java.math.BigDecimal;//普通紅包 public final class CommonRedPacket extends RedPacket {public static boolean send(Manager ma, Member[] m) {boolean bn = AskDesign.menu(ma,m);if(bn == false) return false;// (拆分)紅包個(gè)數(shù)int thisCount = AskDesign.thisCount;// (剩余)紅包個(gè)數(shù)int leftCount = thisCount;// 發(fā)送的紅包金額double totalMoney = AskDesign.totalMoney;int length = m.length;//每個(gè)人分得的紅包金額double bodyMoney = ma.send(totalMoney,thisCount);// 打印紅包圖案redDesign();// 隨機(jī)出thisCount個(gè)用戶下標(biāo)存儲(chǔ)index數(shù)組int[] index = ifRepeat(thisCount, length);for(int i = 0;i < index.length;i++) {m[index[i]].income(bodyMoney);System.out.println(m[index[i]].getName() + "領(lǐng)取了紅包");leftCount--;}//精確到小數(shù)點(diǎn)后兩位double allRedMoney = bodyMoney*(index.length); //已領(lǐng)取的紅包金額BigDecimal b1 = new BigDecimal(allRedMoney);allRedMoney = b1.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();double sendBack = totalMoney - allRedMoney; //未領(lǐng)取的紅包金額BigDecimal b2 = new BigDecimal(sendBack);sendBack = b2.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();BigDecimal b3 = new BigDecimal(ma.getBalance()); //發(fā)紅包者的余額double maBalance = b3.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();//未領(lǐng)取的紅包退回給發(fā)送者if (thisCount > 10) {System.out.println("余額:" + maBalance + "元");// 把紅包內(nèi)剩下的錢退回給發(fā)送者System.out.println("已領(lǐng)取" + allRedMoney + "元,有" + (leftCount) + "個(gè)紅包沒(méi)人領(lǐng),退回" + sendBack + "元");} elseSystem.out.println("余額:" + maBalance + "元");ma.setBalance(ma.getBalance() + sendBack);System.out.println("是否繼續(xù)(繼續(xù)-y,不玩了-n)");char c = s.next().charAt(0);if (c == 'y' || c == 'Y')return true;elsereturn false;} }下面這里就是讓我非常頭疼的類了,也就是所謂的拼手氣紅包,我在那個(gè)隨機(jī)公式那里耗了差不多兩天 QAQ
7.LuckyRedPacket -->拼手氣紅包
package cn.com.wechat_red_packet;import java.math.BigDecimal;//拼手氣紅包 public final class LuckyRedPacket extends RedPacket {public static boolean send(Manager ma, Member[] m) {boolean bn = AskDesign.menu(ma,m);if(bn == false) return false;// (剩余)紅包個(gè)數(shù)int thisCount = AskDesign.thisCount;int leftCount = thisCount;// 發(fā)送的紅包金額double totalMoney = AskDesign.totalMoney;int length = m.length;// 打印紅包圖案redDesign();// 隨機(jī)出thisCount個(gè)用戶下標(biāo)存儲(chǔ)index數(shù)組int[] index = ifRepeat(thisCount, length);ma.send(totalMoney);// 單個(gè)紅包的最大金額上限double maxMoney;// 運(yùn)氣王的紅包金額double maxRedBag = 0.01;// 單個(gè)紅包的金額double redMoney = 0.01;// 運(yùn)氣王的下標(biāo)int theKingOfLuck = index[0];// 真正能搶到紅包的用戶總數(shù)int realUser = index.length;// 已領(lǐng)取的紅包總金額double allRedMoney = 0;// 給隨機(jī)選出來(lái)的有效用戶各發(fā)一個(gè)紅包for (int i = 0; i < realUser; i++) {// 單個(gè)紅包最大金額的計(jì)算公式 : 2*紅包金額/剩余紅包個(gè)數(shù)maxMoney = totalMoney / leftCount * 2;// 單個(gè)紅包的計(jì)算公式: 0-1之間隨機(jī)取一個(gè)小數(shù)乘以紅包最大上限redMoney = rd.nextDouble() * maxMoney;BigDecimal b = new BigDecimal(redMoney);// 精確到小數(shù)點(diǎn)后兩位redMoney = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();redMoney = redMoney < 0.01?redMoney = 0.01:redMoney;//如果是最后一個(gè)搶到紅包的玩家,則判斷拆分的紅包個(gè)數(shù)是否大于群?jiǎn)T總數(shù)if(i == realUser - 1) {// 如果拆分的紅包個(gè)數(shù)大于群?jiǎn)T總數(shù) ,則將這個(gè)隨機(jī)紅包分給該用戶并存入錢包if (thisCount > m.length) {m[index[realUser - 1]].income(redMoney);totalMoney -= redMoney;allRedMoney += redMoney;System.out.println(m[index[realUser - 1]].getName() + "搶到了" + redMoney + "元");// 如果拆分的紅包個(gè)數(shù)小于群?jiǎn)T總數(shù),則直接將紅包里剩余的錢存入該用戶錢包} else {m[index[realUser - 1]].income(totalMoney);BigDecimal bd = new BigDecimal(totalMoney);totalMoney = bd.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();System.out.println(m[index[realUser - 1]].getName() + "搶到了" + totalMoney + "元");}leftCount--;// 比較最后一名群?jiǎn)T和前面搶到紅包的群?jiǎn)T所拆紅包的金額,得出運(yùn)氣王if (maxRedBag < redMoney) {maxRedBag = redMoney;theKingOfLuck = index[i];}//如果不是最后一個(gè)群?jiǎn)T,則直接將這個(gè)紅包存入該群?jiǎn)T的錢包}else {m[index[i]].income(redMoney);totalMoney -= redMoney;allRedMoney += redMoney;leftCount--; // 每搶一個(gè)紅包,leftCount-- 得出剩余的紅包個(gè)數(shù)System.out.println(m[index[i]].getName() + "搶到了" + redMoney + "元");// 比較拆得紅包的金額大小if (maxRedBag < redMoney) {maxRedBag = redMoney;theKingOfLuck = index[i];}// System.out.println("余額:" + df.format(m[index[i]].getBalance()) + "元");}} double sendBack = 0;BigDecimal b = new BigDecimal(ma.getBalance());double maBalance = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();if (thisCount > 10) {System.out.println("余額:" + maBalance + "元");BigDecimal bd = new BigDecimal(totalMoney);sendBack = bd.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();BigDecimal bi = new BigDecimal(allRedMoney);allRedMoney = bi.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();// 把紅包內(nèi)剩下的錢退回給發(fā)送者ma.setBalance(ma.getBalance() + sendBack);System.out.println("已領(lǐng)取" + allRedMoney + "元,有" + (leftCount) + "個(gè)紅包沒(méi)人領(lǐng),退回" + sendBack + "元");} elseSystem.out.println("余額:" + maBalance + "元");System.out.println(m[theKingOfLuck].getName() + "是運(yùn)氣王!");System.out.println("是否繼續(xù)(繼續(xù)-y,不玩了-n)");char c = s.next().charAt(0);if (c == 'y' || c == 'Y')return true;elsereturn false;} }好了,實(shí)現(xiàn)類都寫好了,現(xiàn)在讓我們來(lái)寫個(gè)測(cè)試類測(cè)試一下
package cn.com.wechat_red_packet;import java.util.*;public class WechatRedPacket2 {public static void main(String[] args) {// TODO Auto-generated method stubScanner s = new Scanner(System.in);Manager ma = new Manager("朱興旺", 1000);Member[] m = { new Member("陰子航", 66.6), new Member("婁文衛(wèi)", 87.2), new Member("趙旭", 78.3),new Member("趙志強(qiáng)", 88.8), new Member("劉昌鑫", 79.2), new Member("高自豪", 68.5), new Member("侯森", 72.3),new Member("楊立業(yè)", 55.9), new Member("丁海濤", 68.4), new Member("陳世啟", 74.3) };boolean bn;do {System.out.println("請(qǐng)選擇你要發(fā)送的紅包類型");System.out.println("1-普通紅包 2-拼手氣紅包");int a = s.nextInt();if(a == 1)bn = CommonRedPacket.send(ma, m);else if(a == 2)bn = LuckyRedPacket.send(ma,m);else {System.out.println("輸入有誤!請(qǐng)輸入正確指令!");bn = true;}} while (bn);s.close();} }實(shí)現(xiàn)效果
總結(jié): 在這一個(gè)月的學(xué)習(xí)里,有過(guò)曾因?yàn)橐粋€(gè)項(xiàng)目或者一個(gè)題寫了好幾個(gè)通宵的體驗(yàn),過(guò)程雖然很不容易(主要是心疼我的頭發(fā)),但是既然選擇了java這門語(yǔ)言 那就必須堅(jiān)持下來(lái) 總有那么一個(gè)節(jié)點(diǎn),你會(huì)得到你想要的
借用愛(ài)5里的一句臺(tái)詞 ,人生就是一個(gè)起起落落落落落落落落落落然后又起的過(guò)程
總結(jié)
以上是生活随笔為你收集整理的模拟wechat红包 版本2.0的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: uni-app如何设置整个项目的统一背景
- 下一篇: 微信小程序:用户头像的更改与保存