JAVA课设

您所在的位置:网站首页 学生抽奖程序 JAVA课设

JAVA课设

2024-07-15 01:57| 来源: 网络整理| 查看: 265

一.小组成员及分工 成员名完成部分备注苏晨茜图形化界面,统计并显示获奖情况,测试代码,git上传,团队博客撰写组长刘倩管理员登录及管理员抽奖功能,彩票信息记录组员陈俐文用户注册登录,用户名、密码余额等信息管理,用户抽奖功能组员

二.题目及要求

功能要求:模拟福利彩票36选7,实现彩票抽奖与中奖通知功能,需完成如下功能:

1.允许注册用户

用户信息包括用户名,密码,账户金额,电话号码等信息

2.允许注册用户购买彩票

用户能进行手动选号、随机选号,并允许设置投掷数

3.抽奖功能

(1)屏幕上显示抽奖号码的滚动过程,当按”停止“时产生抽奖结果

(2)特等奖:7个号码全中

         一等奖:中6个号码

(3)抽出号码后,显示用户名和中奖信息

4.彩票通知功能

抽出号码后用户登录系统,系统显示是否中奖

5.测试功能

(1)设计一自动注册用户(10w个),能够自动买彩票

(2)模拟抽奖,测试抽奖程序的正确性

三.前期调查

四.设计思路 1.功能流程图

2.系统结构图

3.包结构图

五.代码及成果展示

代码已上传git仓库

网址为:https://gitee.com/hahaha-hahaha-hahaha-hhh/lotterySystem.git

(一)代码展示 1.Admin包

该包用于管理员储存信息的管理,及管理员的抽号功能

1)Admin类

储存管理员名及密码,用于管理员登录

package Admin; public class Admin { private String adminName; private String adminPassword; public Admin(String adminName, String adminPassword) { this.adminName = adminName; this.adminPassword = adminPassword; } public String getAdminName() { return adminName; } public void setAdminName(String adminName) { this.adminName = adminName; } public String getAdminPassword() { return adminPassword; } public void setAdminPassword(String adminPassword) { this.adminPassword = adminPassword; } // 验证管理员登录 public static boolean validateAdmin(String adminName, String adminPassword) { return adminName.equals("admin") && adminPassword.equals("123456"); } } 2)Rolling类

a. Rolling   模拟滚动并显示滚动号码

b. displayResult    屏幕上显示中奖结果

c. displayRollingNumber    自动生成中奖号码

d. setWinningNumber    判断抽中的号码是否合法

e. createJframe   图形化界面设置

package Admin; import java.util.Random; import javax.swing.*; import lotterySystem.Show; import lotterySystem.Winning; import java.awt.BorderLayout; import java.util.List; //负责实现彩票抽奖的逻辑,包括生成中奖号码、比对用户选择的号码等 public class Rolling { //自动生成中奖号码 public interface RollingCallback { void onRollingFinished(String winningNumber); } private static Thread rollingThread; private static JLabel numberLabel; private static String winningNumber; private static volatile boolean rolling = true; // 用于控制是否滚动 public static String rolling(RollingCallback callback) { JFrame frame = new JFrame("抽奖游戏"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton startButton = new JButton("开始"); JButton stopButton = new JButton("停止"); numberLabel = new JLabel("", SwingConstants.CENTER); startButton.addActionListener(e -> { rolling = true; Thread rollingThread = new Thread(() -> { while (rolling) { String number = generateWinningNumber(); displayRollingNumber(number); // 在屏幕上显示滚动中的号码 try { Thread.sleep(100); // 模拟滚动速度 } catch (InterruptedException ex) { ex.printStackTrace(); } } }); rollingThread.start(); }); stopButton.addActionListener(e -> { rolling = false; // 停止滚动 winningNumber = generateWinningNumber(); // 生成中奖号码 displayResult(winningNumber); if (callback != null) { frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); callback.onRollingFinished(winningNumber); // 调用回调函数通知抽奖结束 } }); if (rollingThread != null && rollingThread.isAlive()) { try { rollingThread.join(); } catch (InterruptedException ex) { ex.printStackTrace(); } numberLabel.setText(""); // 清空号码显示 } JPanel panel=new JPanel(); panel.add(startButton); panel.add(stopButton); frame.add(panel, BorderLayout.SOUTH); frame.add(numberLabel, BorderLayout.CENTER); frame.setSize(300, 200); frame.setVisible(true); return winningNumber; } public static void displayResult(String winningNumber) { SwingUtilities.invokeLater(() -> numberLabel.setText("\n中奖号码是:【" + winningNumber.replaceAll("(\\d{2})", "$1,") + "】")); }// 在屏幕上展示中奖结果 public static void displayRollingNumber(String number) { SwingUtilities.invokeLater(() -> numberLabel.setText("抽奖中:【" + number.replaceAll("(\\d{2})", "$1,")+ "】")); } // 自动生成中奖号码 public static String generateWinningNumber() { Random random = new Random(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 7; i++) { int number = random.nextInt(36) + 1; sb.append(String.format("%02d", number)); // 使用两位宽度格式化数字,并在前面补0 } return sb.toString(); } //判断中将号码是否合法 public static boolean setWinningNumber(String number) { if(!number.matches("\\d{14}")) { JOptionPane.showMessageDialog(null, "号码不合法,请重新选择"); return false;} for (int i = 0; i < number.length(); i += 2) { String subNum = number.substring(i, i + 2); int numValue = Integer.parseInt(subNum); if (numValue < 1 || numValue > 36) { JOptionPane.showMessageDialog(null, "号码不合法,请重新选择"); return false; } } winningNumber = number; JOptionPane.showMessageDialog(null, "设置成功,中将号码为:【"+winningNumber.replaceAll("(\\d{2})", "$1,")+ "】"); return true; } public static void createJframe(List userRecords){ JFrame frame = new JFrame("抽奖游戏"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton startButton = new JButton("开始"); JButton stopButton = new JButton("停止"); numberLabel = new JLabel("", SwingConstants.CENTER); startButton.addActionListener(e -> { rolling = true; Thread rollingThread = new Thread(() -> { while (rolling) { String number = generateWinningNumber(); displayRollingNumber(number); // 在屏幕上显示滚动中的号码 try { Thread.sleep(100); // 模拟滚动速度 } catch (InterruptedException ex) { ex.printStackTrace(); } } }); rollingThread.start(); }); stopButton.addActionListener(e -> { rolling = false; // 停止滚动 winningNumber = generateWinningNumber(); // 生成中奖号码 displayResult(winningNumber); // if (callback != null) { frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); JOptionPane.showMessageDialog(frame, "抽奖结束,中奖号码:"+ winningNumber); Show.displayWinnerInfos(Winning.checkWinning(userRecords, winningNumber),winningNumber); // 继续执行其他逻辑... // callback.onRollingFinished(winningNumber); // 调用回调函数通知抽奖结束 // } if (rollingThread != null && rollingThread.isAlive()) { try { rollingThread.join(); } catch (InterruptedException ex) { ex.printStackTrace(); } numberLabel.setText(""); // 清空号码显示 } }); JPanel panel=new JPanel(); panel.add(startButton); panel.add(stopButton); frame.add(panel, BorderLayout.SOUTH); frame.add(numberLabel, BorderLayout.CENTER); frame.setSize(300, 200); frame.setVisible(true); return; } } 2.lotterySystem包

该包用于显示用户的获奖信息,包括当前用户和所有用户,并对比用户号码是否中奖及计算奖项

1)Show类

a. displayNumbers  显示该用户获奖信息

b.displayWinnerInfos 显示所有中奖者的用户信息

package lotterySystem; import java.awt.BorderLayout; import java.util.List; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import user.User; public class Show { //显示当前用户的彩票号数和获奖情况, public static void displayNumbers(List numbers, User user) { JFrame frame = new JFrame(user.getUsername() + "'s Numbers and Winning Status"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // 设置关闭操作为销毁窗口 JPanel panel = new JPanel(new BorderLayout()); String[] columnNames = {"彩票号码", "获奖情况"}; Object[][] data = new Object[numbers.size()][2]; for (int i=0; i1){ if(numberInfo[1].equals("未中奖")){ data[i][1]="未中奖"; }else{ data[i][1]=numberInfo[1]; } }else{ data[i][1]="未开奖"; } } JTable table=new JTable(data,columnNames); JScrollPane scrollPane=new JScrollPane(table); panel.add(scrollPane,BorderLayout.CENTER); frame.add(panel); frame.setSize(400, 300); frame.setVisible(true); } //显示所有获奖者的获奖信息 public static void displayWinnerInfos(List winnerInfos, String winningNumber) { JFrame dialog = new JFrame("Lottery Winners"); dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // 设置关闭操作为销毁窗口 JPanel panel = new JPanel(new BorderLayout()); JLabel winningLabel = new JLabel("中奖号码:" + winningNumber); panel.add(winningLabel, BorderLayout.NORTH); String[] columnNames={"用户名","彩票号码","奖项"}; Object[][] data=new Object[winnerInfos.size()][3]; for(int i=0;i new Lottery()); break; default: break; } if(winningNumber!=null){ set=Rolling.setWinningNumber(winningNumber); Show.displayWinnerInfos(Winning.checkWinning(userRecords, winningNumber),winningNumber); }else{ set=true; } } } else { JOptionPane.showMessageDialog(frame, "管理员用户名或密码错误!"); } } }); frame.setVisible(true); } } 2)Test package test; public class Test { public static void main(String[] args) { new GUI(); } } 5.User包

该包用于用户选号及用户信息的管理

1)NumberSelection类

a. selectNumberRandomly  用户随机选数

b. selectNumber  用户手动选数

package user; import java.util.List; import java.util.Random; import javax.swing.JOptionPane; public class NumberSelection { public static String selectNumberRandomly() { Random random = new Random(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 7; i++) { int number = random.nextInt(36) + 1; sb.append(String.format("%02d", number)); // 使用两位宽度格式化数字,并在前面补0 } return sb.toString(); } public static String selectNumber(User user, String number, List numbers) { double price = 2.0; // 彩票价格 if (user.getBalance() < price) { JOptionPane.showMessageDialog(null, "余额不足,请先充值"); return null; } if (!isValidNumber(number)) { JOptionPane.showMessageDialog(null, "号码不合法,请重新选择"); return null; } if (numbers.contains(number)) { JOptionPane.showMessageDialog(null, "号码重复,请重新选择"); return null; } user.setBalance(user.getBalance() - price); // 扣除购买彩票的金额 JOptionPane.showMessageDialog(null, "选择号码成功,号码为:" + number); return number; } public static boolean isValidNumber(String number) { if(!number.matches("\\d{14}")) return false; for (int i = 0; i < number.length(); i += 2) { String subNum = number.substring(i, i + 2); int numValue = Integer.parseInt(subNum); if (numValue < 1 || numValue > 36) { return false; } } return true; } } 2)User类 package user; import java.util.List; import record.DataStorage; public class User { private String username; private String password; private double balance; private String telnumber; public User(String username, String password,String telnumber) { this.username=username; this.password=password; this.telnumber=telnumber; this.balance=0.0; } public User(String username, String password,double balance,String telnumber) { this.username=username; this.password=password; this.telnumber=telnumber; this.balance=balance; } public User(String username, String password,double balance) { this.username=username; this.password=password; this.balance=balance; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getTelnumber() { return telnumber; } public void setTelnumber(String telnumber) { this.telnumber = telnumber; } public void recharge(User user, double amount,List userRecords) { user.setBalance(user.getBalance() + amount); DataStorage.updateBalance(user.getUsername(), user.getBalance(),userRecords); System.out.println("充值成功!当前余额为:" + user.getBalance()); } } (二)代码运行结果展示 1.菜单显示:

2.用户注册:

用户登录:

充值:

再充值5元:

选择号码:

手动选号:(选中的号码分别为:22 02 23 25 21 10 21)

随机选号:(选中的号码分别为:29 21 02 06 05 14 04)

3.管理员登录:

手动设置中奖号码:

自动设置中奖号码:

4.获奖:

未获奖:

六.反思与总结 收获:

1.这次课程设计最大的感触就是GUI图形界面的编写,基本上所有的代码语句都需要通过图形界面语句相连接,这是一个具有挑战性的作业,但是在不断学习之后成功将本系统的界面能够比较流畅的显示出来; 2.学会了使用git仓库进行代码的管理,将代码上传到码云,方便程序员对代码间的沟通交流,提高代码的利用率;

不足:

1.对于GUI整体界面来说,还是比较粗糙的; 2.代码比较冗余,接下来可以根据事实逻辑等将冗余的代码分包分类进行整改。

3.代码的安全性不足,可通过将密码设置更加复杂,用密文存储在文档中,增加用户数据的保密性。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3