紅包案例——圖形用戶界面版

案例需求:

分析並使用已給出的類,編寫程序,設置紅包類型;

貼士:

紅包類型:

普通紅包:金額均分。不能整除的,餘額將添加到最後一份紅包中

手氣紅包:金額隨機。各個紅包金額累和與總金額相等

紅包場景:

此案例是模擬羣主給成員發紅包,羣主自己打開最後一個紅包的場景。

分發紅包的策略:

1.普通紅包(平均):totalMoney / totalCount,餘數放在最後一個紅包當中。

2.手氣紅包(隨機):最少1分錢,最多不超過平均數的2倍。應該越發越少。

 

在red包下有:

//OpenMode接口
        import java.util.ArrayList;


public interface OpenMode {
    /**
     * @param totalMoney 總金額,單位“分”,總金額爲方便計算,已經轉換成整數,單位爲分
     * @param count      紅包個數
     * @return ArrayList<Integer>  元素爲各個紅包的金額值,所有元素的值累和等於總金額
     *
     * 請將totalMoney,分成count分,保存到ArrayList<Integer>中,返回即可。
     */
    public abstract ArrayList<Integer> divide(int totalMoney,int count );
}

//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;
    }
}

可能RedPacketFrame這個類內容不全,圖形用戶界面暫時不管,以後學習了會添上。

另建一個包:

 

import cn.itcast.day09.java.red.RedPacketFrame;

public  class Myred extends RedPacketFrame {

    /**
     * 構造方法:生成紅包界面
     *
     * @param title 頁面的標題
     */
    public Myred(String title) {
        super(title);
    }
}

 

//平局分配紅包
import cn.itcast.day09.java.red.OpenMode;

import java.util.ArrayList;

public class NormalMode implements OpenMode {
    @Override
    public ArrayList<Integer> divide(final int totalMoney, final int totalCount) {
        ArrayList<Integer> list = new ArrayList<>();

        int avg = totalMoney / totalCount; //平均值
        int mod = totalMoney % totalCount; //餘數,模,零頭


        //注意totalCount - 1代表,最後一個先留着
        for (int i = 0; i < totalCount - 1; i++) {
            list.add(avg);
        }
        //有零頭,需要放在最後一個紅包裏
        list.add(avg + mod);
        return list;
    }
}

 

import cn.itcast.day09.java.red.OpenMode;


public class BootStrap {
    public static void main(String[] args) {
        Myred red = new Myred("大紅包");

        red.setOwnerName("誰誰誰");
        //普通紅包
        OpenMode normal = new NormalMode();
        //  red.setOpenWay(normal);

    }
}

 

 

 

隨機手氣紅包:

public class RandomMode 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 BootStrap   {
    public static void main(String[] args) {
       // 創建紅包對象  
        Myred red = new Myred("大紅包");
       // 設置羣主名稱  
        red.setOwnerName("年很快");
       // 設置紅包類型,二選一  
        // rp.setOpenMode(new Common()); // 普通紅包
        rp.setOpenMode(new RandomMode()); // 手氣紅包
    }
}

當前剩餘平均金額=剩餘總金額/剩餘紅包個數

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章