案例需求:用户输入一组由6个红球和1个蓝球组成的数字,系统随机生成一组数字,通过判断是否一致来辨别是否中奖
//红色球号码由1-33从选择  蓝色球号码由1-16中选择
//中奖条件与奖金数
/**
 * 红色0+蓝色1, 红1+蓝1,       六等奖  5元
 * 红2+蓝1,红3+蓝1,红4+蓝0    五等奖  10元
 * 红4+蓝1,红5+蓝0            四等奖  200元
 * 红5+蓝1                    三等奖  3000元
 * 红6+蓝0                    二等奖  500万元
 * 红6+蓝1                    一等奖  1000万元
 */
该案例可以分成三部分,分别是系统随机生成一组中奖号码,用户自身输入号码和判断中奖情况
1.系统随机生成中奖号码
public static int[] createLuckNumbers(){
        //建立一组数组,存储7个球的号码
        int[] numbers=new int[7];
        //随机生成
        Random r=new Random();
        for (int i = 0; i < numbers.length-1; i++) {
            //先生成6个红球 1-33,且不要重复的
            while (true) {
                //新建一个变量,接收随机生成的数字
                int data = r.nextInt(33) + 1;
                //新建一个信号量,判断新生成的数字是否重复
                boolean flat=true;//没有重复
                //number【j】是一组新生成的数字
                for (int j = 0; j < i; j++) {
                    if(numbers[j]==data){
                        flat=false;
                        break;
                    }
                }
                    if(flat){
                        numbers[i]=data;
                        break;
                    }
            }
        }
        //l蓝球1-16 随机生成
        numbers[numbers.length-1]= r.nextInt(16)+1;
        return numbers;
    }

这部分的流程是:a.定义数组,用于存储生成的号码

b.使用Random方法随机生成。

c.因为是双色球,所以要分开生成蓝球号码和红球号码,并且根据要求红球要1-33内的数字,且必须不能重复的。

d.遍历数组,设置数组的前六位用来存储红球的号码,因为必须要不重复,所以要设置一个信号量判断生成的数字是否重复,在死循环里判断,然后通过遍历检查新生成的数字与已经生成的数字是否重复,如果重复则信号量为false,遍历终止,重新进入死循环生成新的数字,重复操作,直到生成六个不重复数字的红球,然后把这些数字存放到数组中,跳出for循环,生成最后一个蓝球号码,并放入数组中。

2.用户自身输入一组号码

public static int[] userInputNumbers(){
        //建立一组数组,存储用户输入的数字
        int[] numbers=new int[7];
        //键盘输入
        Scanner sc=new Scanner(System.in);
        //循环输入1-6个号码范围1-33,且不重复的
        for (int i = 0; i < numbers.length-1; i++) {
            System.out.println("请你输入第"+(i+1)+"个号码(1-33,且不重复):");
            //设置变量接收用户输入的数字
            int data=sc.nextInt();
            //将接收的数字放入存储的数组中
            numbers[i]=data;


        }
        //用户输出蓝球号码1-16
        System.out.println("请你输入蓝色球的号码(1-16):");
        int data= sc.nextInt();
        numbers[numbers.length-1]=data;
        return numbers;
    }

该部分的流程:a.新建数组,用来存储用户输入的数字。

b.通过引用Scanner方法,键入用户所想要输入的数字

c.通过遍历数组,输入具有良好的用户性的语句,设置一个变了接收用户输入的数字,并存入数组中

d.跳出for循环,输入蓝球号码,放入数组中。

3.判断中奖情况

//判断是否中奖了
    public static void judge(int[] luckNumbers, int[] userLuckNumber){
        //设置两个变量,分别判断红球和蓝球的个数
        int redHitNumbers=0;
        int blueHitNumber=0;

        //遍历随机生成的号码与用户输入的号码 红球
        for (int i = 0; i < luckNumbers.length-1; i++) {
            for (int j = 0; j < userLuckNumber.length-1; j++) {
                if(userLuckNumber[j]==luckNumbers[i]){
                    redHitNumbers++;
                    break;
                }
            }

        }
        //判断蓝球号码
       blueHitNumber= userLuckNumber[6] == luckNumbers[6] ? 1:0;

        System.out.println("本期的中奖号码分别是:");
        printArray(luckNumbers);
        System.out.println("您输入的号码分别是");
        printArray(userLuckNumber);
        System.out.println("您所中的红球号码数是:"+redHitNumbers);
        System.out.println("您是否命中蓝球:"+(blueHitNumber==1? "是":"否"));

        //判断中奖情况
        if(redHitNumbers<3 &&blueHitNumber==1)
        {
            System.out.println("恭喜你中了六等奖,获得了5块钱!!!!");
        }else if(redHitNumbers == 3 && blueHitNumber ==1
                || redHitNumbers ==4 && blueHitNumber ==0 ){
            System.out.println("恭喜你中了五等奖,获得了10块钱!!!!");
        }else if (redHitNumbers ==4 && blueHitNumber == 1
                || redHitNumbers == 5 && blueHitNumber ==0){
            System.out.println("恭喜你中了四等奖,获得了200元大奖!!!");
        }else if(redHitNumbers ==5 && blueHitNumber==1){
            System.out.println("恭喜你中了三等奖,获得了3000元特大奖!!!");
        }else if(redHitNumbers == 6 && blueHitNumber == 0){
            System.out.println("恭喜你中了二等奖,获得了500万元现金巨奖!!!!");
        }else if(redHitNumbers==6 &&blueHitNumber==1){
            System.out.println("恭喜你中了一等奖,获得了1000万元现金超级巨奖,可以享受人生不用奋斗了");
        }else {
            System.out.println("对不起,您没有中奖,很遗憾,感谢您为慈善事业做出了杰出的贡献");
        }

    }

该部分的流程:a.设置存储红球与蓝球个数的变量;

b.遍历查找系统随机生成的号码与用户输入的号码是否有一样的,若是有则红球数量加1,因为先判断红球的,然后跳出for循环使用三元运算符的方法判断蓝球号码是否一样。

c.通过if...else结构判断中奖情况

 

4.感想与不足之处

通过做这个案例,有很多逻辑理不通,比如随机生成号码判断是否重复那一部分就卡壳了许久,起初没有想到要用死循环,但是通过做完案例收获颇丰。

不足之处:自我感觉后期可以完善这个程序,比如:编写出友好的用户交互界面,还有设置用户输入红球的号码必须是1-33,否则就会报错等的一些完善。

5.完整代码:

package com.study.day6;

import java.util.Random;
import java.util.Scanner;

public class ShuangSeQiuDemo7 {
    public static void main(String[] args) {
        //案例:用户输入一组由6个红球和1个蓝球组成的数字,系统随机生成一组数字,通过判断是否一致来辨别是否中奖
        //红色球号码由1-33从选择  蓝色球号码由1-16中选择
        //中奖条件与奖金数
        /**
         * 红色0+蓝色1, 红1+蓝1,       六等奖  5元
         * 红2+蓝1,红3+蓝1,红4+蓝0    五等奖  10元
         * 红4+蓝1,红5+蓝0            四等奖  200元
         * 红5+蓝1                    三等奖  3000元
         * 红6+蓝0                    二等奖  500万元
         * 红6+蓝1                    一等奖  1000万元
         */
        //随机生成
        int[] luckNumbers=createLuckNumbers();
        //printArray(luckNumbers);
        //用户自选号码
        int[] userLuckNumber=userInputNumbers();
       // printArray(userLuckNumber);
        //判断中奖情况
        judge(luckNumbers,userLuckNumber);
    }
    //判断是否中奖了
    public static void judge(int[] luckNumbers, int[] userLuckNumber){
        //设置两个变量,分别判断红球和蓝球的个数
        int redHitNumbers=0;
        int blueHitNumber=0;

        //遍历随机生成的号码与用户输入的号码 红球
        for (int i = 0; i < luckNumbers.length-1; i++) {
            for (int j = 0; j < userLuckNumber.length-1; j++) {
                if(userLuckNumber[j]==luckNumbers[i]){
                    redHitNumbers++;
                    break;
                }
            }

        }
        //判断蓝球号码
       blueHitNumber= userLuckNumber[6] == luckNumbers[6] ? 1:0;

        System.out.println("本期的中奖号码分别是:");
        printArray(luckNumbers);
        System.out.println("您输入的号码分别是");
        printArray(userLuckNumber);
        System.out.println("您所中的红球号码数是:"+redHitNumbers);
        System.out.println("您是否命中蓝球:"+(blueHitNumber==1? "是":"否"));

        //判断中奖情况
        if(redHitNumbers<3 &&blueHitNumber==1)
        {
            System.out.println("恭喜你中了六等奖,获得了5块钱!!!!");
        }else if(redHitNumbers == 3 && blueHitNumber ==1
                || redHitNumbers ==4 && blueHitNumber ==0 ){
            System.out.println("恭喜你中了五等奖,获得了10块钱!!!!");
        }else if (redHitNumbers ==4 && blueHitNumber == 1
                || redHitNumbers == 5 && blueHitNumber ==0){
            System.out.println("恭喜你中了四等奖,获得了200元大奖!!!");
        }else if(redHitNumbers ==5 && blueHitNumber==1){
            System.out.println("恭喜你中了三等奖,获得了3000元特大奖!!!");
        }else if(redHitNumbers == 6 && blueHitNumber == 0){
            System.out.println("恭喜你中了二等奖,获得了500万元现金巨奖!!!!");
        }else if(redHitNumbers==6 &&blueHitNumber==1){
            System.out.println("恭喜你中了一等奖,获得了1000万元现金超级巨奖,可以享受人生不用奋斗了");
        }else {
            System.out.println("对不起,您没有中奖,很遗憾,感谢您为慈善事业做出了杰出的贡献");
        }

    }
    public static int[] userInputNumbers(){
        //建立一组数组,存储用户输入的数字
        int[] numbers=new int[7];
        //键盘输入
        Scanner sc=new Scanner(System.in);
        //循环输入1-6个号码范围1-33,且不重复的
        for (int i = 0; i < numbers.length-1; i++) {
            System.out.println("请你输入第"+(i+1)+"个号码(1-33,且不重复):");
            //设置变量接收用户输入的数字
            int data=sc.nextInt();
            //将接收的数字放入存储的数组中
            numbers[i]=data;


        }
        //用户输出蓝球号码1-16
        System.out.println("请你输入蓝色球的号码(1-16):");
        int data= sc.nextInt();
        numbers[numbers.length-1]=data;
        return numbers;
    }


    //输出方法
    public static void printArray(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
        System.out.println();//换行
    }
    public static int[] createLuckNumbers(){
        //建立一组数组,存储7个球的号码
        int[] numbers=new int[7];
        //随机生成
        Random r=new Random();
        for (int i = 0; i < numbers.length-1; i++) {
            //先生成6个红球 1-33,且不要重复的
            while (true) {
                //新建一个变量,接收随机生成的数字
                int data = r.nextInt(33) + 1;
                //新建一个信号量,判断新生成的数字是否重复
                boolean flat=true;//没有重复
                //number【j】是一组新生成的数字
                for (int j = 0; j < i; j++) {
                    if(numbers[j]==data){
                        flat=false;
                        break;
                    }

                }
                    if(flat){
                        numbers[i]=data;
                        break;

                    }
            }
            
        }
        //l蓝球1-16 随机生成
        numbers[numbers.length-1]= r.nextInt(16)+1;
        return numbers;
    }
}