Java基础 第二节 第二十一课

举报
我是小白呀iamarookie 发表于 2021/09/11 00:36:58 2021/09/11
【摘要】 综合案例 概述案例需求案例分析OpenModeRedPacketFrame 案例实现环境搭建基础代码实现定义 RedPacket 类定义测试类设置群主名称普通红包类测试普通红包 手气红包...

概述

红包文化源远流长. 从古时候的红色纸包, 到手机 App 中的手气红包, 红包作为一种独特的中华文化传承至今. 之前的课程中, 我们也编写过模拟法普通红包的程序. 那么今天, 我们将整合基学到的技术和知识, 编写一个带界面版的发红包案例.

目的, 我们上未学习过任何与界面相关的类. 所以, 界面相关代码, 已经给出. 请运用所学技术分析并使用.

案例需求

红包类型:

  1. 普通红包: 金额均分. 不能整除的, 余额添加到最后一份红包中
  2. 手气红包: 金额随机. 各个红包金额累计与总金额相等

红包场景:

  • 此案例是模拟群主给群成员法红包, 群主字节打开最后一个红包

案例分析

OpenMode

OpenMode: 一个接口, 包含一个分配方法, 用来指定红包类型.

import java.util.ArrayList;

public interface OpenMode {
    /**
     * allocate 方法用于分配红包
     * @param toalAmount 红包总金额, 单位为 "分".
     * @param count 红包个数
     * @return 返回红包数组
     */
    public abstract ArrayList<Integer> allocate(int toalAmount, int count);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

RedPacketFrame

RedPacketFrame: 一个抽象类, 包含了一些属性, 是红包案例的界面.

import javax.swing.*;

public class RedPacketFrame extends JFrame {
    // admin: 群主名称
    public String admin = "马保国";
    // openMode: 红包的类型 (普通红包 / 手气红包)
    public OpenMode openMode = null;

    /**
     * 构造方法: 生成红包界面
     * @param title 界面的标题
     */
    public RedPacketFrame(String title){
        super(title);
        frameInit();  // 界面相关的初始化操作
    }

    // set方法
    public void setAdmin(String admin) {
        this.admin = admin;
    }

    public void setOpenMode(OpenMode openMode) {
        this.openMode = openMode;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

案例实现

环境搭建

  1. 创建项目: 名称自定义
  2. 导入图片: 将 pic 目录, 导入项目中, 与 src 目录平级
  3. 导入已知类: 在 scr 下创建一个包, 名称自定义

基础代码实现

定义 RedPacket 类

定义 RedPacket 类, 继承 RedPacketFrame. 代码如下:

package known;

public class RedPacket extends RedPacketFrame {

    /**
     * 构造方法: 生成红包界面
     * @param title 界面的标题
     */
    public RedPacket(String title) {
        super(title);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

定义测试类

定义测试类, 创建 RedPacket 对象. 代码如下:

package known;

public class Test {
    public static void main(String[] args) {
        RedPacket redPacket = new RedPacket("大红包");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

设置群主名称

package known;

public class Test {
    public static void main(String[] args) {
        // 创建红包对象
        RedPacket redPacket = new RedPacket("大红包");
        // 设置群主名称
        redPacket.setAdmin("我是马保国");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

普通红包类

普通红包, 代开方式 Common. 代码如下:

package known;

import known.OpenMode;
import java.util.ArrayList;

public class Common implements OpenMode {
    @Override
    public ArrayList<Integer> allocate(int totalAmount, int count) {
        // 创建保存各个红包金额的集合
        ArrayList<Integer> list = new ArrayList<>();
        // 定义循环次数, 总个数‐1次
        int time = count - 1;
        // 一次计算, 生成平均金额
        int money = totalAmount / count;
        // 循环分配
        for (int i = 0; i < time; i++) {
            // 添加到集合中
            list.add(money);
            // 总金额扣除已分配金额
            totalAmount -= money;
        }
        // 剩余的金额, 为最后一个红包
        list.add(totalAmount);
        System.out.println("普通红包金额:" + list);
        // 返回集合
        return list;
        }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

测试普通红包

package known;

public class Test2 {
    public static void main(String[] args) {
        // 创建红包对象
        RedPacket rp = new RedPacket("大红包");
        // 设置群主名称
        rp.setAdmin("我是马保国");
        // 设置红包类型
        rp.setOpenMode(new Common());  // 普通红包
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

手气红包

本质上, 手气红包就是把总金额 totalAmount 随机分成指定的 count 份. 所以必须规定每一份金额的取值范围. 如果过范围太小, 可能导致后分配红包金额特别大. 反之范围太大, 可能导致分配够红包金额为 0, 不够分. 可见, 取值范围的定义规则, 是手气红包的关键所在.

我们规定: 每一份随机金额范围 (除最后一份), 最小值为 1, 最大值为当前剩余平均金额的两倍, 单位为 “分”.

计算公式

当前剩余平均金额 = 剩余总金额 / 剩余红包个数

  
 
  • 1

在这里插入图片描述

手气红包类

手气红包类, 打开方式 Lucky. 代码如下:

package known;

import java.util.ArrayList;
import java.util.Random;

public class Lucky implements OpenMode {
    @Override
    public ArrayList<Integer> allocate(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;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

测试手气红包

package known;

public class Test3 {
    public static void main(String[] args) {
        // 创建红包对象
        RedPacket rp = new RedPacket("大红包");
        // 设置群主名称
        rp.setAdmin("我是马保国");
        // 设置红包类型, 二选一
        // rp.setOpenMode(new Common());  // 普通红包
        rp.setOpenMode(new Lucky());  // 手气红包
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

文章来源: iamarookie.blog.csdn.net,作者:我是小白呀,版权归原作者所有,如需转载,请联系作者。

原文链接:iamarookie.blog.csdn.net/article/details/110212311

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。