用Java编写GUI界面,模拟抢红包游戏,在界面输入红包大小和抢红包人姓名(用逗号隔开),输出系统当前时间以及每个人抢的红包大小,要求每个人抢的红包最少不能少于0.01元。
时间: 2024-03-31 22:37:20 浏览: 54
基于java实现的趣味性抢红包demo
好的,这是一个很有趣的问题,我可以为您提供一些帮助的建议。首先,您可以使用Java的Swing库来编写GUI界面。然后,您可以使用Java的日期和时间库来获取当前系统时间。最后,您可以编写一个处理红包和抢红包的函数,这个函数将接受红包大小和抢红包人姓名作为输入,并计算每个人抢到的红包大小。
以下是一个简单的代码示例,仅供参考:
```java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RedEnvelopeGame extends JFrame {
private JTextField redPacketField;
private JTextField nameField;
private JTextArea resultArea;
public RedEnvelopeGame() {
super("Red Envelope Game");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);
JPanel inputPanel = new JPanel();
inputPanel.setLayout(new GridLayout(2, 2, 10, 10));
inputPanel.add(new JLabel("Red Packet Size:"));
redPacketField = new JTextField(10);
inputPanel.add(redPacketField);
inputPanel.add(new JLabel("Name:"));
nameField = new JTextField(10);
inputPanel.add(nameField);
JPanel buttonPanel = new JPanel();
JButton grabButton = new JButton("Grab");
grabButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String redPacketText = redPacketField.getText();
String nameText = nameField.getText();
if (redPacketText.isEmpty() || nameText.isEmpty()) {
JOptionPane.showMessageDialog(RedEnvelopeGame.this, "Please enter red packet size and name.");
return;
}
double redPacketSize = Double.parseDouble(redPacketText);
String[] names = nameText.split(",");
double[] amounts = grabRedEnvelope(redPacketSize, names);
StringBuilder sb = new StringBuilder();
sb.append("Current Time: ").append(new java.util.Date()).append('\n');
for (int i = 0; i < names.length; i++) {
sb.append(names[i]).append(": ").append(amounts[i]).append('\n');
}
resultArea.setText(sb.toString());
}
});
buttonPanel.add(grabButton);
resultArea = new JTextArea();
resultArea.setEditable(false);
resultArea.setLineWrap(true);
JScrollPane scrollPane = new JScrollPane(resultArea);
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(inputPanel, BorderLayout.NORTH);
contentPane.add(buttonPanel, BorderLayout.CENTER);
contentPane.add(scrollPane, BorderLayout.SOUTH);
}
private double[] grabRedEnvelope(double size, String[] names) {
int n = names.length;
double[] amounts = new double[n];
double total = 0.0;
for (int i = 0; i < n; i++) {
amounts[i] = Math.random() * size / 2.0 + 0.01;
total += amounts[i];
}
while (total > size) {
int i = (int) (Math.random() * n);
double diff = total - size;
if (amounts[i] > diff) {
amounts[i] -= diff;
total -= diff;
} else {
total -= amounts[i];
amounts[i] = 0.0;
}
}
return amounts;
}
public static void main(String[] args) {
RedEnvelopeGame game = new RedEnvelopeGame();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
game.setVisible(true);
}
});
}
}
```
在这个代码示例中,我们使用了JTextField、JLabel、JButton和JTextArea等Swing库中的控件来构建GUI界面。在点击“Grab”按钮后,我们将调用grabRedEnvelope函数来模拟抢红包行为,并将结果输出到JTextArea中。
grabRedEnvelope函数会接受红包大小和抢红包人姓名作为输入,并计算每个人抢到的红包大小。我们首先随机生成每个人抢到的红包大小,然后计算所有红包的总和。如果总和超过了红包大小,我们将随机选择一个人,将其抢到的红包大小减小一些,直到总和不再超过红包大小为止。注意,我们要确保每个人抢到的红包大小最少不能少于0.01元。
当然,这只是一个简单的示例,您可以根据自己的需要进行修改和扩展。希望能对您有所帮助!
阅读全文