java基础案例-模拟双色球

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、需求

1.随机生成一组中奖号码
2.用户输入一组双色球号码
3.判断中奖情况
4.中奖号码由6个红球(1-33)和1个蓝球(1-16)组成(6个红球不能重复)
在这里插入图片描述

二、分析

1.createLuckNumbers(){…} 随机生成一组中奖号码返回
可以定义方法用于返回一组中奖号码(7个数据),返回的形式是一个整型数组
userInputNumbers(){…} 用户输入一组号码
2.定义一个方法,该方法可以录入用户输入的6个红球和1个蓝球号码
该方法最终返回一个数组,数组中就是用户录入的号码(7个)
3.judge(int[] luckNumbers,int[] userNumbers){…} 传入两组号码判断用户中奖情况

三、代码

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

/**
 * 模拟双色球
 * 业务分析、随机生成一组中奖号码
 * 用户输入一组双色球号码
 * 判断中奖情况
 * 中奖号码由6个红球和1个篮球组成(注意:6个红球要求不能重复)
 */
public class CaseDemo7 {
    /**
     * 分析:
     * createLuckNumbers(){...} 随机生成一组中奖号码返回
     * 可以定义方法用于返回一组中奖号码(7个数据),返回的形式是一个整型数组
     * userInputNumbers(){...} 用户输入一组号码
     * 定义一个方法,该方法可以录入用户输入的6个红球和1个蓝球号码
     * 该方法最终返回一个数组,数组中就是用户录入的号码(7个)
     * judge(int[] luckNumbers,int[] userNumbers){...} 传入两组号码判断用户中奖情况
     */
    public static void main(String[] args) {
        //1.随机6个红球号码(1-33,不能重复),随机一个蓝球号码(1-16),可以采用数组装起来作为中奖号码
        int[] luckNumbers = createLuckNumbers();
        //2. 调用一个方法让用户输入7个号码,作为用户选号
        int[] userInputNumbers = userInputNumbers();
        System.out.println("您购买的号码是:");
        print(userInputNumbers);
        System.out.println("中奖号码为:");
        print(luckNumbers);
        //3.判断是否中奖
        judge(luckNumbers, userInputNumbers);
    }

    //生成一组中奖号码
    public static int[] createLuckNumbers() {
        //a.定义一个动态初始化的数组,存储7个数字
        int[] numbers = new int[7];
        //b.遍历数组,为每个位置生成对应号码,遍历到第六个位置,第七个为蓝球号码需要单独生成
        //(6个红球号码不能重复)
        Random r = new Random();
        for (int i = 0; i < numbers.length - 1; i++) {
            //当不重复的时候再退出死循环
            while (true) {
                int data = r.nextInt(33) + 1;//1-33 (0-32)+1
                //c.判断当前随机生成号码是否出现过,如果出现过需要重新随机一个,知道不重复为止才能存入数组
                /**
                 * (当前生成的随机数需要与已经存入的做比较是否重复,已经存入的i代表位置) 比如已经存入2个,在存入
                 * 第三个的时候需要判断 0,1 是否重复 相当于 i=3时,j = 1 、2
                 */
                boolean flag = true;
                for (int j = 0; j < i; j++) {
                    //data值与之前的值重复,data需要重新赋值
                    if (numbers[j] == data) {
                        //跳出本次判断重复循环,重新生成一个
                        flag = false;
                        break;
                    }
                }
                //如果判断没有重复,说明flag还是true 跳出死循环
                if (flag) {
                    numbers[i] = data;
                    break;
                }
            }
        }
        // d.为第七个位置生成(1-16)作为蓝球号码
        numbers[numbers.length - 1] = r.nextInt(16) + 1;
        return numbers;
    }

    //用户选号
    public static int[] userInputNumbers() {
        // a.定义一个数组存储7个号码
        int[] userNumbers = new int[7];
        Scanner sc = new Scanner(System.in);
        // b.让用户输入6个红球号码
        for (int i = 0; i < userNumbers.length - 1; i++) {
            System.out.println("请您输入第" + (i + 1) + "个红球号码(1-33)不能重复:");
            int data = sc.nextInt();
            //c.把当前录入的数据存入数组
            userNumbers[i] = data;
        }
        System.out.println("请输入第7个蓝球号的号码(1-16):");
        userNumbers[userNumbers.length - 1] = sc.nextInt();
        return userNumbers;
    }

    //判断中奖情况
    public static void judge(int[] luckNumbers, int[] userNumbers) {
        //a.定义两个变量定义红蓝球中的个数
        int countRed = 0;
        int countBlue = 0;
        //b.统计红球猜中个数
        for (int i = 0; i < luckNumbers.length - 1; i++) {
            if (luckNumbers[i] == userNumbers[i]) {
                countRed++;
            }
        }
        //c.统计蓝球猜中没有
        if (luckNumbers[luckNumbers.length - 1] == userNumbers[userNumbers.length - 1]) {
            countBlue++;
        }
        System.out.println("红球:" + countRed);
        System.out.println("蓝球:" + countBlue);
        if (countRed == 6 && countBlue == 1) {
            System.out.println("恭喜您中了1000万!");
        } else if (countRed == 6 && countBlue == 0) {
            System.out.println("恭喜您中了500万!");
        } else if (countRed == 5 && (countBlue == 1 || countBlue == 0)) {
            System.out.println("恭喜您中了3000元!");
        } else if (countRed == 4 && (countBlue == 1 || countBlue == 0)) {
            System.out.println("恭喜您中了200元!");
        } else if ((countRed == 2 || countRed == 3) && countBlue == 1) {
            System.out.println("恭喜您中了10元!");
        } else if ((countRed == 1 && countBlue == 1) || countBlue == 1) {
            System.out.println("恭喜您中了5元!");
        } else {
            System.out.println("很遗憾!您没有中奖!");
        }
    }

    //打印数组
    public static void print(int[] numbers) {
        for (int i = 0; i < numbers.length; i++) {
            System.out.print(i != numbers.length - 1 ? numbers[i] + " " : numbers[i]+"\n");
        }
    }


}


四、效果图

在这里插入图片描述

总结

如何保证随机的6个中奖的红球号码不重复。

1.每次随机一个红球号码后去数组中判断是否存在。
2.存在需要重新生成一个数字直到不重复位置(while循环+flag解决)。

如何统计红球命中数量

1.遍历用户的每个选号,然后遍历中奖号码的数组
2.看当前选号是否在中奖号码中存在,存在则count++

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值