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:数字选择的判定

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

  1. 选择系统以外的功能
    为了防止用户在初始界面选择系统给出的数字以外的功能,在此实施录入数字的过滤
//对录入数字进行初步过滤
            while (choice!=1&&choice!=2&&choice!=3){ //使用while不用if避免多次录入非标数据再次报错
                System.out.println("对不起,其他功能正在开发中,请重新输入功能选择:");
                int newChoice = sc.nextInt();
                choice = newChoice; //将新录入的数字再次传回choice中进行下述选择
            }
  1. 彩民彩票购买单注数量界限在1-100之间
count = sc.nextInt(); //购票数量,原则上不会为负数,不超过100注
                    if(count<1 || count >100) {
                        System.out.println("彩票数量购买失败!请重新选择票注:");
                        count = sc.nextInt();
                    }
  1. 红/蓝球的数字选择界限在1-33/1-16之间
if(redBall<1 || redBall >33) {
                                System.out.println("红球输入数字不在数字范围中,请重新选择第"+i+"个红球数字:");
                                redBall = sc.nextInt();
                            }
  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;

细节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. 系统生成随机红球的数字不能重复
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;
            }
        }

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

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

未补齐的缺陷

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值