日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模拟wechat红包 版本2.0

發布時間:2024/1/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模拟wechat红包 版本2.0 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

模擬微信群紅包

    • 1.User類
    • 2.Manager類
    • 3.Member類
    • 4.RedPacket類: 里面有一個打印紅包圖案的方法和一個隨機群員下標的方法
    • 5.AskDesign類 -->這個是鍵盤輸入紅包金額和紅包個數的
    • 6.CommonRedPacket類 -->這是實現普通紅包的類 普通紅包就是拆分的紅包金額是相等的
    • 7.LuckyRedPacket -->拼手氣紅包
    • 實現效果

這是一個小小的模擬微信群紅包實現的過程,由于能力有限,才學習java一個月,還有很多需要改進的地方,還望大家多多指出
寫作背景: 通過老師布置的一個普通紅包作業產生靈感,想要試試拼手氣紅包的實現,經歷了數百次測試后,2.0版本終于寫好了
其中1.0版本只是作為測試,功能不完善,我就不發出來了,現在來一起看看代碼的實現

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類: 里面有一個打印紅包圖案的方法和一個隨機群員下標的方法

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("|_________|");}// 根據條件隨機選出若干群員下標存入數組 thisCount是紅包個數 length是群成員總數public static int[] ifRepeat(int thisCount, int length) {// 紅包的有效個數int realCount;if (thisCount < length)realCount = thisCount;elserealCount = length;// 定義一個int數組用來存儲隨機生成的用戶下標int[] intRandom = new int[realCount];// 生成數據集,用來保存不重復的隨機生成數List<Integer> mylist = new ArrayList<Integer>();Random rd = new Random();// 調用size方法,用來控制隨機數不重復while (mylist.size() < intRandom.length) {int num = rd.nextInt(length);// 如果集合類沒有num,則將它存入if (!mylist.contains(num)) {mylist.add(num); // 往集合里面添加數據。}}// 將Integer轉換成intfor (int i = 0; i < mylist.size(); i++) {intRandom[i] = (Integer) (mylist.get(i));}return intRandom;} }

5.AskDesign類 -->這個是鍵盤輸入紅包金額和紅包個數的

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("親愛的群主大大,請輸入你要發送的紅包金額^-^");totalMoney = s.nextDouble();System.out.print("個數:");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("您當前賬戶余額為:" + ma.getBalance() + "元");System.out.println("是否繼續(繼續-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類 -->這是實現普通紅包的類 普通紅包就是拆分的紅包金額是相等的

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;// (拆分)紅包個數int thisCount = AskDesign.thisCount;// (剩余)紅包個數int leftCount = thisCount;// 發送的紅包金額double totalMoney = AskDesign.totalMoney;int length = m.length;//每個人分得的紅包金額double bodyMoney = ma.send(totalMoney,thisCount);// 打印紅包圖案redDesign();// 隨機出thisCount個用戶下標存儲index數組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() + "領取了紅包");leftCount--;}//精確到小數點后兩位double allRedMoney = bodyMoney*(index.length); //已領取的紅包金額BigDecimal b1 = new BigDecimal(allRedMoney);allRedMoney = b1.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();double sendBack = totalMoney - allRedMoney; //未領取的紅包金額BigDecimal b2 = new BigDecimal(sendBack);sendBack = b2.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();BigDecimal b3 = new BigDecimal(ma.getBalance()); //發紅包者的余額double maBalance = b3.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();//未領取的紅包退回給發送者if (thisCount > 10) {System.out.println("余額:" + maBalance + "元");// 把紅包內剩下的錢退回給發送者System.out.println("已領取" + allRedMoney + "元,有" + (leftCount) + "個紅包沒人領,退回" + sendBack + "元");} elseSystem.out.println("余額:" + maBalance + "元");ma.setBalance(ma.getBalance() + sendBack);System.out.println("是否繼續(繼續-y,不玩了-n)");char c = s.next().charAt(0);if (c == 'y' || c == 'Y')return true;elsereturn false;} }

下面這里就是讓我非常頭疼的類了,也就是所謂的拼手氣紅包,我在那個隨機公式那里耗了差不多兩天 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;// (剩余)紅包個數int thisCount = AskDesign.thisCount;int leftCount = thisCount;// 發送的紅包金額double totalMoney = AskDesign.totalMoney;int length = m.length;// 打印紅包圖案redDesign();// 隨機出thisCount個用戶下標存儲index數組int[] index = ifRepeat(thisCount, length);ma.send(totalMoney);// 單個紅包的最大金額上限double maxMoney;// 運氣王的紅包金額double maxRedBag = 0.01;// 單個紅包的金額double redMoney = 0.01;// 運氣王的下標int theKingOfLuck = index[0];// 真正能搶到紅包的用戶總數int realUser = index.length;// 已領取的紅包總金額double allRedMoney = 0;// 給隨機選出來的有效用戶各發一個紅包for (int i = 0; i < realUser; i++) {// 單個紅包最大金額的計算公式 : 2*紅包金額/剩余紅包個數maxMoney = totalMoney / leftCount * 2;// 單個紅包的計算公式: 0-1之間隨機取一個小數乘以紅包最大上限redMoney = rd.nextDouble() * maxMoney;BigDecimal b = new BigDecimal(redMoney);// 精確到小數點后兩位redMoney = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();redMoney = redMoney < 0.01?redMoney = 0.01:redMoney;//如果是最后一個搶到紅包的玩家,則判斷拆分的紅包個數是否大于群員總數if(i == realUser - 1) {// 如果拆分的紅包個數大于群員總數 ,則將這個隨機紅包分給該用戶并存入錢包if (thisCount > m.length) {m[index[realUser - 1]].income(redMoney);totalMoney -= redMoney;allRedMoney += redMoney;System.out.println(m[index[realUser - 1]].getName() + "搶到了" + redMoney + "元");// 如果拆分的紅包個數小于群員總數,則直接將紅包里剩余的錢存入該用戶錢包} 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--;// 比較最后一名群員和前面搶到紅包的群員所拆紅包的金額,得出運氣王if (maxRedBag < redMoney) {maxRedBag = redMoney;theKingOfLuck = index[i];}//如果不是最后一個群員,則直接將這個紅包存入該群員的錢包}else {m[index[i]].income(redMoney);totalMoney -= redMoney;allRedMoney += redMoney;leftCount--; // 每搶一個紅包,leftCount-- 得出剩余的紅包個數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();// 把紅包內剩下的錢退回給發送者ma.setBalance(ma.getBalance() + sendBack);System.out.println("已領取" + allRedMoney + "元,有" + (leftCount) + "個紅包沒人領,退回" + sendBack + "元");} elseSystem.out.println("余額:" + maBalance + "元");System.out.println(m[theKingOfLuck].getName() + "是運氣王!");System.out.println("是否繼續(繼續-y,不玩了-n)");char c = s.next().charAt(0);if (c == 'y' || c == 'Y')return true;elsereturn false;} }

好了,實現類都寫好了,現在讓我們來寫個測試類測試一下

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("婁文衛", 87.2), new Member("趙旭", 78.3),new Member("趙志強", 88.8), new Member("劉昌鑫", 79.2), new Member("高自豪", 68.5), new Member("侯森", 72.3),new Member("楊立業", 55.9), new Member("丁海濤", 68.4), new Member("陳世啟", 74.3) };boolean bn;do {System.out.println("請選擇你要發送的紅包類型");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("輸入有誤!請輸入正確指令!");bn = true;}} while (bn);s.close();} }

實現效果



總結: 在這一個月的學習里,有過曾因為一個項目或者一個題寫了好幾個通宵的體驗,過程雖然很不容易(主要是心疼我的頭發),但是既然選擇了java這門語言 那就必須堅持下來 總有那么一個節點,你會得到你想要的
借用愛5里的一句臺詞 ,人生就是一個起起落落落落落落落落落落然后又起的過程

總結

以上是生活随笔為你收集整理的模拟wechat红包 版本2.0的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。