《Java实战:双色球抽奖系统实现与代码解析》

0 阅读3分钟

一、需求背景

实现一个简化版双色球抽奖系统,规则如下:

  1. 号码生成规则
    • 红球:6个不重复的1-33的整数
    • 蓝球:1个1-16的整数(可与红球重复)
  2. 用户输入:手动输入6红+1蓝号码
  3. 中奖规则
    红球匹配数蓝球匹配奖金
    611000万
    60500万
    513000元
    5/40/1200元/10元
    ≤215元

二、代码逐模块解析

1. 主程序逻辑

public static void main(String[] args) {
    // 生成中奖号码
    int[] redBalls = getRedBallNumberHandle();   // 6红球
    int blueBall = getBlueNumberHandle();        // 1蓝球
    
    // 合并中奖号码数组
    int[] winningNumbers = new int[7];
    System.arraycopy(redBalls, 0, winningNumbers, 0, 6);
    winningNumbers[6] = blueBall;
    
    // 用户输入号码并验证
    int[] userNumbers = userInputColorNumberHandle();
    int[] matchResult = verifyHandle(winningNumbers, userNumbers);
    
    // 输出中奖结果
    System.out.println(getResult(matchResult));
}
  • 流程控制:协调号码生成、用户输入、验证和结果输出模块

2. 红球生成模块

public static int[] getRedBallNumberHandle() {
    int[] redBalls = new int[6];
    Random rand = new Random();
    for(int i=0; i<6; ) {  // 注意循环变量控制
        int num = rand.nextInt(33) + 1;
        boolean isDuplicate = false;
        // 检查重复
        for(int j=0; j<i; j++) {
            if(redBalls[j] == num) {
                isDuplicate = true;
                break;
            }
        }
        if(!isDuplicate) {  // 无重复时存入数组
            redBalls[i] = num;
            i++;
        }
    }
    return redBalls;
}
  • 关键设计
    • 通过嵌套循环检查重复值
    • 仅当号码唯一时递增索引

3. 蓝球生成模块

public static int getBlueNumberHandle() {
    return new Random().nextInt(16) + 1; // 1-16随机数
}
  • 直接生成:无需去重处理

4. 用户输入模块

public static int[] userInputColorNumberHandle() {
    int[] userNums = new int[7];
    Scanner sc = new Scanner(System.in);
    
    // 输入红球
    for(int i=0; i<6; ) {
        System.out.print("请输入第"+(i+1)+"个红球(1-33):");
        int num = sc.nextInt();
        if(num >=1 && num <=33) {
            userNums[i] = num;
            i++;
        } else {
            System.out.println("输入错误!");
        }
    }
    
    // 输入蓝球
    while(true) {
        System.out.print("请输入蓝球(1-16):");
        int num = sc.nextInt();
        if(num >=1 && num <=16) {
            userNums[6] = num;
            break;
        }
        System.out.println("输入错误!");
    }
    return userNums;
}
  • 输入验证:严格限制红球和蓝球范围

5. 号码验证模块

public static int[] verifyHandle(int[] winning, int[] user) {
    int redMatch = 0;
    int blueMatch = 0;
    
    // 红球匹配检查
    for(int i=0; i<6; i++) {
        for(int j=0; j<6; j++) {
            if(winning[i] == user[j]) {
                redMatch++;
                break;
            }
        }
    }
    
    // 蓝球匹配检查
    if(winning[6] == user[6]) blueMatch = 1;
    
    return new int[]{redMatch, blueMatch};
}
  • 双重循环:时间复杂度O(n²),适用于小数据量

6. 结果判定模块

public static String getResult(int[] result) {
    int red = result[0], blue = result[1];
    if(red ==6 && blue ==1) return "一等奖:1000万";
    else if(red ==6) return "二等奖:500万";
    else if(red ==5 && blue ==1) return "三等奖:3000元";
    else if((red ==5) || (red ==4 && blue ==1)) return "四等奖:200元";
    else if((red ==4) || (red ==3 && blue ==1)) return "五等奖:10元";
    else if(blue ==1) return "六等奖:5元";
    else return "未中奖";
}
  • 阶梯判断:按中奖规则逐级匹配

三、完整代码示例

package com.insightfuture.test;

import java.util.Random;
import java.util.Scanner;

public class DoubleColorBall {
    public static void main(String[] args) {
        int[] redBalls = getRedBallNumberHandle();
        int blueBall = getBlueNumberHandle();
        int[] winningNumbers = mergeNumbers(redBalls, blueBall);
        int[] userNumbers = userInputColorNumberHandle();
        int[] matchResult = verifyHandle(winningNumbers, userNumbers);
        System.out.println(getResult(matchResult));
    }

    // 其他方法同上文解析,此处省略以节省篇幅
}

四、运行示例

请输入第1个红球(1-33):5
请输入第2个红球(1-33):12
...
请输入蓝球(1-16):9
中奖号码:17 23 5 8 11 29 + 9
您的号码:5 12 18 22 29 30 + 9
匹配结果:红球2个 + 蓝球1个
恭喜你,中奖5元!

五、优化方向(下篇预告)

在《双色球系统增强版》中将实现:

  1. 红球生成优化
    • 使用HashSet避免重复值的低效检查
    • 生成号码排序输出
  2. 输入增强
    • 非数字输入异常处理
    • 历史投注记录保存
  3. 奖金池配置化
    • 从配置文件读取中奖规则
  4. 可视化界面
    • 使用Swing开发图形界面

预览代码片段

// 使用Set去重
Set<Integer> redSet = new HashSet<>();
while(redSet.size() <6) {
    redSet.add(rand.nextInt(33)+1);
}

// 读取配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("prize.conf"));
String prize1 = prop.getProperty("first_prize"); 

#Java实战 #抽奖系统 #算法设计 #编程教学
点赞关注,获取下篇增强版实现! 🎱🔴🔵