群主给普通成员发红包:
- 首先分析对象的个数:两个对象,群主和普通成员。
- 寻找相同特性,观察是否有相同特性可以提升为父类:对于两个对象来说,都有相同的特性——用户名和余额。因此可以建立一个用户类作为父类,其中有两个对象共有的属性:用户名和余额。
- 找寻不同的特性:对于群主来说,存在一个发红包的方法;而对于普通成员来说,有一个收红包的方法。两者都属于对象中特有的方法
- 分析方法中的参数:
- 对于发红包的群主来说,对特有的发红包方法取名send;他的发的红包有两个属性——一共有多少钱(totalMoney)和分为多少分(count),最终返回的是一个数组类型的结果,即每个人可以抢到多少钱的一个列表
所以定义特殊方法的格式为:public ArrayList<integer> send (int totalMoney , int count) {}
- 对于接受红包的普通成员来说,只需要接收到一个红包的结果就行,所以创建一个接收红包方法receive,从发红包方法返回的数组里随机选取一个即可
所以定义特殊方法的格式为:public void receive (Arraylist<integer> list) {}
发红包实例完整代码:
//两个对象的共同特性,用户类
package RedPacket;
public class User {
private String name; //姓名
private int money; //余额,当前用户拥有的钱数
public User() {
}
public User(String name, int money) {
this.name = name;
this.money = money;
}
//展示成员有多少钱
public void show(){
System.out.println("我叫"+name+",我有"+money+"块钱");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
//群主类
package RedPacket;
import java.util.ArrayList;
import java.util.ArrayList;
//群主类
public class Manager extends User {
public Manager(){
}
public Manager(String name, int money) {
super(name, money);
}
public void show(){
if (super.getMoney() < 100){
System.out.println("我叫"+super.getName()+",我破产了,我还有"+super.getMoney()+"块钱");
}else{
System.out.println("我叫"+super.getName()+",我还贼有钱,有"+super.getMoney()+"块钱");
}
}
public ArrayList<Integer> sned(int totalMoney,int count){
//先创建一个集合,用来存放若干个红包的金额
ArrayList<Integer> redlist = new ArrayList<Integer>();
//群主当前余额leftMoney
int leftMoney = super.getMoney();
//判断群主想要发的钱,是否比自己剩下的钱还要多,如果群主想要发的钱比自己剩余的金额还要多,那么会显示余额不足,并返回一个空的集合
if (totalMoney >leftMoney){
System.out.println("余额不足");
return redlist;
}
//群主先扣钱,也就是重新设置自己的余额
super.setMoney(leftMoney-totalMoney);
//群主发红包需要设置每个红包的金额,也就是需要利用count去平均一下每个小红包的钱
//但是对于需要发的钱很可能会出现一个余数,即有三个人,发20块钱的红包,必定会有2块钱的零头,所以需要将零头放到最后一个领取的红包里
int avg = totalMoney / count;
int mod = totalMoney % count; //mod为零头
//塞红包,将钱一个个的塞到红包当中
if (mod == 0){
for (int i = 0; i < count; i++) {
redlist.add(avg);//如果没有零头,那么很好,每个人可得平均的钱,将平均的钱放到redlist中
}
}else{
for (int i = 0; i < count-1; i++) {
redlist.add(avg);//如果有零头,那么先把前几个放入平均的钱
}
int last = avg + mod;
redlist.add(last); //最后一个红包,加入零头,然后放入
}
return redlist;
}
}
//普通成员类
package RedPacket;
import java.util.ArrayList;
import java.util.Random;
//普通成员类
public class Number extends User{
public Number(){
}
public Number(String name, int money) {
super(name, money);
}
public void receive(ArrayList<Integer> list){
//从多个红包当中,随便抽取一个
//随机获取集合当中的一个索引
if (list.size() != 0){
int index = new Random().nextInt(list.size());
//根据索引值,从集合当中删除,并且的到被删除的红包
int delta = list.remove(index);
int money = super.getMoney();
super.setMoney(money + delta);
System.out.println("我是"+super.getName()+",我抢到了"+delta+"钱的红包,"+"我还有"+super.getMoney()+"块钱");
}else{
System.out.println("我叫"+super.getName()+"我没有抢到红包,贼惨!");
}
}
}
//main函数
package RedPacket;
import java.util.ArrayList;
public class MainRedPacket {
public static void main(String[] args) {
System.out.println("发红包前:");
Manager manager = new Manager("群主大大",1000);
manager.show();
Number number1 = new Number("Tom",30);
number1.show();
Number number2 = new Number("Jerry",80);
number2.show();
Number number3 = new Number("Rain",10);
number3.show();
System.out.println("=============================================");
System.out.println("发红包后");
ArrayList<Integer> list = manager.sned(500,3);
number1.receive(list);
number2.receive(list);
number3.receive(list);
manager.show();
}
}