需求:
随机生成一组中奖号码
投注号码由6个红色球号码和1个蓝色球号码组成。
红色球号码从 1-33 中选择;蓝色球号码从 1-16 中选择。
分析:
实现:
1. 定义打印双色球中奖条件和奖金表的方法bonusTable,无返回值,无形参
2. 调用bonusTable方法,打印输出双色球中奖条件和奖金表
3. 定义用于返回一组中奖号码的方法createLuckNumbers,返回值类型是一个整型数组,无形参
4. 在方法内:
(4.1) 动态初始化一个数组,用于存储7个中奖号码
(4.2) 创建一个随机数对象,用于随机生成一个中奖号码
(4.3) 定义for循环,依次将随机生成的6个中奖号码 (红色球) 存入数组中:
(4.3.1) 为当前位置找出一个不重复的1-33之间的数字:
(1) 定义while循环,直到找到不重复的数字为止:
(2) 调用随机数功能,随机生成一个1-33之间的数字并用变量接收
(3) 判重:立一个flag,默认认为随机生成的这个数在数组中不存在
(4) 定义for循环,在循环内做判断:随机生成的这个数 是否 存在数组中,是则打翻flag,判断为flase,
表示这个数存在数组中,使用break跳出当前循环,重新随机生成一个中奖号码,直到不重复为止,才能存入数组
(5) 不是则flag成立,判断为true,表示这个数不存在数组中,能存入数组,使用break跳出当前循环,
继续找下一个不重复的数
(4.4) 6个红色球号码生成完毕后,开始随机生成1个1-16之间的中奖号码 (蓝色球) 存入数组中
(4.5) 返回拥有7个中奖号码(6个红色球+1个蓝色球)的数组
5. 调用createLuckNumbers方法,并用对应类型的变量接收这些中奖号码
用户输入一组双色球号码
分析:
实现:
6. 定义用于返回一组用户录入号码的方法userInputNumbers,返回值类型是一个整型数组,无形参
7. 在方法内:
(7.1) 动态初始化一个数组,用于存储7个用户录入的号码
(7.2) 创建一个键盘录入对象,用于用户录入号码
(7.3) 定义for循环,依次让用户录入6个红色球号码,存入数组中:
(7.3.1) 定义while循环,如果录入的当前号码与数组中的号码重复 或者 不在1-33之间时,则重新录入当前号码
(1) 调用键盘录入功能,用户录入号码并用变量接收
(2) 判断用户录入的号码 是否在1-33之间:
a: 是,则立一个flag,默认认为该号码不存在于数组;
定义for循环,在循环内判断:该号码是否存在于数组,是则打翻flag,判断为flase,表示该号码不能存入数组,使用break跳出当前循环,让用户重新录入;
b: 不是,则flag成立,判断为true,表示这个号码不存在于数组,可以存入数组,使用break跳出当前循环,用户继续录入一个不重复的号码。
不是,则提示“抱歉~号码错误!”,用户继续重新录入当前号码。
(7.4) 6个红色球号码录入完毕后,用户开始录入1个1-16之间的蓝色球号码存入数组
(1) 定义while循环,如果录入的当前号码不在1-16之间时,则重新录入当前号码
(2) 判断用户录入的号码 是否在1-16之间:
a: 是,则录入1个蓝色球号码并存入数组,使用break跳出当前循环;
b: 不是,则提示“抱歉~号码错误!”,用户继续重新录入当前号码。
(7.5) 返回拥有用户录入的7个号码(6个红色球+1个蓝色球)的数组
8. 定义打印数组的方法printArray,无返回值,设置一个形参:int[] arr ——> 用于接收传入的数组
(8.1) 定义for循环,遍历数组,输出号码
(8.2) 输出时,使用三元运算符判断当前号码 在数组中是不是为最后一个号码,是则不需要用空格隔开,不是则需要用空格隔开
9. 调用userInputNumbers方法,并用对应类型的变量接收这些录入的号码
判断中奖情况
分析:
实现:
10. 定义判断中奖的方法judge,无返回值,设置两个形参:int[] luckNumbers, int[] userNumbers ——>用于接收传入的中奖号码数组、用户选号数组
11. 在方法内:
(11.1) 定义2个变量,用于分别记录红色球中奖次数、蓝色球中奖次数;
判断红色球命中:
(11.2) 定义for循环遍历取出用户选号数组的号码:
(11.2.1) 定义for循环遍历取出中奖数组的号码:
判断红色球命中次数:
当用户选的号码 == 中奖号码时,叠加红色球中奖次数的变量的值;
使用break跳出当前循环
判断蓝色球命中:
(11.3) 使用三元运算符判断:
当luckNumbers最后一个位置的号码 == userNumbers最后一个位置的号码时,判断为true,蓝色球中奖次数为1,
否则为flase,蓝色球中奖次数为0
(11.4) 定义if分支判断:
如果红色球中奖次数为6 且 蓝色球中奖次数为1
则为一等奖,奖金最高1000万
红为6 且 蓝为0
则为二等奖,奖金最高500万
红为5 且 蓝为1
则为三等奖,奖金最高3000元
(红为5 且 蓝为0) 或 (红为4 且 蓝为1)
则为四等奖,奖金最高200元
(红为4 且 蓝为0) 或 (红为3 且 蓝为1)
则为五等奖,奖金最高10元
(红为2 且 蓝为1) 或 (红为1 且 蓝为1) 或 (红为0 且 蓝为1)
则为六等奖,奖金最高5元
否则就是未中奖
12. 调用judge方法,将中奖号码数组、用户选号数组传入形参:int[] luckNumbers、int[] userNumbers
最终实现:
package com.app.demo;
import java.util.Random;
import java.util.Scanner;
/**
案例七:双色球系统开发
需求:
- 随机生成一组中奖号码
- 投注号码由6个红色球号码和1个蓝色球号码组成。
- 红色球号码从 1-33 中选择;蓝色球号码从 1-16 中选择。
分析:
- 中奖号码由6个红球和1个篮球组成(注意:6个红球要求不能重复)。
- 定义方法用于返回一组中奖号码(7个数),返回值类型是一个整型数组。
*/
public class Test7 {
public static void main(String[] args) {
// 2. 调用bonusTable方法,打印输出双色球中奖条件和奖金表
bonusTable();
System.out.println();
// 5. 调用createLuckNumber方法,并用对应类型的变量接收这些中奖号码
int[] luckNumbers = createLuckNumbers();
// 9. 调用userInputNumbers方法,并用对应类型的变量接收这些录入的号码
int[] inputNumbers = userInputNumbers();
// 12. 调用judge方法,将中奖号码数组、用户选号数组传入形参:int[] luckNumbers、int[] userNumbers
judge(luckNumbers, inputNumbers);
}
// 1. 定义打印双色球中奖条件和奖金表的方法bonusTable,无返回值,无形参
public static void bonusTable() {
System.out.println("\t\t\t\t\t双色球中奖条件和奖金表");
System.out.println("——————————————————————————————————————————————————————————————————");
System.out.println("奖励等级\t\t\t中奖说明\t\t\t\t\t中奖条件\t\t\t单注奖金分配");
System.out.println("——————————————————————————————————————————————————————————————————");
System.out.println("一等奖\t\t6个红色球\t1个蓝色球\t\t6+1\t\t\t\t最高1000万");
System.out.println("——————————————————————————————————————————————————————————————————");
System.out.println("二等奖\t\t6个红色球\t0个蓝色球\t\t6+0\t\t\t\t最高500万");
System.out.println("——————————————————————————————————————————————————————————————————");
System.out.print("三等奖\t\t5个红色球\t1个蓝色球\t\t5+1\t\t\t\t最高3000元");
System.out.println("\n——————————————————————————————————————————————————————————————————");
System.out.println("四等奖\t\t5个红色球\t0个蓝色球\t\t5+0\t\t\t\t最高200元");
System.out.print("\t\t\t4个红色球\t1个蓝色球\t\t4+1");
System.out.println("\n——————————————————————————————————————————————————————————————————");
System.out.println("五等奖\t\t4个红色球\t0个蓝色球\t\t4+0");
System.out.println("\t\t\t3个红色球\t1个蓝色球\t\t3+1\t\t\t\t最高10元");
System.out.print("\t\t\t2个红色球\t1个蓝色球\t\t2+1");
System.out.println("\n——————————————————————————————————————————————————————————————————");
System.out.println("六等奖\t\t1个红色球\t1个蓝色球\t\t1+1\t\t\t\t最高5元");
System.out.print("\t\t\t0个红色球\t1个蓝色球\t\t0+1");
}
// 3. 定义一个用于返回一组中奖号码的方法createLuckNumber,返回值类型是一个整型数组,无形参
public static int[] createLuckNumbers() {
// 4. 在方法内:
// (4.1) 动态初始化一个数组,用于存储7个中奖号码
int[] luckNumbers = new int[7];
// (4.2) 创建一个随机数对象,用于随机生成一个中奖号码
Random rd = new Random();
// (4.3) 定义for循环,依次将随机生成的6个中奖号码 (红色球) 存入数组中:
// 这里的数组长度-1 ————> 表示 7-1 = 6
for (int i = 0; i < luckNumbers.length - 1; i++) {
// (4.3.1) 为当前位置找出一个不重复的1-33之间的数字:
// (1) 定义while循环,直到找到不重复的数字为止:
while (true) {
// (2) 调用随机数功能,随机生成一个1-33之间的数字并用变量接收
int lucknumber = rd.nextInt(33) + 1; // 1-33 ————> (0-32) + 1
// (3) 判重:立一个flag,默认认为随机生成的这个数在数组中不存在
boolean flag = true;
// (4) 定义for循环
for (int j = 0; j < i; j++) {
// 在循环内做判断:随机生成的这个数 是否 存在数组中,
if (lucknumber == luckNumbers[j]) {
// 是则打翻flag,判断为flase,表示这个数存在数组中,
flag = false;
// 使用break跳出当前循环,重新随机生成一个中奖号码,直到不重复为止,才能存入数组
break;
}
}
// (5) 不是则flag成立,判断为true,
if (flag) {
// 表示这个数不存在数组中,能存入数组,
luckNumbers[i] = lucknumber;
// 使用break跳出当前循环,继续找下一个不重复的数
break;
}
}
}
// (4.4) 6个红色球号码生成完毕后,开始随机生成1个1-16之间的中奖号码 (蓝色球) 存入数组中
// 这里的数组长度-1 ————> 表示数组最后一个元素
luckNumbers[luckNumbers.length - 1] = rd.nextInt(16) + 1; // 1-16 ————> (0-15) + 1
// (4.5) 返回拥有7个中奖号码(6个红色球+1个蓝色球)的数组
return luckNumbers;
}
// 6. 定义用于返回一组用户录入号码的方法userInputNumbers,返回值类型是一个整型数组,无形参
public static int[] userInputNumbers() {
// 7. 在方法内:
// (7.1) 动态初始化一个数组,用于存储7个用户录入的号码
int[] inputNumbers = new int[7];
// (7.2) 创建一个键盘录入对象,用于用户录入号码
Scanner sc = new Scanner(System.in);
System.out.println();
// (7.3) 定义for循环,依次让用户录入6个红色球号码,存入数组中:
for (int i = 0; i < inputNumbers.length - 1; i++) {
// (7.3.1) 定义while循环,如果录入的当前号码与数组中的号码重复时,则重新录入当前号码
while (true) {
// (1) 调用键盘录入功能,用户录入号码并用变量接收
System.out.print("请猜猜第" + (i+1) + "个红色球号码是(1-33): ");
int inputNumber = sc.nextInt();
// (2) 判断用户录入的号码 是否在1-33之间:
if (inputNumber > 0 && inputNumber <= 33) {
// a: 是,立一个flag,默认认为该号码不存在于数组;
boolean flag = true;
// 定义for循环,在循环内判断:该号码是否存在于数组,
for (int j = 0; j < i; j++) {
if (inputNumber == inputNumbers[j]) {
// 是则打翻flag,判断为flase,表示该号码不能存入数组,
flag = false;
System.out.println("抱歉~号码重复!");
// 使用break跳出当前循环,让用户重新录入;
break;
}
}
// b: 不是,则flag成立,判断为true,
if (flag) {
// 表示这个号码不存在于数组,可以存入数组,
inputNumbers[i] = inputNumber;
// 使用break跳出当前循环,用户继续录入一个不重复的号码。
break;
}
} else {
// 不是,则提示“抱歉~号码错误!”,用户继续重新录入当前号码。
System.out.println("抱歉~号码错误!");
}
}
}
// (7.4) 6个红色球号码录入完毕后,用户开始录入1个1-16之间的蓝色球号码存入数组
// (1) 定义while循环,如果录入的当前号码不在1-16之间时,则重新录入当前号码
while (true) {
System.out.print("请猜猜蓝色球号码是(1-16): ");
// 这里的数组长度-1 ————> 表示 7-1 = 6,为数组的最后一个元素
int inputNumber2 = sc.nextInt();
// (2) 判断用户录入的号码 是否在1-16之间:
if (inputNumber2 > 0 && inputNumber2 <= 16) {
// a: 是,则录入1个蓝色球号码并存入数组,
inputNumbers[inputNumbers.length-1] = inputNumber2;
// 使用break跳出当前循环;
break;
} else {
// b: 不是,则提示“抱歉~号码错误!”,不跳出循环,让用户重新录入当前号码。
System.out.println("抱歉~号码错误!");
}
}
// (7.5) 返回拥有用户录入的7个号码(6个红色球+1个蓝色球)的数组
return inputNumbers;
}
// 8. 定义打印数组的方法printArray,无返回值,设置一个形参:int[] arr ——> 用于接收传入的数组
public static void printArray(int[] arr) {
// (8.1) 定义for循环,遍历数组,输出号码
for (int i = 0; i < arr.length; i++) {
// (8.2) 输出时,使用三元运算符判断当前号码 在数组中是不是为最后一个号码,是则不需要用空格隔开,不是则需要用空格隔开
System.out.print(i == arr.length - 1 ? "蓝" + arr[i] : "红" + arr[i] + " ");
}
}
// 10. 定义判断中奖的方法judge,无返回值,
// 设置两个形参:int[] luckNumbers, int[] userNumbers ——>用于接收传入的中奖号码数组、用户选号数组
public static void judge(int[] luckNumbers, int[] userNumbers) {
// 11. 在方法内:
// (11.1) 定义2个变量,用于分别记录红色球中奖次数、蓝色球中奖次数;
int redBallHits = 0;
int blueBallHits = 0;
// 判断红色球命中:
// (11.2) 定义for循环遍历取出用户选号数组的号码:
// 这里的数组长度-1 ——> 表示只遍历数组的前6个位置的号码,也就是只遍历红色球号码
for (int i = 0; i < userNumbers.length - 1; i++) {
// (11.2.1) 定义for循环遍历取出中奖数组的号码:
for (int j = 0; j < luckNumbers.length - 1; j++) {
// 判断红色球命中次数:
if (userNumbers[i] == luckNumbers[j]) { // 当用户选的号码 == 中奖号码时,
// 叠加红色球中奖次数的变量的值;
redBallHits++;
// 使用break跳出当前循环
break;
}
// 判断蓝色球命中:
// (11.3) 使用三元运算符判断:
// 当luckNumbers最后一个位置的号码 == userNumbers最后一个位置的号码时,判断为true,蓝色球中奖次数为1,
// 否则为flase,蓝色球中奖次数为0
// 这里的数组长度-1 ——> 表示为数组的最后一个号码,也就是蓝色球号码
blueBallHits = luckNumbers[luckNumbers.length-1] == userNumbers[userNumbers.length-1] ? 1 : 0;
}
}
// (11.4) 输出双色球号码、用户投注的号码、红蓝球各命中情况
System.out.print("\n双色球号码: ");
printArray(luckNumbers);
System.out.print("\n您投注的号码: ");
printArray(userNumbers);
System.out.println("\n您红色球命中: " + redBallHits + "个");
// 使用三元运算符判断蓝色球是否命中
System.out.println("您蓝色球" + (blueBallHits == 1 ? "已命中!" : "未命中!") );
// (11.5) 定义if分支判断:
if (redBallHits == 6 && blueBallHits == 1) { // 如果红色球中奖次数为6 且 蓝色球中奖次数为1
// 则为一等奖,奖金最高1000万
System.out.println("恭喜您!中了一等奖~ 奖金1000万已入账~~");
} else if (redBallHits == 6 && blueBallHits == 0) { // 红为6 且 蓝为0
// 则为二等奖,奖金最高500万
System.out.println("恭喜您!中了二等奖~ 奖金500万已入账~~");
} else if (redBallHits == 5 && blueBallHits == 1) { // 红为5 且 蓝为1
// 则为三等奖,奖金最高3000元
System.out.println("恭喜您!中了三等奖~ 奖金3000元已入账~~");
} else if ( (redBallHits == 5 && blueBallHits == 0) || (redBallHits == 4 && blueBallHits == 1) ) {
// (红为5 且 蓝为0) 或 (红为4 且 蓝为1)
// 则为四等奖,奖金最高200元
System.out.println("恭喜您!中了四等奖~ 奖金200元已入账~~");
} else if ( (redBallHits == 4 && blueBallHits == 0) || (redBallHits == 3 && blueBallHits == 1)) {
// (红为4 且 蓝为0) 或 (红为3 且 蓝为1)
// 则为五等奖,奖金最高10元
System.out.println("恭喜您!中了五等奖~ 奖金10元已入账~~");
} else if (redBallHits <3 && blueBallHits == 1) {
// (红为2 且 蓝为1) 或 (红为1 且 蓝为1) 或 (红为0 且 蓝为1)
// 这里红为 2、1、0,小于3;蓝都为1
// 则为六等奖,奖金最高5元
System.out.println("恭喜您!中了六等奖~ 奖金5元已入账~~");
}else { // 否则就是未中奖
System.out.println("感谢您为福利事业作出的伟大贡献!!");
}
}
}
输出结果:
双色球中奖条件和奖金表
——————————————————————————————————————————————————————————————————
奖励等级 中奖说明 中奖条件 单注奖金分配
——————————————————————————————————————————————————————————————————
一等奖 6个红色球 1个蓝色球 6+1 最高1000万
——————————————————————————————————————————————————————————————————
二等奖 6个红色球 0个蓝色球 6+0 最高500万
——————————————————————————————————————————————————————————————————
三等奖 5个红色球 1个蓝色球 5+1 最高3000元
——————————————————————————————————————————————————————————————————
四等奖 5个红色球 0个蓝色球 5+0 最高200元
4个红色球 1个蓝色球 4+1
——————————————————————————————————————————————————————————————————
五等奖 4个红色球 0个蓝色球 4+0 最高10元
3个红色球 1个蓝色球 3+1
——————————————————————————————————————————————————————————————————
六等奖 2个红色球 1个蓝色球 2+1 最高5元
1个红色球 1个蓝色球 1+1
0个红色球 1个蓝色球 0+1
请猜猜第1个红色球号码是(1-33): 12
请猜猜第2个红色球号码是(1-33): 5
请猜猜第3个红色球号码是(1-33): 16
请猜猜第4个红色球号码是(1-33): 28
请猜猜第5个红色球号码是(1-33): 33
请猜猜第6个红色球号码是(1-33): 14
请猜猜蓝色球号码是(1-16): 8
双色球号码: 红8 红25 红7 红27 红17 红20 蓝3
您投注的号码: 红12 红5 红16 红28 红33 红14 蓝8
您红色球命中: 0个
您蓝色球未命中!
感谢您为福利事业作出的伟大贡献!!