您好,登錄后才能下訂單哦!
前言
紅包文化源遠流長。從古時的紅色紙包,到手機App中的手氣紅包,紅包作為一種獨特的中華文化傳承至今。之前的所有內容中,綜合Java這方面的知識,可以模擬發普通紅包。那么這篇博客,我將整合之前介紹的所有的技術和知識,編寫一個帶界面版的 發紅包 案例。
需求分析
分析并使用已給出的類,編寫程序,設置紅包類型。
小貼士 紅包類型:
1.普通紅包:金額均分。不能整除的,余額添加到最后一份紅包中。
2.手氣紅包:金額隨機。各個紅包金額累和與總金額相等。
紅包場景: 此案例是模擬群主給群成員發紅包,群主自己打開最后一個紅包的場景。
案例實現
環境搭建:
1.創建項目:名稱自定義,建議為 RedPacketDemo 。
2.導入圖片:將 pic 目錄,導入項目中,與 src 目錄平級。
3.導入已知類:在 src 下創建一個包,名字自定義,存放編輯的類。
1. RedPacketFrame :(界面)
一個抽象類,包含了一些屬性,是紅包案例的頁面。
public abstract class RedPacketFrame extends JFrame { /* ownerName : 群主名稱 */ public String ownerName = "誰誰誰誰"; /* openMode : 紅包的類型 [普通紅包/手氣紅包] */ public OpenMode openMode = null; /** * 構造方法:生成紅包界面. * @param title 頁面的標題. */ public RedPacketFrame(String title) { super(title); init();// 頁面相關的初始化操作 } /* set方法 */ public void setOwnerName(String ownerName) { this.ownerName = ownerName; } public void setOpenMode(OpenMode openMode) { this.openMode = openMode; } }
2. OpenMode :(類型)
一個接口,包含一個分配方法,用來指定紅包類型。
public interface OpenMode { /** * @param totalMoney 總金額,單位是"分"。總金額為方便計算,已經轉換為整數,單位為分。 * @param count 紅包個數 * @return ArrayList<Integer> 元素為各個紅包的金額值,所有元素的值累和等于總金額. * * 請將totalMoney,分成count分,保存到ArrayList<Integer>中,返回即可. */ public abstract ArrayList<Integer> divide(int totalMoney, int count); }
3. 定義 RedPacket:
RedPacket 類,繼承 RedPacketFrame :
public class RedPacket extends RedPacketFrame { public RedPacket(String title) { super(title); } }
4. 定義測試類,創建 RedPacket:
public class RedPacketTest { public static void main(String[] args) { RedPacket rp = new RedPacket("大紅包"); } }
運行代碼,打開一個發紅包的頁面。可以輸入總金額,紅包個數,留言信息。
點擊 塞錢進紅包 按鈕,跳轉到下一頁面。
5. RedPacket 對象
RedPacket對象,設置群主名稱。setOwnerName(String ownerName) ,是字符串作為參數。我們只需要傳遞一個字符串即可。
public class RedPacketTest { public static void main(String[] args) { // 創建紅包對象 RedPacket rp = new RedPacket("大紅包"); // 設置群主名稱 rp.setOwnerName("我是群大大"); } }
6. RedPacket 對象
設置紅包類型。setOpenMode(OpenMode openMode) ,是接口作為參數。我們必須定義接口的實現類,重寫接口中方法,并傳遞實現類對象到 setOpenMode 方法中,方可設置完成。再觀察接口:
public interface OpenMode { /** * @param totalMoney 總金額,單位是"分"。總金額為方便計算,已經轉換為整數,單位為分。 * @param count 紅包個數 * @return ArrayList<Integer> 元素為各個紅包的金額值,所有元素的值累和等于總金額. * * 請將totalMoney,分成count分,保存到ArrayList<Integer>中,返回即可. */ public abstract ArrayList<Integer> divide(int totalMoney, int count); }
普通紅包
打開方式 Common。
public class Common implements OpenMode { @Override public ArrayList<Integer> divide(int totalMoney, int count) { // 創建保存各個紅包金額的集合 ArrayList<Integer> list = new ArrayList<>(); // 計算平均金額 int avgMoney = totalMoney / count; // 設置前面count‐1個人都是平均的金額 for (int i = 0; i < count ‐ 1; i++) { list.add(avgMoney); // 從總金額中減去已分配的金額,就是最后一個人剩余的金額 totalMoney ‐= avgMoney; } // 將剩余的金額設置給最后一個人 list.add(totalMoney); return list; } }
發普通紅包
public class RedPacketTest { public static void main(String[] args) { // 創建紅包對象 RedPacket rp = new RedPacket("大紅包"); // 設置群主名稱 rp.setOwnerName("我是群大大"); // 設置紅包類型 rp.setOpenMode(new Common()); // 普通紅包 } }
拼手氣紅包
本質上,手氣紅包就是把總金額 totalMoney 隨機分成指定的 count 份,所以必須規定每一份金額的取值范圍。如果范圍太小,可能導致后分配紅包金額特別大。反之范圍太大,可能導致后分配紅包金額為0,不夠分。可見,取值范圍的定義規則,是手氣紅包的關鍵所在。
我們規定:每一份隨機金額范圍(除最后一份),最小值為1,最大值為當前剩余平均金額的2倍 ,單位為"分"。
計算公式:
當前剩余平均金額=剩余總金額/剩余紅包個數
舉例:總額為50元,發5個紅包。
小貼士:為方便表格中進行運算,此處,單位為"元"。程序中,建議換算為"分"進行運算。
Lucky:
手氣紅包,打開方式 Lucky ,代碼如下:
public class Lucky implements OpenMode { @Override public ArrayList<Integer> divide(int totalMoney, int count) { // 創建保存各個紅包金額的集合 ArrayList<Integer> list = new ArrayList<>(); // 定義循環次數,總個數‐1次 int time = count ‐ 1; // 創建隨機數對象 Random random = new Random(); // 循環分配 for (int i = 0; i < time; i++) { /* * 每次重新計算,生成隨機金額 * 隨機范圍: totalMoney / count * 2,totalMoney不斷的減少, * count也不斷的減少,所以這是一個可變化的范圍. */ int money = random.nextInt(totalMoney / count * 2) + 1; // 金額添加到集合 list.add(money); // 總金額扣除已分配金額 totalMoney ‐= money; // 紅包個數‐1 count‐‐; } // 剩余的金額,為最后一個紅包 list.add(totalMoney); return list; } }
發紅包
public class RedPacketTest { public static void main(String[] args) { // 創建紅包對象 RedPacket rp = new RedPacket("大紅包"); // 設置群主名稱 rp.setOwnerName("我是群大大"); // 設置紅包類型,二選一 // rp.setOpenMode(new Common()); // 普通紅包 rp.setOpenMode(new Lucky()); // 手氣紅包 } }
總結
通過 發紅包 案例,我將之前所學過的各種類和方法總結起來,如下:
1. 基礎語法。
2. 一些基本的類的方法。
3. 案例體現了面向對象之繼承。
4. 接口作為參數的使用。
5. 簡化接口的使用方式。
相信每位讀者,都會有自己的思考和答案。也相信各位讀者,隨著開發經驗的豐富,對于技術的理解會更加深入,對技術的運用會更加純熟。通過對大量案例的不斷積累,最終寫出屬于你自己的程序,成為一名真正的coder。感謝大家的閱讀,技術的道路上,這只是一個開始!謝謝大家!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。