一、需求背景
实现一个简化版双色球抽奖系统,规则如下:
- 号码生成规则:
- 红球:6个不重复的1-33的整数
- 蓝球:1个1-16的整数(可与红球重复)
- 用户输入:手动输入6红+1蓝号码
- 中奖规则:
红球匹配数 蓝球匹配 奖金 6 1 1000万 6 0 500万 5 1 3000元 5/4 0/1 200元/10元 ≤2 1 5元
二、代码逐模块解析
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元!
五、优化方向(下篇预告)
在《双色球系统增强版》中将实现:
- 红球生成优化:
- 使用
HashSet
避免重复值的低效检查 - 生成号码排序输出
- 使用
- 输入增强:
- 非数字输入异常处理
- 历史投注记录保存
- 奖金池配置化:
- 从配置文件读取中奖规则
- 可视化界面:
- 使用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实战 #抽奖系统 #算法设计 #编程教学
点赞关注,获取下篇增强版实现! 🎱🔴🔵