java编写GUI界面,模拟抢红包游戏,在界面输入红包大小和抢红包人姓名(用逗号隔开),输出系统当前时间以及每个人抢的红包大小,要求每个人抢的红包最少不能少于0.01元,精确到小数点后两位。
时间: 2024-04-01 09:32:24 浏览: 107
好的,这是一个比较具体的编程问题,我可以提供一些思路和代码示例,帮助你完成这个任务。
首先,我们需要创建一个 GUI 界面,可以使用 Java 中的 Swing 或者 JavaFX 等库来实现。在界面上添加输入框和按钮,让用户可以输入红包大小和抢红包人姓名,并且点击按钮后触发抢红包的过程。同时,我们需要在界面上显示系统当前时间以及每个人抢的红包大小。
接下来,我们需要编写抢红包的逻辑。根据题目要求,每个人抢的红包最少不能少于0.01元,因此我们需要在程序中进行判断,确保每个人抢的红包金额不低于这个数值。同时,我们需要对红包进行拆分,让每个人抢到的金额总和等于红包大小。这里可以使用一些算法来实现,例如二倍均值法或者线段切割法等。
最后,我们需要将每个人抢到的红包大小输出到界面上。可以使用 Java 中的 JTextArea 或者 JLabel 等组件来显示文本信息。
下面是一个简单的代码示例,仅供参考:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
public class RedPacket extends JFrame implements ActionListener {
private JButton btnStart; // 开始按钮
private JTextField tfMoney; // 红包金额输入框
private JTextField tfName; // 抢红包人姓名输入框
private JTextArea taResult; // 显示抢红包结果的文本框
public RedPacket() {
initUI();
}
private void initUI() {
setTitle("抢红包游戏");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);
// 创建界面元素
JLabel lblMoney = new JLabel("红包金额:");
JLabel lblName = new JLabel("抢红包人姓名:");
tfMoney = new JTextField(10);
tfName = new JTextField(10);
btnStart = new JButton("开始抢红包");
taResult = new JTextArea(10, 30);
taResult.setEditable(false);
// 添加事件监听器
btnStart.addActionListener(this);
// 添加界面元素
JPanel panel = new JPanel();
panel.add(lblMoney);
panel.add(tfMoney);
panel.add(lblName);
panel.add(tfName);
panel.add(btnStart);
add(panel, BorderLayout.NORTH);
add(new JScrollPane(taResult), BorderLayout.CENTER);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnStart) {
startGame();
}
}
private void startGame() {
// 获取红包金额和抢红包人姓名
double money = Double.parseDouble(tfMoney.getText());
String name = tfName.getText();
// 对红包进行拆分
List<Double> packets = splitRedPacket(money);
// 显示抢红包结果
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
StringBuilder sb = new StringBuilder();
sb.append(sdf.format(new Date())).append("\n");
for (Double packet : packets) {
sb.append(name).append(": ").append(String.format("%.2f", packet)).append(" 元\n");
}
taResult.append(sb.toString());
}
private List<Double> splitRedPacket(double money) {
List<Double> packets = new ArrayList<>();
Random random = new Random();
double sum = 0;
while (sum < money) {
double remain = money - sum;
int count = packets.size();
if (count == 0) {
// 第一个人抢红包
double packet = round(random.nextDouble() * remain);
packets.add(packet);
sum += packet;
} else {
// 非第一个人抢红包
double max = remain / count * 2;
double packet = round(random.nextDouble() * max);
if (packet < 0.01) {
packet = 0.01;
}
packets.add(packet);
sum += packet;
}
}
return packets;
}
private double round(double value) {
return Math.round(value * 100) / 100.0;
}
public static void main(String[] args) {
RedPacket rp = new RedPacket();
rp.setVisible(true);
}
}
```
阅读全文