发红包案例

红包发出去之后,所有人都有红包,抢完之后,最后一个红包给群主自己。

大多数代码都是现成的,我们需要做的就是填空题。

我们自己要做的事情有:

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

 

 

 

posted @ 2022-07-04 10:36  魔光领域  阅读(47)  评论(0编辑  收藏  举报