JAVA-抢红包小程序设计
JAVA
第三章 抢红包小程序设计1
文章目录
- JAVA
- 一、简要要求
- 二、实现
- 1.定义工具类RedPacketUtil
- 2.自定义异常类,继承Exception,简单抛出提示信息
- 3.编写模拟人员抢红包,并展示红包领取详情
- 4.编写一个测试类,生成产生红包类对象
- 总结
一、简要要求
编写一个将红包金额按一定数量随机分配的小程序。红包金额最大不能超过 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();}
}
总结
调出来了
自己输入人名啥的就能抢了
JAVA-抢红包小程序设计相关推荐
- Java抢红包小程序
程序要求 1:任意输入金额和红包个数 2:输出每个红包的金额,并标记手气最佳 3:1键模拟抢红包过程 4:2键列出当前红包情况(总金额.总红包数.剩余红包数等) 5:3键取消发红包 代码如下: pa ...
- CoreJava 笔记总结-第三章 Java的基本程序设计结构
CoreJava 笔记总结 文章目录 CoreJava 笔记总结 第三章 Java的基本程序设计结构 数据类型 1. 整型 2. 浮点类型 3. char类型 4. boolean类型 变量与常量 1 ...
- JAVA高并发程序设计(葛一鸣著)读书笔记
本文为JAVA高并发程序设计(葛一鸣著)读书笔记.这本书对于刚刚入门的童鞋来讲可能有点深,我推荐可以先看看Java多线程编程核心技术(高洪岩著)一书. 第一章 走入并行世界 什么是同步和异步? 同步就 ...
- Java高并发程序设计入门
转自:http://blog.csdn.net/johnstrive/article/details/50667557 说在前面 本文绝大部分参考<JAVA高并发程序设计>,类似读书笔记和 ...
- JavaSE-Adventure(VII) Java OOP 面向对象程序设计
JavaSE-Adventure(VII) Java & OOP 面向对象程序设计 CONTENTS JavaSE-Adventure(VII) Java & OOP 面向对象程序设计 ...
- 《实战Java高并发程序设计》github笔记和源码
笔记 <实战Java高并发程序设计>中有很多代码范例,适合初学者通过实践入门并发编程,这本书有个问题就是前面的代码都用JDK7,第六章开始又用JDK8了 笔者做了相关笔记并整理源代码,欢迎 ...
- 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库
源码获取:我的博客资源页面可以下载!!!! 项目名称 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库 系统说明 本商业旅游系统可以分为三个部分,即微信小程序的手机客户端 ...
- 第2章(Java 的基本程序设计结构)
第2章(Java 的基本程序设计结构) 文章目录 第2章(Java 的基本程序设计结构) 2.1一个简单的 Java 应用程序 2.2注 释 2.3数据类型 2.3.1整型 2.3.2浮点型 2.3. ...
- java个人小管家代码_Java程序设计基础—Java小管家系统构建
课题一 Java桌面小管家项目分析 任务1 Java桌面小管家项目分析 课题二 了解Java语言 任务2 编写第一个Java程序 课题三 面向对象程序设计思想 任务3 为小管家设计类 任务4 实现小管 ...
最新文章
- java基础小总结(2)
- [保护模式]PAE模式
- 反问疑问_句子练习大全(反问、疑问、设问、病句等练习)
- linux下利用C或C++语言调用需要root权限的函数
- Codeforces1142D
- JDK 10:FutureTask获取一个toString()
- 关于操作系统I/O的一些基础知识
- SqlDataReader的用法(重点:访问字段的值)
- 【QT】QT事件处理
- IP路由原理 直连路由和静态路由 路由协议
- PostgreSQL中with和without time zone两者有什么区别
- java gwt开发_java – 如何启动GWT超级开发模式
- Spring源码系列(十二)Spring创建Bean的过程(二)
- 横版射击,王者归来|Cocos精品《合金弹头OL》
- 计算机网络安全工作室介绍,计算机网络技术专业 “网络工作室”做法简介
- STM32闭环步进电机驱动器方案,原理图,源码,PCB
- c语言闯关考试题讲解,程序员面试闯关(二):数据结构考点与细节分析
- RuntimeError: non-empty 3D or 4D input tensor expected but got ndim: 4
- 微信商城开源版二次开发(二)
- UI设计都需要学什么呢?零基础如何学UI设计?