JAVA-抢红包小程序设计

JAVA-抢红包小程序设计JAVA提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加第三章抢红包小程序设计1文章目录JAVA一、简要要求二、实现1.定义工具类RedPacketUtil2.编写一个测试类,生成产生红包类对象总结一、简要要求编写一个将红包金额按一定数量随机分配的小程序。红包金额最大不能超过200元,每个人分到的红包最小不能少于1分钱,红包的最小单位是分二、实现1.定义工具类RedPacketUtil类中定义类属性:最小红包额度,最大红包额度,每个红包最大金额是平均值的倍数等;

大家好,欢迎来到IT知识分享网。

JAVA

第三章 抢红包小程序设计1


一、简要要求

编写一个将红包金额按一定数量随机分配的小程序。红包金额最大不能超过 200 元,每个人分到的红包最小不能少于 1 分钱,红包的最小单位是分

二、实现

1.定义工具类RedPacketUtil

类中定义类属性:最小红包额度,最大红包额度,每个红包最大金额是平均值的倍数等;
定义isRight()函数检查红包金额的合法性,如平均值小于最小金额,总金额大于红包金额的最大值等都判断为不合法。
定义List splitRedPackets(int money, int count) 方法:参数分别为红包总金额(单位:分)和红包数量,将分配好的红包放入 List 集合。首先调用检查函数,如果金额不合法,抛出:“红包金额不合法”的自定义异常;根据红包数,红包总金额,红包最大金额和最小金额,循环调用随机产生每个红包值的函数randomVal(),返回值存入list集合。
定义随机产生单个红包值函数randomVal():首先进行判断,如果红包数量为1,直接返回金额;最大金额和最小金额相等,直接返回金额。随机产生一个红包值,(int)Math.rint(Math.random() * (每个红包的最大值 – 每个红包的最小值) + 每个红包的最小值)) % 每个红包的最大值 + 1(单位都是分)。判断是否合法isRight(剩余金额,剩余红包数),合法就返回。否则,如果下一轮红包平均值比最小值小,将此轮产生的红包值作为最大值,递归调用随机生成函数;如果下一轮红包平均值比最大值大,将此轮产生的红包值作为最小值,递归调用随机生成函数。
自定义异常类,继承Exception,简单抛出提示信息即可。

代码如下:

import java.util.List;
import java.util.ArrayList;
public class RedPacketUtil { 
   
	List<Integer> list = new ArrayList();
	public RedPacketUtil() { 
   }
	public RedPacketUtil(double money,int count) { 
   
		this.money=money;
		this.count=count;
	}
	double min=0.01;//最小红包额度
	double maxmoney=200;//最大红包额度
	double money;
	int count;//红包数量
	double minMoney=0.01;
	boolean isRight() { 
   
		boolean a=true;
		if(money/count<min||money>200||money<0.01) { 
   
			a=false;
		}
		return a;
	}
	public List<Integer> splitRedPackets(int money, int count) throws MyException{ 
   
		this.money=money;
		this.count=count;
	    boolean b=isRight();
	    if(b==false) { 
    throw new MyException("红包金额不合法");}
		for (int i = 1; i <=count; i++) { 
   //生成count个100内的随机数
	    double r=randomVal();
		list.add((int) r);//存入list集合
		}
		for(int i=0;i<list.size();i++) { 
   
			System.out.printf(list.get(i)+" ");
		}System.out.print("\n");return list;
		}
	public double randomVal() { 
   
		if(count==1||money==min) { 
   return money;}
		double max=2*money/count;
		double x=Math.random();
		//System.out.print(x+" ");
		double m=Math.rint((x*(max-min)+min)%max+1);
		//System.out.println(m);
		money=money-m;
		count--;
		if(isRight()==false) { 
   
			
			if(money/count<min) { 
   
				min=m;
				randomVal();
			}
			if(money/count>max) { 
   
				min=m;
				randomVal();
			}
			//红包数额分配
		}
		return m;
	}
}

2.自定义异常类,继承Exception,简单抛出提示信息

代码如下:

public class MyException extends Exception{ 
   
	public MyException() { 
   }
	public MyException(String s) { 
   
		System.out.println(s);
	}
}

3.编写模拟人员抢红包,并展示红包领取详情

定义RedEnvelope 类,可能用到的属性: 红包金额(分),红包数目 ,发送日期,第一个人抢红包的开始时间,红包抢完后的结束时间,List bag; // 分配到的红包列表(分),Map<String,Double> info; // 红包领取信息。
定义一个 open 的方法,该方法携带一个参数 name,表明是这个人打开了红包,在该方法中实现以下功能:如果超过 5 秒没人领取,红包过期,当再打开红包时,输出:“红包已经过期”;如果未过期,且第一个人打开红包时,将 start 设为当前时间,记录下红包开始领取的时间,将红包列表的最后一个值给该人,第二个人打开时就将红包列表的倒数第二位的值给他,输出:“恭喜xx,领取到了xx元”,并将姓名作为 key,红包金额作为 value 存到集合HashMap中(注意:输出和存储是需要将分转换为元,除以 100.0),将红包数量减去一,并判断红包数量是否为零,如果为零则获取当前时间为红包领取完的时间,计算红包几秒领取完毕,输出:“红包被抢完,一共用了xx秒”,后面的人领取红包时依次类推;如果红包领完后,且红包未过期,输出:“xx手速慢了,红包都没啦”;
showInfo():该方法实现打印红包领取详情,输出格式为:“xx抢到了xx元”,当所有红包领取详情输出完毕后,最后输出谁是运气王,输出格式为:“其中,xx是运气王,抢到了xx元”。

代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.HashMap;
public class RedEnvelope { 
   
	int redmoney;
	int num;
	Date setdate;
	long star;
	long end;
	List<Integer> bag;
	Map<String,Double> info;
	public RedEnvelope() { 
   }
	public void RedEnvelope(int m,int b,List<Integer> bag) { 
   
		this.num=b;
		this.redmoney=m;
		this.bag=bag;{ 
   
			info=new HashMap<>();
			setdate=new Date();
		}
	}
	public void open(String name) { 
   
	       int second = (int)((new Date().getTime()- setdate.getTime()) / (1000));
	        if (second < 5){ 
   
	            if ( info.size() == 0 ){ 
   
	                star= new Date().getTime();
	            }
	            if (num > 0 ){ 
   
	                double nowMoney = bag.get(num - 1)/100.0;
	                info.put(name, nowMoney);
	                System.out.println("恭喜" + name + ",抢到了" + nowMoney + "元");
	                num--;
	            }
	            if (num == 0){ 
   
	                end = new Date().getTime();
	                System.out.println("红包被抢完,一共用了" + ((int)((end - star) / (1000))) + "秒");
	                num = -1;
	                return;
	            }
	            if(num == -1){ 
   
	                System.out.println( name + "手速慢了,红包都没啦");
	            }
	        }
	        else { 
   
	            System.out.println( name + ":红包已经过期");
	        } 
	}
	public void showInfo(){ 
   
		double max=0;
        for(Entry<String, Double> entry : info.entrySet()){ 
   
            max = entry.getValue() > max ? entry.getValue() : max;
            System.out.printf( "%s抢到了%.2f元\n", entry.getKey(),entry.getValue());
        }
        for(Entry<String, Double> entry : info.entrySet()){ 
   
            if (entry.getValue() == max){ 
   
                System.out.printf( "其中,%s是运气王,抢到了%.2f元\n", entry.getKey(),entry.getValue());
                break;
            }
            }
	}
}

4.编写一个测试类,生成产生红包类对象

代码如下:

import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;
public class text4 { 
   
	public static void main(String[] args) throws MyException { 
    
		Scanner in=new Scanner(System.in);
		System.out.println("请输入红包金额:");
		int a=in.nextInt();
		System.out.println("请输入红包个数:");
		int b=in.nextInt();
		RedPacketUtil c=new RedPacketUtil();
		c.splitRedPackets(a,b);
		RedEnvelope d=new RedEnvelope();
		d.RedEnvelope(a,b,c.list);
		System.out.println("请输入抢红包人名:");
		d.open(in.next());
		d.open(in.next());
		d.open(in.next());
		d.open(in.next());
		d.open(in.next());
		d.showInfo();
	}
}

总结

调出来了
在这里插入图片描述
自己输入人名啥的就能抢了

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/12319.html

(0)
上一篇 2024-03-15 11:45
下一篇 2024-03-15 16:15

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信