面向对象程序设计——福利彩票36选7系统

福利彩票36选7系统

一、项目简介

功能描述

该系统是一个彩票购买抽奖系统,该系统可以完成用户的注册、登录、充值等功能,在用户进行购彩时,可以选择投注数以及选择手动选号或是随机选号,管理员也可以选择手动或随机设置中奖号码。若用户中奖,则在下次登录时显示中奖信息,并可以领取奖金。

表格

项目

内容

团队博客链接

https://blog.csdn.net/Qiannunu/article/details/135516817

个人负责任务

  1. 管理员登录时验证身份
  2. 管理员可以手动或随机设置中奖号码
  3. 管理员登录可查看中奖用户的信息及中奖号码
  4. 保存用户购买的彩票信息

二、功能架构图

fb19328c3318485ab732db12a02382e5

三、个人任务简述

小组成员及分工

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

1. 完成的任务与功能

序号

完成功能与任务

描述

1

管理员登录

通过比较传入的管理员用户名和密码与预设的管理员用户名和密码进行验证。

2

面向对象设计

使用了面向对象技术设计系统。

3

管理员设置中奖号码

管理员可以选择手动或是随机生成中奖号码,并使用Swing的多线程机制,完成了滚动显示中奖号码的功能。

4

管理员查看中奖用户信息及中奖号码

管理员在生成中奖号码后,界面上随即出现中奖号码及中奖用户信息

5

保存用户的彩票信息

将用户的彩票号码和中奖信息保存到对应用户的彩票文件中

2. Git提交记录截图

git链接:福利彩票36选7抽奖系统: 基于java的福利彩票抽奖系统 (gitee.com)

d15cae0bf83c7231995a639e5673663

四、代码展示

Rolling类

主要完成滚动抽奖,显示抽奖结果,判断抽出的中将号码是否合法的功能。

点击查看代码
package Admin;

import java.util.Random;
import javax.swing.*;

import java.awt.BorderLayout;

//负责实现彩票抽奖的逻辑,包括生成中奖号码、比对用户选择的号码等


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;
  		
  	}

  
}

NumbersRecord类

主要完成将用户抽取的号码保存到文件和从文件中提取当前用户抽取的号码到队列里的功能。每个文件以用户名位文件名,保存对应用户抽取的所有号码和对应的获奖情况。

点击查看代码
package record;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

//彩票记录类
//保存彩票号码和中将信息

public class NumbersRecord {

    private static final String NUMBER_RECORDS_FILE = "_number_records.txt";
   // private static final String WINNING_RECORDS_FILE = "winning_records.txt";
 // 将新彩票加入List<String> numbers
    public static void addNumberstoList(List<String> numbers, List<String> newNumbers) {
        for (String newNumber : newNumbers) {
            numbers.add(newNumber + "," + "未获奖");
        }
    }

   // 将新彩票保存到对应用户的彩票文件中
   public static void saveNumbersToFile(String username, List<String> newNumbers) {
       try (BufferedWriter writer = new BufferedWriter(new FileWriter(username + NUMBER_RECORDS_FILE, true))) {
           for (String newNumber : newNumbers) {
               writer.write(newNumber + "," + "未获奖");
               writer.newLine();
           }
       } catch (IOException e) {
           e.printStackTrace();
       }
   }

   // 将彩票信息从文件中读到List
   public static List<String> fileToList(String username){
       List<String> numbers = new ArrayList<>();
       try(BufferedReader reader=new BufferedReader(new FileReader(username+NUMBER_RECORDS_FILE))){
           String line;
           while((line=reader.readLine())!=null){
               System.out.println(line);
               numbers.add(line);
           }
      }catch(IOException e){
          e.printStackTrace();  
      }
      return numbers; 
  }

  // 将彩票信息从List中读到文件,并覆盖原有内容
  public static void listToFile(List<String> numbers, String username) {
      try (BufferedWriter writer = new BufferedWriter(new FileWriter(username+NUMBER_RECORDS_FILE))) {
          for (String number : numbers) {
              writer.write(number);
              writer.newLine();
          }
     } catch (IOException e) { 
         e.printStackTrace(); 
     }
  }
}


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");
	    }
}

五、运行结果

系统界面

用户注册

用户登录

充值

用户选号

用户查看已选号码

管理员登录并抽奖

用户登录后提醒中将并领取奖金

 

 

posted @ 2024-01-12 05:38  刘倩_网安2211  阅读(27)  评论(0编辑  收藏  举报