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

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

需求:

  • 随机生成一组中奖号码

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

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

47-Java编程案例七:双色球系统开发_第1张图片

  • 分析:

    • 中奖号码由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[] 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个
您蓝色球未命中!
感谢您为福利事业作出的伟大贡献!!

你可能感兴趣的:(JavaSE基础入门篇,java,开发语言)