案例需求:
分析並使用已給出的類,編寫程序,設置紅包類型;
貼士:
紅包類型:
普通紅包:金額均分。不能整除的,餘額將添加到最後一份紅包中
手氣紅包:金額隨機。各個紅包金額累和與總金額相等
紅包場景:
此案例是模擬羣主給成員發紅包,羣主自己打開最後一個紅包的場景。
分發紅包的策略:
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()); // 手氣紅包
}
}
當前剩餘平均金額=剩餘總金額/剩餘紅包個數