基于彩票选号系统的改善与重构

(1)来源:源于舍友上学期期末java框架设计编程的大作业自编系统
(2)1.运行环境:Eclipse
2.运行结果:

点击查看代码
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/LotteryServlet")
public class LotteryServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final int NUMBER_COUNT = 7;
    private static final int NUMBER_RANGE = 30;
    protected static final List<int[]> history = new ArrayList<>(); // 存储历史中奖号码
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
 
        // 生成随机中奖号码
        int[] winningNumbers = generateWinningNumbers();
        history.add(winningNumbers); // 将新中奖号码添加到历史记录中
 
        // 获取用户选择的号码
        int[] userNumbers = new int[NUMBER_COUNT];
        try {
            for (int i = 0; i < NUMBER_COUNT; i++) {
                userNumbers[i] = Integer.parseInt(request.getParameter("number" + (i + 1)));
            }
        } catch (NumberFormatException e) {
            out.println("输入无效,请输入1到30之间的整数。");
            return;
        }
 
        // 判断中奖情况
        int matchCount = countMatches(winningNumbers, userNumbers);
        String resultMessage;
        switch (matchCount) {
            case 7:
                resultMessage = "恭喜你,中了一等奖!";
                break;
            case 6:
                resultMessage = "恭喜你,中了二等奖!";
                break;
            case 5:
                resultMessage = "恭喜你,中了三等奖!";
                break;
            default:
                resultMessage = "很遗憾,未中奖。";
        }
 
        // 显示结果
        out.println("<html><body>");
        out.println("<h1>彩票结果</h1>");
        out.println("<p>中奖号码: " + Arrays.toString(winningNumbers) + "</p>");
        out.println("<p>你选择的号码: " + Arrays.toString(userNumbers) + "</p>");
        out.println("<p>" + resultMessage + "</p>");
        out.println("<a href='index.html'>返回重新选择</a>");
        out.println("</body></html>");
    }

    protected int[] generateWinningNumbers() {
        Set<Integer> numberSet = new HashSet<>();
        Random random = new Random();
        while (numberSet.size() < NUMBER_COUNT) {
            numberSet.add(random.nextInt(NUMBER_RANGE) + 1);
        }
        int[] winningNumbers = new int[NUMBER_COUNT];
        int i = 0;
        for (Integer number : numberSet) {
            winningNumbers[i++] = number;
        }
        Arrays.sort(winningNumbers);
        return winningNumbers;
    }

   protected int countMatches(int[] winningNumbers, int[] userNumbers) {
        Set<Integer> winningSet = new HashSet<>();
        for (int number : winningNumbers) {
            winningSet.add(number);
        }

        int matchCount = 0;
        for (int number : userNumbers) {
            if (winningSet.contains(number)) {
                matchCount++;
            }
        }
        return matchCount;
    }
}

![](https://img2024.cnblogs.com/blog/3607098/202502/3607098-20250221152607105-355765872.png)

(3)主要问题列表:
在原有的彩票选号之中,只能获取当期的中奖编号,但是无法对其进行保存以方便之后对此进行直观的查询,缺失存储性能。
(4)新代码附上:
构筑了一个存储调用功能,可以记录每一次的中奖号码进入一个文本之中,在需要的时候可以对此提取并展示在网页之中。

点击查看代码
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/HistoryServlet")
public class HistoryServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
 
        out.println("<html><body>");
        out.println("<h1>中奖历史记录</h1>");
        out.println("<ul>");
        for (int[] numbers : LotteryServlet.history) {
            out.println("<li>" + Arrays.toString(numbers) + "</li>");
        }
        out.println("</ul>");
        out.println("<a href='index.html'>返回选号页面</a>");
        out.println("</body></html>");
    }
}
(5)重构的软件测试截图: ![](https://img2024.cnblogs.com/blog/3607098/202502/3607098-20250221152247880-64244270.png) ![](https://img2024.cnblogs.com/blog/3607098/202502/3607098-20250221152253660-593147907.png)

(6)总结:
1.难点:由于是别人的代码,在最初需要花费一定时间理解其代码各项所指,并且构思可以改进的地方,并且由于系统本来已经完善,需要添加新的功能就要改动原有的设置并不能因此导致原有功能无法运行,十分考验对新功能的构思与实现。
2.测试阶段花费时间尤其久,需要不断对错误进行分析并且已正确的方式对此进行更正,更正后也不一定能实现对应要求,还可能使原有已经完善的功能出错,因此需要大量的更改。

posted @ 2025-02-27 22:19  AmnesiaAway  阅读(44)  评论(0)    收藏  举报