• Java笔记——控制台模拟“双色球”福利彩票游戏


    Java笔记——控制台模拟“双色球”福利彩票游戏

    说明:本打算重新巩固java知识并重新记录笔记,但是现在对于一个20多年的语言而言,鄙人的能力实在是提炼不出来什么精华,直接上练手的小项目更加合适,后续直接上练手的小项目,逐步加强能力…

    双色球”福利彩票游戏 功能分解

    福利彩票的逻辑结构及运行展示

    1. 逻辑结构

    彩票系统逻辑结构

    2. 运行展示

    (1)初始控制台界面

    在这里插入图片描述

    (2)选择功能
    • 购买彩票
      在这里插入图片描述
    • 选择票注(采购2张为例) 在这里插入图片描述
    • 选择红/蓝球数字,并展示选择结果及购买金额 在这里插入图片描述
    • 查看开奖 在这里插入图片描述
    • 退出系统 在这里插入图片描述

    代码的细节分析

    全部代码如下所示,并对其中细节进行分析:

    package com.linstack.testunionlotto;
    
    import java.util.Scanner;
    
    /**
     * @Auther: LinStack
     * @Date: 2022/8/27 - 08 - 27
     * @Description: com.linstack.testunionlotto
     * @version: 1.0
     */
    public class TestUnionLotto {
        public static void main(String[] args) {
            //实现功能:按要求完成“双色球福彩游戏”
    
            //声明一个全局数组,用以存储用户选择的双色球数字
            int[] balls = new int[7];
            //购票数量初始值为0;
            int count = 0;
            //设置购买状态,防止用户不购买彩票直接查看开奖,造成误导
            boolean isBuy = false; //初始状态为false
            //完成菜单,并根据需求持续显示在控制台上
            while (true){
                System.out.println("----------欢迎进入双色球彩票系统----------");
                System.out.println("1.购买彩票");
                System.out.println("2.查看开奖");
                System.out.println("3.退出系统");
                System.out.println("请选择您要选择的功能:");
                //键盘录入选择的功能:
                Scanner sc = new Scanner(System.in);
                int choice = sc.nextInt();
                //对录入数字进行初步过滤
                while (choice!=1&&choice!=2&&choice!=3){ //使用while不用if避免多次录入非标数据再次报错
                    System.out.println("对不起,其他功能正在开发中,请重新输入功能选择:");
                    int newChoice = sc.nextInt();
                    choice = newChoice; //将新录入的数字再次传回choice中进行下述选择
                }
                //进入系统后的分支操作
                switch (choice){
                    case 1: //用户购买彩票功能
                        System.out.println("双色球彩票系统————购票界面:");
                        System.out.println("请选择彩票票注:");
                        count = sc.nextInt(); //购票数量,原则上不会为负数,不超过100注
                        if(count<1 || count >100) {
                            System.out.println("彩票数量购买失败!请重新选择票注:");
                            count = sc.nextInt();
                        }
                        //模拟选择彩球的数量
                        for (int i = 1; i <= 7; i++) {
                            if (i!=7){ //模拟前六个红球
                                System.out.println("请选择第"+i+"个红球数字:");
                                int redBall = sc.nextInt();
                                if(redBall<1 || redBall >33) {
                                    System.out.println("红球输入数字不在数字范围中,请重新选择第"+i+"个红球数字:");
                                    redBall = sc.nextInt();
                                }
                                balls[i-1] = redBall; //初步筛选后,传入数组下标0-5对应的红球1-6
                                for (int j = 1; j < i; j++) { //设置红球选择重复的自检for循环
                                    if (balls[i-1] == balls[j-1]){ //通过循环判断后一个数与前面数字是否一致
                                        //如果一致表示出现重复,则将传入的次数进行回退,给出提示信息并重新获取
                                        System.out.println("红球输入数字重复,请重新选择第"+i+"个红球数字:");
                                        i--;
                                        redBall = sc.nextInt();
                                    }
                                }
                            } else { //模拟蓝球
                                System.out.println("请选择蓝球数字:");
                                int blueBall = sc.nextInt();
                                //界限蓝球数字选择
                                if(blueBall<1 || blueBall >16) {
                                    System.out.println("蓝球输入数字不在数字范围中,请重新输入:");
                                    blueBall = sc.nextInt();
                                }
                                balls[6] = blueBall; //传入数组下标6对应的蓝球
                            }
                        }
                        //汇总彩票购买信息:
                        System.out.println("本次购买"+count+"注彩票,共计消费"+count*2+"元。本次购买的彩票号码为:");
                        for (int num : balls){
                            System.out.print(num+"\t");
                        }
                        System.out.println(); //格式上与后续菜单显示进行换行
                        //购买状态设置为true
                        isBuy = true;
                        break;
                    case 2: //彩票开奖功能(开奖随机号码与购买者号码进行对比,分析用户中奖结果)
                        if (isBuy){
                            System.out.println("双色球彩票系统————开奖界面:");
                            //传入开奖方法,获取开奖号码数组
                            int[] luckBalls = getLuckBalls();
                            //展示开奖号码数组
                            System.out.println("本次开奖的彩票号码为:");
                            for (int num : luckBalls){
                                System.out.print(num+"\t");
                            }
                            System.out.println(); //格式上与后续菜单显示进行换行
                            //将用户购买的彩票与开奖号码进行比对,获取中奖情况
                            int levels = getLevels(balls, luckBalls);
                            switch (levels){
                                case 1:
                                    System.out.println("恭喜您中奖,获得一等奖!单注奖金500万元人民币,您一共获得:" + 500 * count + "万元人民币!");
                                    break;
                                case 2:
                                    System.out.println("恭喜您中奖,获得二等奖!单注奖金20万元人民币,您一共获得:" + 20 * count + "万元人民币!");
                                    break;
                                case 3:
                                    System.out.println("恭喜您中奖,获得三等奖!单注奖金3000元人民币,您一共获得:" + 3000 * count + "元人民币!");
                                    break;
                                case 4:
                                    System.out.println("恭喜您中奖,获得四等奖!单注奖金200元人民币,您一共获得:" + 200 * count + "元人民币!");
                                    break;
                                case 5:
                                    System.out.println("恭喜您中奖,获得五等奖!单注奖金10元人民币,您一共获得:" + 10 * count + "元人民币!");
                                    break;
                                case 6:
                                    System.out.println("恭喜您中奖,获得六等奖!单注奖金5元人民币,您一共获得:" + 5 * count + "元人民币!");
                                    break;
                                case 0:
                                    System.out.println("对不起,您没有中奖!感谢您对福利事业的贡献,欢迎下次购买!");
                                    break;
                            }
                        } else { //没有购买彩票,返回提示信息
                            System.out.println("请先购买彩票!");
                        }
                        break;
                    case 3: //退出功能
                        System.out.println("确认是否退出? Y/N ");
                        String isExit = sc.next();
                        if ("Y".equals(isExit)) {
                            System.out.println("感谢您的使用,再见!");
                            return;
                        }
                }
            }
        }
    
        //定义一个方法,用于生成开奖号码
        public static int[] getLuckBalls(){
            //int[] luckBalls = {1,2,3,4,5,6,7}; //测试用
            int[] luckBalls = new int[7];
            /*双色球生成规则:
            * 红球范围[1,33],蓝球范围[1,16]
            * 使用Math.random()进行随机数的选取
            * Math.random()——>[0.0,1.0)
            * Math.random()*33——>[0.0,33.0)
            * (int)(Math.random()*33)——>[0,33)——>[0,32]
            * (int)(Math.random()*33)+1——>[1,33]
            * 完成1-33的随机数的选取*/
            for (int i = 1; i <= 7; i++) {
                if (i!=7){
                    //6次红球随机数的生成,为了防止随机数的生成产生重复数字,进行双重循环嵌套(现实彩票摇球不可能出现重复数字)
                    luckBalls[i-1] = (int)(Math.random()*33)+1; //先把数学随机数方法得到的彩球数字传入数组中
                    for (int j = 1; j < i; j++) { //设置自检for循环
                       while (luckBalls[i-1] == luckBalls[j-1]){ //通过循环判断后一个数与前面数字是否一致
                           i--; //如果一致,则将传入的次数进行回退,重新获取
                       }
                    }
                }else {
                    //1次蓝球随机数生成
                    luckBalls[6] = (int)(Math.random()*16)+1;
                }
            }
            return luckBalls;
        }
    
        //定义一个方法,用于比对开奖号与购买号的情况,判断开奖结果
        public static int getLevels(int[] balls, int[] luckballs){
            int level = 0; //初始值为0
            //分别使用两个计数器用于计算红球与蓝球的中奖个数
            int redCount = 0;
            int blueCount = 0;
            //对购买的号码进行遍历
            for (int i = 0; i <= 6; i++) {
                if (i!=6){
                    //比对红球
                    for (int j = 0; j <= 5; j++) {
                        if (balls[i]==luckballs[j]){
                            redCount++;
                        }
                    }
                }else {
                    //比对蓝球
                    if (balls[6]==luckballs[6]){
                        blueCount++;
                    }
                }
            }
            System.out.println("红球中奖个数:" + redCount);
            System.out.println("蓝球中奖个数:" + blueCount);
            //根据上述的中奖个数获取中奖等级
            if (redCount==6 && blueCount==1){
                level = 1;
            } else if (redCount==6){
                level = 2;
            } else if (redCount==5 && blueCount==1){
                level = 3;
            } else if (redCount==5 ||(redCount==4 && blueCount==1)){
                level = 4;
            } else if (redCount==4 ||(redCount==3 && blueCount==1)){
                level = 5;
            } else if (redCount==3 ||(redCount==2 && blueCount==1) ||(redCount==1 && blueCount==1) ||blueCount==1){
                level = 6;
            }else {
                return level;
            }
            return level;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207

    细节1:数字选择的判定

    数字的判定在多处使用,如:

    1. 选择系统以外的功能
      为了防止用户在初始界面选择系统给出的数字以外的功能,在此实施录入数字的过滤
    //对录入数字进行初步过滤
                while (choice!=1&&choice!=2&&choice!=3){ //使用while不用if避免多次录入非标数据再次报错
                    System.out.println("对不起,其他功能正在开发中,请重新输入功能选择:");
                    int newChoice = sc.nextInt();
                    choice = newChoice; //将新录入的数字再次传回choice中进行下述选择
                }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 彩民彩票购买单注数量界限在1-100之间
    count = sc.nextInt(); //购票数量,原则上不会为负数,不超过100注
                        if(count<1 || count >100) {
                            System.out.println("彩票数量购买失败!请重新选择票注:");
                            count = sc.nextInt();
                        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 红/蓝球的数字选择界限在1-33/1-16之间
    if(redBall<1 || redBall >33) {
                                    System.out.println("红球输入数字不在数字范围中,请重新选择第"+i+"个红球数字:");
                                    redBall = sc.nextInt();
                                }
    
    • 1
    • 2
    • 3
    • 4
    1. 获取开奖随机的红/蓝球数字选择界限在1-33/1-16之间
    int[] luckBalls = new int[7];
            /*双色球生成规则:
            * 红球范围[1,33],蓝球范围[1,16]
            * 使用Math.random()进行随机数的选取
            * Math.random()——>[0.0,1.0)
            * Math.random()*33——>[0.0,33.0)
            * (int)(Math.random()*33)——>[0,33)——>[0,32]
            * (int)(Math.random()*33)+1——>[1,33]
            * 完成1-33的随机数的选取*/
            for (int i = 1; i <= 7; i++) {
                if (i!=7){
                    //6次红球随机数的生成,为了防止随机数的生成产生重复数字,进行双重循环嵌套(现实彩票摇球不可能出现重复数字)
                    luckBalls[i-1] = (int)(Math.random()*33)+1; //先把数学随机数方法得到的彩球数字传入数组中
                    for (int j = 1; j < i; j++) { //设置自检for循环
                       while (luckBalls[i-1] == luckBalls[j-1]){ //通过循环判断后一个数与前面数字是否一致
                           i--; //如果一致,则将传入的次数进行回退,重新获取
                       }
                    }
                }else {
                    //1次蓝球随机数生成
                    luckBalls[6] = (int)(Math.random()*16)+1;
                }
            }
            return luckBalls;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    细节2:数字选择重复的判定

    数字重复的判定在多处使用,如:

    1. 彩民选择红球的数字不能重复
    							balls[i-1] = redBall; //初步筛选后,传入数组下标0-5对应的红球1-6
                                for (int j = 1; j < i; j++) { //设置红球选择重复的自检for循环
                                    if (balls[i-1] == balls[j-1]){ //通过循环判断后一个数与前面数字是否一致
                                        //如果一致表示出现重复,则将传入的次数进行回退,给出提示信息并重新获取
                                        System.out.println("红球输入数字重复,请重新选择第"+i+"个红球数字:");
                                        i--;
                                        redBall = sc.nextInt();
                                    }
                                }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 系统生成随机红球的数字不能重复
    for (int i = 1; i <= 7; i++) {
                if (i!=7){
                    //6次红球随机数的生成,为了防止随机数的生成产生重复数字,进行双重循环嵌套(现实彩票摇球不可能出现重复数字)
                    luckBalls[i-1] = (int)(Math.random()*33)+1; //先把数学随机数方法得到的彩球数字传入数组中
                    for (int j = 1; j < i; j++) { //设置自检for循环
                       while (luckBalls[i-1] == luckBalls[j-1]){ //通过循环判断后一个数与前面数字是否一致
                           i--; //如果一致,则将传入的次数进行回退,重新获取
                       }
                    }
                }else {
                    //1次蓝球随机数生成
                    luckBalls[6] = (int)(Math.random()*16)+1;
                }
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    细节3:用户操作失误的判定

    1. 没有购买彩票直接选择开奖
    //设置购买状态,防止用户不购买彩票直接查看开奖,造成误导
            boolean isBuy = false; //初始状态为false
            if (isBuy){
                            System.out.println("双色球彩票系统————开奖界面:");
                            }
                        } else { //没有购买彩票,返回提示信息
                            System.out.println("请先购买彩票!");
                        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 不想退出手误按到退出功能的迂回操作
    case 3: //退出功能
                        System.out.println("确认是否退出? Y/N ");
                        String isExit = sc.next();
                        if ("Y".equals(isExit)) {
                            System.out.println("感谢您的使用,再见!");
                            return;
                        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    未补齐的缺陷

    还有没实现的地方,比如在获取开奖结果后,再次获取开奖结果的时候,系统将会自动把我们的彩票传入新的自建的随机数开奖数组中,即一次性的开奖。

  • 相关阅读:
    [PAT-Advanced] A1025. PAT Ranking (25)
    操作系统——信号
    ubuntu部署k8s
    视频监控管理平台/视频汇聚/视频云存储EasyCVR安全检查的相关问题及解决方法3.0
    数仓模块ods层—每日行情数据入库(01)
    Unity中Shader纹理的多级渐远Mipmap
    Thymeleaf教程(10分钟入门)
    POJ 2991 Crane 线段树
    Java注解(Java高级)
    什么蓝牙耳机续航强?续航好的蓝牙耳机推荐
  • 原文地址:https://blog.csdn.net/qq_40509784/article/details/126562632