Java从入门到精通 - 案例专题
专题课 - 编程案例
此笔记参考黑马教程,仅学习使用,如有侵权,联系必删
文章目录
- 专题课 - 编程案例
- 案例一:买飞机票
- 代码实现
- 总结
- 案例二:开发验证码
- 代码实现
- 总结
- 案例三:评委打分
- 代码演示
- 总结
- 案例四:数字加密
- 代码实现
- 总结
- 案例五:数组拷贝
- 代码实现
- 总结
- 案例六:抢红包
- 代码演示
- 总结
- 案例七:找素数
- 拓展知识点、
- 代码实现
- 第一种
- 第二种(简化版)
- 第三种(更简单的)
- 总结
- 案例八:打印九九乘法表、三角形
- 打印九九乘法表
- 代码实现
- 打印三角形
- 代码实现
- 案例九:模拟双色球【拓展案例】
- 第一步:业务分析、用户投注一组号码
- 代码实现
- 总结
- 第二步:随机生成一组中奖号码
- 代码实现
- 总结
- 第三步:判断中奖情况
- 总结
- 代码实现
-
目的1:复习前面学过的编程知识,能够利用所学的知识解决问题
- 变量、数组
- 运算符:+ - * / 、== >= 、&& 、|| 、!
- 程序流程控制:if、switch;for、while、死循环 …
- 跳转关键字:break、continue、return
- 方法
-
目的2:积攒代码量,以训练并提升编程能力、编程思维
- 编程思维:使用所学的编程技术解决问题的思维方式和编写代码实现出来的能力
- 提升编程思维和编程能力的建议
- 编程思维、编程能力不是一朝一夕形成的,需要大量思考、练习和时间的沉淀
- 具体措施:前期,建议先模仿;后期,自然而然就能创新了;勤于练习代码,勤于思考,熟能生巧
案例一:买飞机票
需求:
用户购买机票时,机票原价会按照淡季、旺季,头等舱还是经济舱的情况进行相应的优惠,优惠方案如下:
- 5-10月为旺季,头等舱9折,经济舱8.5折;
- 11月到来年4月为淡季,头等舱7折,经济舱6.5折;
请开发程序计算出用户当前机票的优惠价
分析:
- 方法是否需要接收数据?需要接收机票原价、当前月份、舱位类型
- 方法是否需要返回数据?需要返回计算出的机票优惠价
- 方法内部:先使用 if 判断月份是旺季还是淡季,然后使用 switch 分支判断是头等舱还是经济舱
代码实现
package l_caseexercise;public class a_Test1 {public static void main(String[] args) {// 目标:完成买飞机票的案例double price = calculate(1000, 8, "经济舱");double price2 = calculate(1000, 11, "头等舱");System.out.println("优惠价是:" + price); // 优惠价是:850.0System.out.println("优惠价是:" + price2); // 优惠价是:700.0}public static double calculate(double price, int month, String type) {// 1. 判断当前月份是淡季还是旺季if (month >= 5 && month <= 10) {// 旺季// 2. 判断舱位类型switch (type) {case "头等舱":price *= 0.9;//price = price * 0.9;break;case "经济舱":price *= 0.85;break;}} else {// 淡季switch (type) {case "头等舱":price *= 0.7;//price = price * 0.7;break;case "经济舱":price *= 0.65;break;}}return price;}
}
总结
- 遇到需要通过判断数据在哪个区间,来决定执行哪个业务,应该用什么实现?
- 应该使用 if 分支结构实现
- 遇到需要通过判断数据匹配哪个值,来决定执行哪个业务,应该用什么实现?
- 应该使用 switch 分支结构实现
案例二:开发验证码
需求:
开发一个程序,可以生成指定位数的验证码,每位可以是数字、大小写字母
分析:
- 方法是否需要接收数据?需要接收一个整数,控制生成验证码的位数
- 方法是否需要返回数据?需要返回生成的验证码
- 方法内部的业务:使用 for 循环依次生成每位随机字符,并使用一个 String 类型的变量把每个字符连接起来,最后返回该变量即可
代码实现
package l_caseexercise;import java.util.Random;public class b_Test2 {public static void main(String[] args) {// 目标:完成生成随机验证码System.out.println(createCode(5)); // mdaI0(随机的)}public static String createCode(int n) {// 1. 定义一个for循环用于控制产生多少位随机字符Random r = new Random();// 3. 定义一个String类型的变量用于记录产生的每位随机字符String code = "";for (int i = 1; i <= n; i++) {// i = 1 2 3 ... n// 2. 为每个位置生成随机字符,可能是数字、大小写字母// 思路:随机一个0 1 2之间的数字出来,0代表随机一个数字字符,1、2代表随机大写字母、小写字母int type = r.nextInt(3); // 0 1 2switch (type) {case 0:// 随机一个数字字符code += r.nextInt(10); // 0 - 9 code = code + 8break;case 1:// 随机一个大写字符 A 65 Z 65+25char ch1 = (char) (r.nextInt(26) + 65);code += ch1;break;case 2:// 随机一个小写字符 a 97 z 97+25char ch2 = (char) (r.nextInt(26) + 97);code += ch2;break;}}return code;}
}
总结
- 随机验证码的核心实现逻辑是如何进行的?
- 定义一个 for 循环,循环 n 次
- 随机生成0 | 1 | 2的数据,依次代表当前要生成的字符是:数字、大写字母、小写字母
- 把0、1、2交给 switch 生成对应类型的随机字符
- 在循环外定义一个 String 类型的变量用来连接生成的随机字符
- 循环结束后,返回 String 类型的变量即是生成的随机验证码
案例三:评委打分
需求:
在唱歌比赛中,可能有多名评委要给选手打分,分数是【0-100】之间的整数。选手最后得分为:去掉最高分、最低分后剩余分数的平均数,请编写程序能够录入多名评委的分数,并算出选手的最终得分
分析:
- 方法是否需要接收数据进行处理?需要接收评委的人数
- 方法是否需要返回数据?需要返回计算出的选手最终得分
- 方法内部的业务:定义数组,录入评委的分数存入到数组中,接着,我们就需要遍历数组中的分数,计算出总分,并找出最高分、最低分,最后按照这些数据算出选手最终得分并返回即可
代码演示
package l_caseexercise;import java.util.Scanner;public class c_Test3 {public static void main(String[] args) {// 目标:完成评委打分案例System.out.println("当前选手得分是:" + getAverageScore(6)); // 当前选手得分是:82.5}public static double getAverageScore(int number) {// 1. 定义一个动态初始化的数组,负责后期存入评委的打分int[] scores = new int[number];// 2. 遍历数组的每个位置,依次录入评委的分数Scanner sc = new Scanner(System.in);for (int i = 0; i < scores.length; i++) {System.out.println("请您录入第" + (i + 1) + "个评委的分数:");int score = sc.nextInt();scores[i] = score;}// 3. 从数组中计算出总分,找出最高分、最低分int sum = 0; // 求总分用的变量int max = scores[0]; // 求最大值int min = scores[0]; // 求最小值// 遍历数组找出这些数据for (int i = 0; i < scores.length; i++) {int score = scores[i];// 求和sum += score;// 求最大值if (score > max) {max = score;}// 求最小值if (score < min) {max = score;}}// 4. 计算出平均分并返回return 1.0 * (sum - max - min) / (number - 2);}
}
总结
- 如何实现评委打分案例?
- 定义一个动态初始化的数组,用于录入评委打分
- 提前定义三个变量用来记住数组中的最大值、最小值、总和
- 遍历数组中的每个数据,依次找出最大值、最小值、总和
- 遍历结束后,按照计算规则算出选手的最终得分,并返回即可
案例四:数字加密
需求:
某系统的数字密码是一个四位数,如1983,为了安全,需要加密后再传输,加密规则是:对密码中的每位数都加5,再对10求余,最后将所有数字顺序反转,得到一串加密后的新数,请设计出满足本需求的加密程序
示例:1983 -> 8346
分析:
- 方法是否需要接收数据进行处理?需要接收四位数字密码,进行加密处理
- 方法是否需要返回数据?需要返回加密后的结果
- 方法内部的业务:将四位数拆分成一个一个的数字,存入到数组中去,遍历数组中的每个数字,按照题目需求进行加密!最后,再把加密后的数字拼接起来返回即可!
代码实现
package l_caseexercise;public class d_Test4 {public static void main(String[] args) {// 目标:完成数字加密程序的开发System.out.println("加密后的结果是:" + encrypt(1983)); // 加密后的结果是:8436}public static String encrypt(int number) {// 1. 把这个密码拆分成一个一个的数字,才可以对其进行加密int[] numbers = split(number);// 2. 遍历这个数组中的每个数字,对其进行加密处理for (int i = 0; i < numbers.length; i++) {numbers[i] = (numbers[i] + 5) % 10;}// 3. 对数组反转,把对数组进行反转的操作交给一个独立的方法来完成reverse(numbers);// 4. 把这些加密的数字拼接起来做为加密后的结果返回即可String data = "";for (int i = 0; i < numbers.length; i++) {data += numbers[i];}return data;}public static void reverse(int[] numbers) {// 反转数组for (int i = 0; i <= (numbers.length / 2); i++) {int temp = numbers[numbers.length - i - 1];numbers[numbers.length - i - 1] = numbers[i];numbers[i] = temp;}}public static int[] split(int number) {int[] numbers = new int[4];numbers[0] = number / 1000;numbers[1] = (number / 100) % 10;numbers[2] = (number / 10) % 10;numbers[3] = number % 10;return numbers;}
}
总结
- 回顾数组元素的反转、交换是如何完成的?
- 反转数组,就是对数组中的元素,按照前后位置,依次交换数据
- 如果一个方法里要做的事比较多,我们在开发中一般会怎么做?
- 一般会把多个事情拆成多个方法去完成,也就是独立功能独立成一个方法
案例五:数组拷贝
需求:
请把一个整型数组,例如存了数据:11, 22, 33,拷贝成一个一摸一样的新数组出来
分析:
- 方法是否需要接收数据进行处理?** 需要接受一个整型数组(原数组)**
- 方法是否需要返回数据?需要返回一个新的、一摸一样的整型数组
- 方法内部的业务:创建一个长度一样的整型数组做为新数组,并把原数组的元素对应位置赋值给新数组,最终返回新数组即可
代码实现
package l_caseexercise;public class e_Test5 {public static void main(String[] args) {// 目标:掌握数组拷贝int[] arr = {11, 22, 33};int[] arr2 = copy(arr);printArray(arr2); // [11, 22, 33]// 注意:这个不是拷贝数组,叫把数组变量赋值给另一个数组变量
// int[] arr3 = arr;
// arr3[1] = 666;
// System.out.println(arr[1]); // 666arr2[1] = 666;System.out.println(arr[1]); // 22}public static void printArray(int[] arr){System.out.print("[");for (int i = 0; i < arr.length; i++) {System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ", ");}System.out.println("]");}public static int[] copy(int[] arr){// 1. 创建一个长度一样的整型数组出来int[] arr2 = new int[arr.length];// 2. 把原数组的元素值对应位置赋值给新数组for (int i = 0; i < arr.length; i++) {arr2[i] = arr[i];}return arr2;}
}
总结
- 数组的拷贝是什么意思?
- 创建出一个与原数组一摸一样的数组
案例六:抢红包
需求:
一个大V直播时发起了抢红包活动,分别有:9、666、188、520、99999五个红包。请模拟粉丝来抽奖,按照先来先得,随机抽取,抽完为止,注意:一个红包只能被抽一次,先抽或后抽哪一个红包是随机的,示例如下(不一定是下面的顺序):![]()
分析:
-
方法是否需要接收数据进行处理?需要一个数组,里面是5个金额,表示5个红包
-
方法是否需要返回数据?不需要
-
方法内部完成本需求的方案:
- 第一种:写个 for 循环控制抽奖5次,每次抽奖,都从数组中随机找出一个金额,如果该金额不是0,则代表抽中,接着用0替换该位置处的金额,然后继续下一个粉丝的抽奖;如果抽中的金额发现是0,代表该位置处的红包之前被别人抽走了,则从新数组中随机找出一个金额,继续判断!直至抽中的金额不是0!
- 第二种:先把数组里面的5个金额打乱,打乱后的顺序就认为是中间顺序;接着,写个 for 循环,执行5次,每次都提示抽奖;每次抽奖,都依次取出数组中的每个位置处的金额做为中奖金额即可
- 具体就是,遍历数组,遍历第一个数的时候随机一个索引,把第一个数据和随机的索引位置数据交换,以此类推
代码演示
- 第一种(性能差)
package l_caseexercise;import java.util.Random;
import java.util.Scanner;public class f_Test6 {public static void main(String[] args) {// 目标:完成抢红包案例的开发int[] moneys = {9, 666, 188, 520, 99999};start(moneys);}public static void start(int[] moneys){Scanner sc = new Scanner(System.in);Random r = new Random();// 1. 定义一个for循环,控制抽奖5次for (int i = 1; i <= 5; i++) {// 2. 提示粉丝抽奖System.out.println("请您输入任意内容进行抽奖:");sc.next(); // 等待用户输入内容,按了回车才会往下走// 3. 为当前这个粉丝找一个随机的红包出来while (true) {int index = r.nextInt(moneys.length);int money = moneys[index];// 4. 判断这个红包是否不为0if (money != 0) {System.out.println("恭喜您,您抽中的红包:" + money);moneys[index] = 0;break; // 结束这次抽奖}}}System.out.println("活动结束!");}
}
总结
- 抢红包的实现方案有几种,哪种方式可能更好一些?
- 第一种:每次抽奖都从数组总,随机找出一个金额,如果该金额不是0,就输出该金额,然后用0替换该位置的处的金额;如果该位置就是0,则重复上一步操作
- 第二种:打乱奖金的顺序,再依次发给粉丝
- 遍历数组中的每个位置,每遍历到一个位置,都随机一个索引值出来,让当前位置与该索引位置处的数据进行交换
案例七:找素数
需求:
判断 101-200 之间有多少个素数,并输出所有素数
说明:除了1和它本身以外,不能被其他正整数整除,就叫素数
比如:3、7就是素数,而9、21等等不是素数
分析:
- 方法是否需要接收数据进行处理?** 需要接收101以及200,以便找该区间中的素数**
- 方法是否需要返回数据?** 需要返回找到的素数个数**
- 方法内部的实现逻辑:使用 for 循环来产生如101到200之间的每个数;每拿到一个数,判断该数是否是素数;判断规则是“从2开始遍历到该数的一半的数据,看是否有数据可以整除它,有则不是素数,没有则是素数;根据判定的结果来决定是否输出这个数据(是素数则输出);最后还需要统计素数的个数并返回
拓展知识点、
在外部循环前加上OUT:
表示为外部循环指定标签,后面可以用continue OUT;
结束外部循环的当次执行
代码实现
第一种
package l_caseexercise;public class g_Test7 {public static void main(String[] args) {// 目标:完成找素数System.out.println("当前素数的个数是:" + search(101, 200)); // 当前素数的个数是:21}public static int search(int start, int end){int count = 0; // 统计素数的个数// 1. 定义一个for循环,找到101到200之间的每个数据for (int i = start; i <= end; i++) {// 信号位思想boolean flag = true; // 假设的意思,默认认为当前i记住的数据是素数// 2. 判断当前i记住的数据是否是素数for (int j = 2; j <= i / 2; j++) {if (i % j == 0) {// i当前记住的这个数据不是素数flag = false;break;}}// 3. 根据判定的结果决定是否输出i当前记住的数据:是素数才输出展示if (flag) {System.out.println(i);count++;}}return count;}
}
第二种(简化版)
package l_caseexercise;public class g_Test7pro {public static void main(String[] args) {// 目标:完成找素数int count = 0; // 统计素数的个数// 1. 定义一个for循环,找到101到200之间的每个数据OUT: // 为外部循环指定标签for (int i = 101; i <= 200; i++) {// 2. 拦截判断该数是否是素数for (int j = 2; j <= i / 2; j++) {if (i % j == 0) {// 这个数肯定不是素数,不能打印continue OUT; // 结束外部循环的当次执行}}count++;System.out.println(i);}System.out.println("个数是:" + count);}
}
第三种(更简单的)
package l_caseexercise;public class g_Test7tour {public static void main(String[] args) {for (int i = 101; i <= 200; i++) {// i = 101 102 103 ... 199 200// i遍历到的当前数据是否是素数,是则输出,不是则不输出if (check(i)) {System.out.println(i);}}}public static boolean check(int data){for (int i = 2; i <= data / 2; i++) {if (data % i == 0) {return false; // 不是素数}}return true; // 是素数}
}
总结
- 本次案例中是如何确定出该数是素数的,具体如何实现?
- 定义了 flag 标记位
- 遍历2到该数的一半的数据去判断是否有整除的数据,有则改变 flag 标记位的状态
案例八:打印九九乘法表、三角形
打印九九乘法表

代码实现
package l_caseexercise;public class h_Test8 {public static void main(String[] args) {// 1. 定义一个for循环控制打印多少行for (int i = 1; i <= 9; i++) {// i = 1 2 3 4 5 6 7 8 9// 2. 定义一个内部循环控制每行打印多少列for (int j = 1; j <= i; j++) {// i 行 j 列System.out.print(j + "x" + i + "=" + (j * i) + "\t");}System.out.println(); // 换行}}
}
打印三角形
代码实现
package l_caseexercise;/******************本质:计算机本质只能打印行,所以按照行思考先找规律,再写程序行(i) 先打空格(n-i) 再打星星(2i - 1) 换行1 3 12 2 33 1 54 0 7*/public class i_Test9 {public static void main(String[] args) {// 1. 先定义一个循环控制打印多少行int n = 10;for (int i = 1; i <= n; i++) {// 2. 按照打印多少个空格for (int j = 1; j <= (n - i); j++) {System.out.print(" ");}// 3. 控制打印多少个星星for (int j = 1; j <= (2 * i - 1); j++) {System.out.print(j % 2 == 0 ?" ": "*");}// 4. 换行System.out.println();}}
}
案例九:模拟双色球【拓展案例】
第一步:业务分析、用户投注一组号码
- 双色球业务介绍:
- 投注号码由6个红色球号码和一个蓝色球号码组成。红色球号码从1 - 33中选择;蓝色球号码从1 - 16中选择

- 总体实现步骤分析:
public class Test8 {public static void main(String[] args) {int[] userNumbers = userSelectNumbers();int[] luckNumbers = createLuckNumbers();judge(userNumbers, luckNumbers);}/** 1. 用于让用户投注一组号码(前6个是红球,最后1个是蓝球),并返回用户投注的号码 */public static int[] userSelectNumbers(){...}/** 2. 系统随机一组中奖号码(前6个是红球,最后1个是蓝球),并返回这组中奖号码 */public static int[] createLuckNumbers(){...}/** 3. 传入两组号码,用来判断用户投注号码的中奖情况,并输出 */public static void judge(int[] userNumbers, int[] luckNumber){...}
}
- 注意:6个红球号码的范围是1 - 33之间,且不能重复;1个蓝球号码的范围在:1 - 16之间
代码实现
package l_caseexercise;import java.util.Scanner;public class j_Test10 {public static void main(String[] args) {// 目标:完成双色球系统的开发int[] userNumbers = userSelectNumbers();printArray(userNumbers);}public static void printArray(int[] arr){System.out.print("[");for (int i = 0; i < arr.length; i++) {System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ", ");}System.out.print("]");}/*** 1. 设计一个方法,用于让用户投注一组号码并返回(前6个是红球号码,最后1个是蓝球号码)*/public static int[] userSelectNumbers() {// 2. 创建一个整型数组,用于存储用户投注的7个号码(前6个是红球号码,最后1个是蓝球号码)int[] numbers = new int[7];// numbers = [0, 0, 0, 0, 0, 0, 0]// 0 1 2 3 4 5 6Scanner sc = new Scanner(System.in);// 3. 遍历前6个位置,让用户依次投注6个红球号码,存入for (int i = 0; i < numbers.length - 1; i++) {// i = 0 1 2 3 4 5while (true) {// 4. 开始让用户为当前位置投注一个红球号码(1 - 33之间,不能重复)System.out.println("请您输出第" + (i + 1) + "个红球号码(1 - 33之间,不能重复)");int number = sc.nextInt();// 5. 先判断用户输入的红球号码是否在1-33之间if (number < 1 || number > 33) {System.out.println("对不起,您输入的红球号码不在1-33之间,请确认!");} else {// 号码是在1-33之间了,接着还要继续判断这个号码是否重复,不重复才可以使用if (exist(numbers, number)) {// number当前这个红球号码重复了System.out.println("对不起,您当前输入的红球号码前面选择过,重复了,请确认");} else {// number记住的这个号码没有重复了,就可以使用了numbers[i] = number;break; // 结束当次投注,结束了当前死循环}}}}// 6. 投注最后一个蓝球号码while (true) {System.out.println("请您输入最后1个蓝球号码(1-16):");int number = sc.nextInt();if (number < 1 || number > 16) {System.out.println("对不起,您输入的蓝球号码范围不对!");} else {numbers[6] = number;break; // 蓝球号码录入成功,结束死循环}}return numbers;}private static boolean exist(int[] numbers, int number) {// 需求:判断number这个数字是否在numbers数组中存在for (int i = 0; i < numbers.length; i++) {if (numbers[i] == 0) {break;}if (numbers[i] == number){return true;}}return false;}
}
总结
- 本次案例中是如何去保证用户投注的6个红球号码不重复的?
- 每次用户投注一个红球号码后,都去调用一个方法来判断这个号码是否已经选择过,如果选择过,让用户重新选号【死循环】
第二步:随机生成一组中奖号码
代码实现
package l_caseexercise;import java.util.Random;
import java.util.Scanner;public class j_Test10 {public static void main(String[] args) {// 目标:完成双色球系统的开发int[] luckNumbers = createLuckNumbers();printArray(luckNumbers);}/*** 2. 设计一个方法:随机一组中奖号码出来(6个红球号码,1个蓝球号码)*/public static int[] createLuckNumbers(){// 1. 创建一个整型数组,用于存储这7个号码int[] numbers = new int[7];Random r = new Random();// 2. 遍历前6个位置处,依次随机一个红球号码存入(1-33不重复)for (int i = 0; i < numbers.length; i++) {// i = 0 1 2 3 4 5while (true) {// 3. 为当前位置随机一个红球号码出来存入 1 - 33 ==> -1 ==> (0, 32)int number = r.nextInt(33) + 1;// 4. 判断这个号码是否之前出现过(红球号码不重复)if (!exist(numbers, number)) {// number不重复numbers[i] = number;break; // 结束死循环,代表找到了当前这个位置的一个不重复的红球号码了}}}// 5. 录入一个蓝球号码numbers[6] = r.nextInt(16) + 1;return numbers;}
}
总结
- 本次案例中是如何去保证随机的6个中奖的红球号码不重复的?
- 每次随机一个1-33之间的红球号码后,都去调用一个方法来判断这个号码是否已经出现过,如果出现过,让用户重新选号
第三步:判断中奖情况
总结
- 本次案例中是如何去统计用户投注的红球的命中数量的?
- 遍历用户选择的每个红球号码,每遍历一个红球号码时,都去遍历中奖号码数组中的全部红球号码,看当前选的红球号码是否在中奖号码中存在,存在则红球命中数量加1
代码实现
package l_caseexercise;import java.util.Random;
import java.util.Scanner;public class j_Test10 {public static void main(String[] args) {// 目标:完成双色球系统的开发int[] userNumbers = userSelectNumbers();System.out.println("您投注的号码:");printArray(userNumbers);int[] luckNumbers = createLuckNumbers();System.out.println("中奖的号码");printArray(luckNumbers);judge(userNumbers, luckNumbers);}public static void printArray(int[] arr){System.out.print("[");for (int i = 0; i < arr.length; i++) {System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ", ");}System.out.print("]");}/*** 1. 设计一个方法,用于让用户投注一组号码并返回(前6个是红球号码,最后1个是蓝球号码)*/public static int[] userSelectNumbers() {// 2. 创建一个整型数组,用于存储用户投注的7个号码(前6个是红球号码,最后1个是蓝球号码)int[] numbers = new int[7];// numbers = [0, 0, 0, 0, 0, 0, 0]// 0 1 2 3 4 5 6Scanner sc = new Scanner(System.in);// 3. 遍历前6个位置,让用户依次投注6个红球号码,存入for (int i = 0; i < numbers.length - 1; i++) {// i = 0 1 2 3 4 5while (true) {// 4. 开始让用户为当前位置投注一个红球号码(1 - 33之间,不能重复)System.out.println("请您输出第" + (i + 1) + "个红球号码(1 - 33之间,不能重复)");int number = sc.nextInt();// 5. 先判断用户输入的红球号码是否在1-33之间if (number < 1 || number > 33) {System.out.println("对不起,您输入的红球号码不在1-33之间,请确认!");} else {// 号码是在1-33之间了,接着还要继续判断这个号码是否重复,不重复才可以使用if (exist(numbers, number)) {// number当前这个红球号码重复了System.out.println("对不起,您当前输入的红球号码前面选择过,重复了,请确认");} else {// number记住的这个号码没有重复了,就可以使用了numbers[i] = number;break; // 结束当次投注,结束了当前死循环}}}}// 6. 投注最后一个蓝球号码while (true) {System.out.println("请您输入最后1个蓝球号码(1-16):");int number = sc.nextInt();if (number < 1 || number > 16) {System.out.println("对不起,您输入的蓝球号码范围不对!");} else {numbers[6] = number;break; // 蓝球号码录入成功,结束死循环}}return numbers;}private static boolean exist(int[] numbers, int number) {// 需求:判断number这个数字是否在numbers数组中存在for (int i = 0; i < numbers.length; i++) {if (numbers[i] == 0) {break;}if (numbers[i] == number){return true;}}return false;}/*** 2. 设计一个方法:随机一组中奖号码出来(6个红球号码,1个蓝球号码)*/public static int[] createLuckNumbers() {// 1. 创建一个整型数组,用于存储这7个号码int[] numbers = new int[7];Random r = new Random();// 2. 遍历前6个位置处,依次随机一个红球号码存入(1-33不重复)for (int i = 0; i < numbers.length; i++) {// i = 0 1 2 3 4 5while (true) {// 3. 为当前位置随机一个红球号码出来存入 1 - 33 ==> -1 ==> (0, 32)int number = r.nextInt(33) + 1;// 4. 判断这个号码是否之前出现过(红球号码不重复)if (!exist(numbers, number)) {// number不重复numbers[i] = number;break; // 结束死循环,代表找到了当前这个位置的一个不重复的红球号码了}}}// 5. 录入一个蓝球号码numbers[6] = r.nextInt(16) + 1;return numbers;}/*** 3. 设计一个方法,用于判断用户的中奖情况*/public static void judge(int[] userNumbers, int[] luckNumbers) {// 1. 分别定义两个变量用于记住红球命中了几个以及蓝球命中了几个int redCount = 0;int blueCount = 0;// 先判断红球命中的数量// 遍历用户投注的号码的前6个红球for (int i = 0; i < userNumbers.length - 1; i++) {// 开始遍历中奖号码的前6个红球号码,看用户当前选择的这个号码是否命中了for (int j = 0; j < luckNumbers.length - 1; j++) {if (userNumbers[i] == luckNumbers[j]){redCount++;break;}}}// 2. 判断蓝球是否命中blueCount = userNumbers[6] == luckNumbers[6] ? 1 : 0;System.out.println("您命中的红球数量是:" + redCount);System.out.println("您命中的蓝球数量是:" + blueCount);// 3. 判断中奖详情,并输出结果if (redCount == 6 && blueCount == 1) {System.out.println("恭喜您,中奖1000万,可以开始享受人生了~~~");} else if (redCount == 6 && blueCount == 0) {System.out.println("恭喜您,中奖500万,可以稍微开始享受人生了~~~");} else if (redCount == 5 && blueCount == 1) {System.out.println("恭喜您,中奖3000元,可以出去吃顿小龙虾了~");} else if (redCount == 5 && blueCount == 0 || redCount == 4 && blueCount == 1) {System.out.println("恭喜您,中了小奖,200元~");} else if (redCount == 4 && blueCount == 0 || redCount == 3 && blueCount == 1) {System.out.println("中了10元~");} else if (redCount < 3 && blueCount == 1) {System.out.println("中了5元~");}else {System.out.println("感谢您对福利事业做出的巨大贡献~~~");}}
}