用Java编写GUI界面,模拟抢红包游戏,在界面输入红包大小和抢红包人姓名(用逗号隔开),输出系统当前时间以及每个人抢的红包大小,要求每个人抢的红包最少不能少于0.01元,精确到小数点后两位。
时间: 2024-03-31 09:37:12 浏览: 15
好的,这是一个比较具体的编程问题。我可以提供一些思路和代码示例,帮助你完成这个任务。
首先,我们需要一个 GUI 界面来输入红包大小和抢红包人姓名。Java 提供了多种 GUI 库,比较常用的是 Swing 和 JavaFX。这里我使用 Swing 来实现。
下面是一个简单的 Swing 界面示例,包含一个标签、两个文本框和一个按钮:
```java
import javax.swing.*;
public class RedPacketGUI extends JFrame {
private JLabel label = new JLabel("请输入红包大小和抢红包人姓名(用逗号隔开):");
private JTextField amountField = new JTextField(10);
private JTextField nameField = new JTextField(10);
private JButton button = new JButton("确定");
public RedPacketGUI() {
super("抢红包游戏");
setSize(400, 150);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.add(label);
panel.add(amountField);
panel.add(nameField);
panel.add(button);
add(panel);
setVisible(true);
}
public static void main(String[] args) {
new RedPacketGUI();
}
}
```
接下来,我们需要在按钮点击事件中获取文本框中输入的红包大小和抢红包人姓名,然后计算每个人抢到的红包大小。这里我们可以使用 Java 的随机数生成器来模拟抢红包的过程。
下面是完整的代码示例:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
public class RedPacketGUI extends JFrame {
private JLabel label = new JLabel("请输入红包大小和抢红包人姓名(用逗号隔开):");
private JTextField amountField = new JTextField(10);
private JTextField nameField = new JTextField(10);
private JButton button = new JButton("确定");
public RedPacketGUI() {
super("抢红包游戏");
setSize(400, 150);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.add(label);
panel.add(amountField);
panel.add(nameField);
panel.add(button);
add(panel);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String input = amountField.getText() + "," + nameField.getText();
String[] parts = input.split(",");
double amount = Double.parseDouble(parts[0]);
String[] names = parts[1].split("\\s*,\\s*");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = format.format(new Date());
double[] amounts = allocateRedPacket(amount, names.length);
String result = "系统当前时间:" + time + "\n";
for (int i = 0; i < names.length; i++) {
result += names[i] + " 抢到红包:" + String.format("%.2f", amounts[i]) + " 元\n";
}
JOptionPane.showMessageDialog(null, result);
}
});
setVisible(true);
}
private double[] allocateRedPacket(double amount, int count) {
double[] amounts = new double[count];
Random random = new Random();
for (int i = 0; i < count; i++) {
if (i == count - 1) {
amounts[i] = amount;
} else {
double max = amount - (count - i - 1) * 0.01;
double value = random.nextDouble() * max;
amounts[i] = Math.floor(value * 100) / 100.0;
amount -= amounts[i];
}
}
return amounts;
}
public static void main(String[] args) {
new RedPacketGUI();
}
}
```
在上面的代码中,我们定义了一个 `allocateRedPacket` 方法,用来计算每个人抢到的红包大小。该方法接受两个参数:红包总金额和抢红包人数。方法实现的思路如下:
1. 定义一个长度为人数的数组,用来存储每个人抢到的红包金额。
2. 随机生成一个小数,范围为 0 到剩余金额减去剩余人数乘以 0.01(每个人抢到的最小金额)。
3. 将生成的金额四舍五入到小数点后两位。
4. 将生成的金额存入数组中,然后将红包总金额减去该金额。
5. 重复步骤 2 到步骤 4,直到分配完所有红包。
最后,我们使用 `JOptionPane.showMessageDialog` 方法来弹出一个对话框,显示每个人抢到的红包大小。对话框中的文本使用字符串拼接的方式生成,每个人抢到的金额使用 `String.format` 方法格式化为保留两位小数的字符串。