本帖最后由 zm292326 于 2018-7-19 22:49 编辑
抢红包是基础班视频里面的一个视频习题。
在课后尝试着写了一下,由于快要点招考试了,又不知道要写什么发帖,果断就把它发出来与大家分享讨论一下
首先简单说一下我的思路:
1、由于是随机抢红包,那就需要抢红包的人和发红包的人,就需要定义两个类,由于是自己练习果断就又给自己再了加点戏,把这两个类抽取了一个父类。
2、抢红包和发红包的都是人,都有自己的姓名和自己的余额,所以一个简单的父类就定了下来,在学习中大家应该知道父类其实就是一个标准的普通类。
3、然后发红包的人是一个类,这个类继承了父类之后还要加上一个自己的方法(发红包的方法)。
4、收红包的人是一个类,这个类继承了父类之后还要加上一个自己的方法(收红包的方法)。
5、最后还有一个测试类,用来测试各个类的编写是否正确。
首先定义一个父类(Person):
public class Person {//定义两个成员变量分别为人的名字和余额
private String name;
private double money;
public Person() {
}//这里为了测试的方便定义一个show方法显示各个对象的余额和姓名
public void show(){
System.out.println(name+"余额为"+money);
}
public Person(String name, double money) {
this.name = name;
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
然后定义一个发红包的人的类,因为发红包的都是领导就叫他Messager类。
public class Messager extends Person {
//群主会发红包
public ArrayList<Double> sendMoney() {
//初始化要发红包的总金额和红包个数
double sendMoney = 0;
int count = 0;
//建立需要用到的键盘输入,集合以及随机数对象
Scanner input = new Scanner(System.in);
Random r = new Random();
ArrayList<Double> list = new ArrayList<>();
//群主输入要发的钱数
for (; ; ) {
System.out.print("请输入要发的红包总金额:");
sendMoney = input.nextDouble();
System.out.print("请输入要发的红包个数:");
count = input.nextInt();
//如果输入的金额大于群主的余额,则提示余额不足。
if (sendMoney > super.getMoney()) {
System.out.println("余额不足,请重新输入!");
}
//如果符合规则,跳出。
break;
}
//发完红包后群主的余额
super.setMoney(super.getMoney()-sendMoney);
//循环遍历输入集合中各个红包中的金额数
for (int i = 0; i < count-1; i++) {
//随机生成一个红包的大小,用*100在/100的方式完成“元角分”的随机
int temp2 = r.nextInt((int) (sendMoney * 100));
double red = temp2/100.0;
if(red == 0 || red == sendMoney){
i--;
continue;
}
list.add(red);
//剩余的钱数是原来的钱减去发出去的钱
sendMoney -= red;
}
//对发了总数-1个红包之后剩下的钱进行同样的操作后放入集合中
double d = Math.round(sendMoney*100)/100.0;
list.add(d);
return list;
}
}
然后定义一个收红包的类,就叫他Member类
public class Member extends Person{
//有收红包的方法
public void getRedPackage(ArrayList<Double> list){
//每当调用这个方法的时候都随机一个索引,随机数的大小由剩余的红包决定
Random r = new Random();
int index = r.nextInt(list.size());
//把得到的红包与抢红包的人原来的余额相加并赋值给这个人的余额
super.setMoney(super.getMoney()+list.get(index));
//删除已经被抢走的红包,否则有可能出现索引重复导致某一个红包重复被抢
list.remove(index);
}
}
现在随机抢红包的程序就写完了,就只剩下测试了。定义一个测试类。
public class Test {
public static void main(String[] args) {
Messager messager = new Messager();
messager.setMoney(200);
messager.setName("0");
//定义四个Member对象
Member one = new Member();
Member two = new Member();
Member three = new Member();
Member four = new Member();
//分别给四个对象赋值,由于本人比较懒所以赋值比较随意
one.setName("1");
one.setMoney(0);
two.setName("2");
two.setMoney(0);
three.setName("3");播妞在线
three.setMoney(0);
four.setName("4");
four.setMoney(0);
//用一个集合保存发红包方法的返回值
ArrayList<Double> list = messager.sendMoney();
System.out.println(list);
//以返回值为参数分别调用收红包的方法
one.getRedPackage(list);
two.getRedPackage(list);
three.getRedPackage(list);
four.getRedPackage(list);
//分别调用Person类的show方法查看余额
messager.show();
one.show();
two.show();
three.show();
four.show();
}
}
这些就是我做这道题的一些思路和想法,请各位大神多多指教。
|
|