发红包案例
红包发出去之后,所有人都有红包,抢完之后,最后一个红包给群主自己。
大多数代码都是现成的,我们需要做的就是填空题。
我们自己要做的事情有:
1.设置一下程序的标题,通过构造方法的字符串参数
2.设置群主名称
3.设置分发策略:平均,还是随机
红包分发策略:
1.普通红包(平均):余额放在最后一个红包当中。
2.手气红包(随机):最少1分钱,最多不超过平均数的2倍。应该越发越少
导入pic和red
public class Bootstrap { public static void main(String[] args) { MyRed hb = new MyRed("红包标题"); } }
public interface OpenMode { /** * 将totalMoney分成totalCount份,保存到ArrayList<Integer>中,并将ArrayList<Integer>返回 * @param totalMoney 总金额为方便计算,单位为分 * @param totalCount 红包个数 * @return ArrayList<Integer> 元素为各个红包的金额,所有元素的值的总和就是总金额 */ ArrayList<Integer> divide(int totalMoney, int totalCount); }
public class MyRed extends RedpackerFarme{ public MyRed(String title){ super(title); } }
运行出就有弹窗
普通红包:
public class Bootstrap { public static void main(String[] args) { MyRed red = new MyRed("枪红包啦"); //设置群主名称 red.setOwnerName("张三"); //普通红包10 OpenMode norm = new NormalMode(); red.setOpenWay(norm); } }
实现接口进行计算
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;//余数,模,零头 for (int i = 0; i <totalCount -1; i++) { list.add(avg); } //有零头,放在最后一个红包中 list.add(avg + mod); return list; } }
手气红包
随机分配,有可能多,也有可能少。
最少1分钱,最多不超过“剩下金额平均数的2倍”
第一次范围是0.01~6.66元,发完之后至少剩下3.34元。
还需再发2个红包,此时在发范围应该是0.01~3.34取不到右边,剩下0.01
public class Bootstrap { public static void main(String[] args) { MyRed red = new MyRed("枪红包啦"); //设置群主名称 red.setOwnerName("张三"); //普通红包10 // OpenMode norm = new NormalMode(); // red.setOpenWay(norm); RandomMode randomMode = new RandomMode(); red.setOpenWay(randomMode); } }
编写一个随机发生红包实现类
public class RandomMode implements OpenMode { @Override public ArrayList<Integer> divide(final int totalMoney,final int totalCount) { ArrayList<Integer> list = new ArrayList<>(); //创建一个随机数生成器 Random r = new Random(); //额外定义两个变量,分别代表剩下多少钱,剩下多少份 int leftMoney = totalMoney; int leftCount = totalCount; //随机发钱n-1个,最后一个不需要随机 for (int i = 0; i <totalCount-1; i++) { //随机生成金额 int money = r.nextInt(leftMoney/leftCount*2)+1; //将一个随机红包放入集合 list.add(money); //剩下的金额越发越少 leftMoney -= money; //剩下还应该在发的红包个数,递减 leftCount--; } //最后一个红包不需要随机,直接放入 list.add(leftMoney); return list; } }