Java基础 第二节 第二十一课
概述
红包文化源远流长. 从古时候的红色纸包, 到手机 App 中的手气红包, 红包作为一种独特的中华文化传承至今. 之前的课程中, 我们也编写过模拟法普通红包的程序. 那么今天, 我们将整合基学到的技术和知识, 编写一个带界面版的发红包案例.
目的, 我们上未学习过任何与界面相关的类. 所以, 界面相关代码, 已经给出. 请运用所学技术分析并使用.
案例需求
红包类型:
- 普通红包: 金额均分. 不能整除的, 余额添加到最后一份红包中
- 手气红包: 金额随机. 各个红包金额累计与总金额相等
红包场景:
- 此案例是模拟群主给群成员法红包, 群主字节打开最后一个红包
案例分析
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
案例实现
环境搭建
- 创建项目: 名称自定义
- 导入图片: 将 pic 目录, 导入项目中, 与 src 目录平级
- 导入已知类: 在 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
- 点赞
- 收藏
- 关注作者
评论(0)