晚会抽奖程序
用Java编程实现一个晚会抽奖程序,要求能随机抽奖,并显示。
(一)具体要求:
(1)可初始化设置抽奖轮次数、每次中奖人数、是否允许重复中奖(一般不允许)等信息。
(2)可设定参与人数
(3)显示已中奖人数及号码、未中奖人数
(4)可以保存抽奖结果
(二)基本要求(及格要求):
(1)实现随机抽奖并显示
(2)保存抽奖结果
(三)功能扩展:
(1)图形用户界面
(2)导入参会者编号与姓名
(3)界面友好、有趣
(四)技术提示:
(1)算法提示:构造参与者数组(或数据集合),产生一个0到数组元素数之间的随机数,每抽出一人,从数组(集合)中删除对应的元素(若用数组实现,注意删除指定位置元素后,其后的元素应逐一前移;若用List、Map等集合类实现,可直接使用这些类的已有删除元素方法)
package 晚会抽奖程序;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class LotteryProgram extends JFrame {
private static final long serialVersionUID = 1L;
private int roundCount; // 抽奖轮次数
private int winnersPerRound; // 每轮中奖人数
private boolean allowDuplicateWinners; // 是否允许重复中奖
private List participants; // 参与人员名单
private List winners; // 已中奖人员名单
private List losers; // 未中奖人员名单
private JTextArea winnersText;
private JTextArea losersText;
private JLabel winnersCountLabel;
private JLabel losersCountLabel;
public LotteryProgram(int roundCount, int winnersPerRound, boolean allowDuplicateWinners) {
this.roundCount = roundCount;
this.winnersPerRound = winnersPerRound;
this.allowDuplicateWinners = allowDuplicateWinners;
participants = new ArrayList<>();
winners = new ArrayList<>();
losers = new ArrayList<>();
JPanel panel = new JPanel();
panel.setLayout(null);
JLabel winnersLabel = new JLabel(“已中奖:”);
winnersLabel.setBounds(20, 20, 100, 20);
panel.add(winnersLabel);
winnersText = new JTextArea();
winnersText.setEditable(false);
JScrollPane winnersScrollPane = new JScrollPane(winnersText);
winnersScrollPane.setBounds(20, 40, 200, 200);
panel.add(winnersScrollPane);
JLabel losersLabel = new JLabel(“未中奖:”);
losersLabel.setBounds(240, 20, 100, 20);
panel.add(losersLabel);
losersText = new JTextArea();
losersText.setEditable(false);
JScrollPane losersScrollPane = new JScrollPane(losersText);
losersScrollPane.setBounds(240, 40, 200, 200);
panel.add(losersScrollPane);
winnersCountLabel = new JLabel(“已中奖人数:0”);
winnersCountLabel.setBounds(20, 250, 200, 20);
panel.add(winnersCountLabel);
losersCountLabel = new JLabel(“未中奖人数:0”);
losersCountLabel.setBounds(240, 250, 200, 20);
panel.add(losersCountLabel);
JButton startButton = new JButton(“开始抽奖”);
startButton.setBounds(100, 290, 100, 30);
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
startLottery();
}
});
panel.add(startButton);
setContentPane(panel);
setSize(480, 380);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void startLottery() {
for (int i = 0; i < roundCount; i++) {
if (participants.size() < winnersPerRound) {
JOptionPane.showMessageDialog(this, “参与人数不足以进行该轮抽奖!”);
return;
}
List roundWinners = new ArrayList<>();
for (int j = 0; j < winnersPerRound; j++) {
int index = new Random().nextInt(participants.size());
String winner = participants.get(index);
if (!allowDuplicateWinners && roundWinners.contains(winner)) {
j–;
continue;
}
roundWinners.add(winner);
winners.add(winner);
participants.remove(index);
}
updateWinnersText();
updateLosersText();
updateWinnersCount();
updateLosersCount();
}
JOptionPane.showMessageDialog(this, “抽奖结束!”);
}
private void updateWinnersText() {
winnersText.setText(“”);
for (String winner : winners) {
winnersText.append(winner + “\n”);
}
}
private void updateLosersText() {
losersText.setText(“”);
for (String loser : participants) {
losersText.append(loser + “\n”);
}
}
private void updateWinnersCount() {
winnersCountLabel.setText(“已中奖人数:” + winners.size());
}
private void updateLosersCount() {
losersCountLabel.setText(“未中奖人数:” + participants.size());
}
public static void main(String[] args) {
LotteryProgram lotteryProgram = new LotteryProgram(3, 2, false);
}
}
LotteryProgram
类继承自JFrame
,表示抽奖程序的主窗口。roundCount
表示抽奖轮次数,winnersPerRound
表示每轮中奖人数,allowDuplicateWinners
表示是否允许重复中奖。participants
用于存储参与抽奖的人员名单,winners
用于存储已中奖人员名单,losers
用于存储未中奖人员名单。- 在构造函数中,初始化了界面的各个组件,包括显示已中奖和未中奖名单的文本区域、已中奖人数和未中奖人数的标签以及开始抽奖的按钮。
startLottery()
方法用于开始抽奖,每轮抽奖从参与人员名单中随机选择指定数量的中奖人员,并将其从参与人员名单中移除,然后更新界面的显示内容。updateWinnersText()
和updateLosersText()
方法用于更新已中奖和未中奖名单的显示文本。updateWinnersCount()
和updateLosersCount()
方法用于更新已中奖人数和未中奖人数的显示文本。- 在
main()
方法中,创建了一个LotteryProgram
对象,设置了抽奖轮次数为3,每轮中奖人数为2,不允许重复中奖。
总体来说,这段代码实现了一个简单的抽奖程序,通过界面与用户进行交互,完成抽奖过程,并实时显示已中奖和未中奖名单。用户可以根据需要设置抽奖的轮次数、每轮中奖人数以及是否允许重复中奖。
要将参与抽奖的人员名单中添加 “张三”,“李四”,“王二麻子”,“赵四”,“刘能”,“谢广坤”,你可以在LotteryProgram
类的构造函数中,在以下代码之前添加参与人员名单的初始化:
participants.add("张三");
participants.add("李四");
participants.add("王二麻子");
participants.add("赵四");
participants.add("刘能");
participants.add("谢广坤");
修改后的代码如下:
package 晚会抽奖程序