案例七:双色球系统开发[拓展案例]

需求:

  • 随机生成一组中奖号码

    • 投注号码由6个红色球号码和1个蓝色球号码组成。

    • 红色球号码从 1-33 中选择;蓝色球号码从 1-16 中选择。

  • 分析:

    • 中奖号码由6个红球和1个篮球组成(注意:6个红球要求不能重复)。
    • 定义方法用于返回一组中奖号码(7个数),返回值类型是一个整型数组
  • 实现:

    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个红色球和1个蓝色球号码
      • 该方法最终需要返回一个数组,数组中就是用户录入的号码(7位)
    • 实现:

      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[] userNumbersjudge(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 = 6for (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+10个红色球   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个
您蓝色球未命中!
感谢您为福利事业作出的伟大贡献!!

47-Java编程案例七:双色球系统开发相关推荐

  1. Java编程案例:买飞机票

    编程案例: 一.目的 复习前半段课程学习的Java编程知识,能够使用所学的知识解决问题,提升同学们的编程能力. 二.涉及到的知识点 变量.数组. 运算符:基本运算符.关系运算符.逻辑运算符- 程序流程 ...

  2. C语言模拟双色球系统开发

    前言 近期有朋友双色球中了个小奖,所以临时兴起,写了个模拟双色球系统玩玩,购买规则.开奖以及中奖等级均模仿现实规则,小部分玩法自定. 开发此系统需要熟悉 C 语言指针的使用.结构体的设计:如果能轻松的 ...

  3. java基础案例-模拟双色球

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.需求 二.分析 三.代码 四.效果图 总结 如何保证随机的6个中奖的红球号码不重复. 如何统计红球命中数量 一.需求 1 ...

  4. 案例7:双色球系统开发

    kage com.itheima;import java.util.Random; import java.util.Scanner;public class Test6 {public static ...

  5. python编程案例教程-Python程序开发案例教程

    内容简介 Python是近年来最流行的编程语言之一,其清晰的语法和可读性使其成为初学者的完美编码语言,并且深受编程人员的喜好和追捧. 本书从入门者角度出发,以简洁有趣.通俗易懂的语言讲解了全新的Pyt ...

  6. ev3 java编程_使用C语言开发EV3程序(原创,转载请注明出处)

    2.安装c4ev3(http://c4ev3.github.io/),双击c4ev3-withGCC-setup.exe进行安装,默认安装即可.如果你下载的是带GCC的安装包,接下来会自动安装Code ...

  7. JAVA分布式医疗云平台系统开发实战第一节 open-his系统技术架构与环境准备

    项目简介                                                                       Open-His 是以完整的基层医疗机构-信息化解 ...

  8. 重学java----面向对象编程案例(房屋出租系统)

    要实现的功能如下 来源于 跟着韩老师学java,https://www.bilibili.com/video/BV1fh411y7R8 实现基于文本界面的<房屋出租软件>. 能够实现对房屋 ...

  9. java编程编一个小系统_如何编写一个java学生信息管理系统?

    首先说说我的经验吧.做一个信息系统,你得有界面吧,那界面怎么做呢?你得会基础的前端三剑客吧,这样,当你开始做页面后,你会发现,我去,这么麻烦?于是你开始找捷径,你百度后发现,哎,这个vue框架好像不错 ...

最新文章

  1. Docker操作系统理解
  2. 软件设计原则——依赖倒转原则
  3. PhotoShop常用的功能汇总
  4. 3.21日 爬虫小计
  5. C# 用IrisSkin4.dll美化你的WinForm
  6. dcom配置_spring cloud 二代架构依赖组件 全配置放送
  7. openwrt dhcp 无法获取ip_电脑的 ip 是怎么来的呢?我又没有配置过
  8. python回车键绑定按钮_python tkinter 绑定回车键
  9. python3 爬虫实例_【实战练习】Python3网络爬虫快速入门实战解析(上)
  10. AD原理图进阶设计1
  11. 2017华为机试题--Floyd算法
  12. swift 字符串转int_Swift Tips Streamline 如何假装写过 Swift
  13. 相邀直播app最新入驻58位海外阿姨
  14. 10分钟搞定kettle源码部署
  15. mysql migration tool 64bit_Migration Tool支持MySQL业务SQL迁移
  16. C语言要点系统复习三:scanf读取缓冲区的那些事
  17. linux 验证码 权限,linux 上验证码无法显示
  18. jNs 在 ASP.NET MVC 项目中的应用
  19. 完美解决c# 连接oracle US7ASCII字符中文乱码 亲测
  20. Mac安装MongoDB(极简)

热门文章

  1. 介绍a股level2数据接口委托队列的作用
  2. Linux条带化参数,LVM条带化
  3. python爬取热搜神器
  4. Hadamard 积
  5. 自动售卖系统开发系列——人脸识别自动售卖机二代ChingTom
  6. 法国原创Flash《小土豆》, 非常可爱
  7. Django自定义url(path)转换器
  8. 渗透测试该如何选择?
  9. 应用时代,firefox os之死
  10. 前端性能优化(一)提升加载速度