java简单实现双色球彩票模拟实例(数组、排序、方法、随机数、键盘输入)

一、双色球游戏的玩法说明:

双色球投注区分为红色号码区和蓝色号码区,红色号码区范围为01~33,蓝色号码区范围为01~16。双色球每期从33个红球中开出6个号码,从16个蓝球中开出1个号码作为中奖号码,双色球玩法即时竞猜开奖号码的6个红球号码和1个蓝球 号码,顺序不限。

奖级图:

java简单实现双色球彩票模拟实例(数组、排序、方法、随机数、键盘输入)_第1张图片

二、案例分析:

1、如何产生蓝球和红球?
2、如何接收用户选号?
3、如何验证是否中奖?
4、公布本期中奖号码?

三、总体设计:

1、整体实现思路
2、随机取值不重复算法(系统和用户)
3、判断是否中奖的逻辑
4、结果输出

四、详细设计及解答案例分析:

1、整体实现思路

  • 定义相关变量
  • 用户选择方式:1.机选,2.手选
  • 接收用户选择号码(6红,1蓝)
  • 生成系统号码(6红,1蓝)
  • 比较用户号码和系统号码,记录相同个数
  • 验证是否中奖
  • 系统号码排序
  • 公布结果

2、随机取值不重复算法(系统和用户)
首先把红球放在一个数组里(1-33),我们叫它redBall,在这里边随机取红球。我们先取出一个,把 这个球赋给系统红球(用户红球),然后把这个球的下标记录下来和最后一个交换位置,最后红球的长度-1,即最后一个不再取,也就是说我们取得这个数不再取了;取第二个的时候最后的红球的长度-1-1,取第三个的时候最后的红球的长度-1-2。我们可以直接理解成:

redBall.length-1-i

其中 i 就是取到第几个球。


不重复的生成随机数代码:

public static void computerSeletion(int[] redBall,int[] userRedBall){
        Random ran = new Random();
        int index = -1;
        for (int i = 0; i < userRedBall.length; i++) {
            index = ran.nextInt(redBall.length-i);
            userRedBall[i] = redBall[index];
            int temp = redBall[index];

            redBall[index] = redBall[redBall.length-1-i];
            redBall[redBall.length-1-i] = temp;
        }
    }

代码中有int index=-1就是取走后的位置先设为-1。

3、统计红球和蓝球的中奖个数

此阶段统计红球的方法和产生不重复的随机数类似,为了高效率,如果有中奖号码,下一轮我们就不再比较此中奖号码,相关代码是:

for (int i = 0; i < userRedBall.length-redCount; i++) {
    for (int j = 0; j < sysRedBall.length; j++) {
        if(userRedBall[i]==sysRedBall[j]){
            int temp = sysRedBall[j];
            sysRedBall[j] = sysRedBall[sysRedBall.length-1-redCount];
            sysRedBall[sysRedBall.length-1-redCount] = temp;
            redCount++;
        }
    }
}

因为中奖的蓝球数只有一个,所以blueCount = 1即可

if(userBlueBall==sysBlueBall){
    blueCount = 1;
}

4、判断是否中奖的逻辑

我们都知道彩票的中奖率还是非常低的,所以我们把一等奖、二等奖等放在最后,即倒着写中奖情况,这样会提高效率。判断中,“且”用“&&”,“或”用“||”。

判断是否中奖的逻辑算法的源代码:

        if(blueCount==0 && redCount <= 3){
            System.out.println("抱歉,您没有中奖!");
        }else if(blueCount==1 && redCount<3){
            System.out.println("恭喜你中了六等奖,5块钱!");
        }else if((blueCount==1 && redCount==3) || (blueCount==0 && redCount==4)){
            System.out.println("恭喜你中了五等奖,10块钱!");
        }else if((blueCount==1 && redCount==4) || (blueCount==0 && redCount==5)){
            System.out.println("恭喜你中了四等奖,300块钱!");
        }else if(blueCount==1 && redCount==5){
            System.out.println("恭喜你中了三等奖,1000块钱!");
        }else if(blueCount==0 && redCount==6){
            System.out.println("恭喜你中了二等奖,15w!");
        }else if(blueCount==1 && redCount==6){
            System.out.println("恭喜你中了一等奖,500w!");
        }else{
            System.out.println("系统有误,中奖无效!");
        }

5、号码排序(系统和用户)
虽然我们设定的数组是排好序的(1-33是按顺序来的),但我们随机取号码(或手选)的时候就可能不按顺序了,同样为了高效,我们最好给取出的数组排以下序,我们可以用冒泡排序(最简单)、直接插入排序等算法实现,此处以冒泡为例。

public static void sort(int[] ball){
    for (int i = 0; i < ball.length-1; i++) {
        for (int j = 0; j < ball.length-1-i; j++) {
            if(ball[j]>ball[j+1]){
                ball[j] = ball[j] + ball[j+1];
                ball[j+1] = ball[j] - ball[j+1];
                ball[j] = ball[j] - ball[j+1];
            }
        }
    }
}

6、似乎我们忘记了点什么,我们设定机选还是手选。
如果是机选的话,直接调用方法即可;
如果是手选的话,我们需要利用Scanner类来写入;
如果没有看到只能选1或2的买家输入了一个3或别的数,我们就在提醒一下这位买家选1还是选2;


写的有点多了,直接交代程序源代码吧:

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

public class Test {
    public static void main(String[] args) {
        //定义相关变量
        int[] userRedBall = new int[6];//用户选择的红色球号码
        int[] sysRedBall = new int[6];//系统生成的红色球号码
        int userBlueBall = 0;//用户选择的蓝球
        int sysBlueBall = 0;
        int redCount = 0;//记录用户选择正确的红色球的个数
        int blueCount = 0;
        int[] redBall = new int[33];//用于存储1-33的红色球的号码

        //填充红色数组
        for (int i = 0; i < redBall.length; i++) {
            redBall[i] = i+1;//存储1-33
        }

        //游戏开始
        System.out.println("双色球游戏开始,Good luck! ");
        System.out.println("请问您是选择机选还是手选(1.机选,2.手选):");

        Scanner scan = new Scanner(System.in);
        Random ran = new Random();
        boolean flag = true;
        while(flag){
            int isAuto = scan.nextInt();
            switch(isAuto){
            //机选
            case 1:
                computerSeletion(redBall,userRedBall);//红球
                userBlueBall = ran.nextInt(16)+1;//蓝球
                flag = false;
                break;
            //手选
            case 2:
                System.out.println("请输入您选择的红球号码(1-33):");
                for (int i = 0; i < userRedBall.length; i++) {
                    userRedBall[i] = scan.nextInt();
                }
                System.out.println("请输入您选择的蓝球号码(1-16):");
                userBlueBall = scan.nextInt();
                flag = false;
                break;
            default:
                System.out.println("请问您是选择机选还是手选(1.机选,2.手选):");
                break;
            }
        }

        //系统随机生成号码
        //红球
        computerSeletion(redBall,sysRedBall);
        //蓝球
        sysBlueBall = ran.nextInt(16)+1;

        //统计结果
        //统计红球
        for (int i = 0; i < userRedBall.length-redCount; i++) {
            for (int j = 0; j < sysRedBall.length; j++) {
                if(userRedBall[i]==sysRedBall[j]){
                    int temp = sysRedBall[j];
                    sysRedBall[j] = sysRedBall[sysRedBall.length-1-redCount];
                    sysRedBall[sysRedBall.length-1-redCount] = temp;
                    redCount++;
                }
            }
        }
        //统计蓝球
        if(userBlueBall==sysBlueBall){
            blueCount = 1;
        }

        //验证是否中奖
        if(blueCount==0 && redCount <= 3){
            System.out.println("抱歉,您没有中奖!");
        }else if(blueCount==1 && redCount<3){
            System.out.println("恭喜你中了六等奖,5块钱!");
        }else if((blueCount==1 && redCount==3) || (blueCount==0 && redCount==4)){
            System.out.println("恭喜你中了五等奖,10块钱!");
        }else if((blueCount==1 && redCount==4) || (blueCount==0 && redCount==5)){
            System.out.println("恭喜你中了四等奖,300块钱!");
        }else if(blueCount==1 && redCount==5){
            System.out.println("恭喜你中了三等奖,1000块钱!");
        }else if(blueCount==0 && redCount==6){
            System.out.println("恭喜你中了二等奖,15w!");
        }else if(blueCount==1 && redCount==6){
            System.out.println("恭喜你中了一等奖,500w!");
        }else{
            System.out.println("系统有误,中奖无效!");
        }

        //公布结果
        System.out.println("本期中奖红球号码为:");
        sort(sysRedBall);
        System.out.println(Arrays.toString(sysRedBall));
        System.out.println("本期中奖蓝球号码为:"+sysBlueBall);

        System.out.println("您选择的红球号码是:");
        sort(userRedBall);
        System.out.println(Arrays.toString(userRedBall));
        System.out.println("您选择的蓝球号码是:"+userBlueBall);

        System.out.println("买双色球,造福你我他。谢谢!");
    }

    //冒泡排序
    public static void sort(int[] ball){
        for (int i = 0; i < ball.length-1; i++) {
            for (int j = 0; j < ball.length-1-i; j++) {
                if(ball[j]>ball[j+1]){
                    ball[j] = ball[j] + ball[j+1];
                    ball[j+1] = ball[j] - ball[j+1];
                    ball[j] = ball[j] - ball[j+1];
                }
            }
        }
    }
    //用于在指定的数组中,随机生成多个不重复的数据(算法)
    /**
     * 
     * @param redBall
     * @param userRedBall
     * 在redBall数组里随机先选一个数,让选择的数的下标和最后一个下标交换位置,
     * 存给temp赋值给userRedBall,redBall的长度-1-i;
     */
    public static void computerSeletion(int[] redBall,int[] userRedBall){
        Random ran = new Random();
        int index = -1;
        for (int i = 0; i < userRedBall.length; i++) {
            index = ran.nextInt(redBall.length-i);
            userRedBall[i] = redBall[index];
            int temp = redBall[index];

            redBall[index] = redBall[redBall.length-1-i];
            redBall[redBall.length-1-i] = temp;
        }
    }
}

说明:此程序是我看了千锋教育的视频讲解,然后把程序代码自己试着敲出来的,当然,中间有不明白的地方又返回去继续看,所以代码是一样的,请不要误会。不明白的地方可以在评论区留言,我会详细解答;也可以发我邮箱询问,有你想不到的福利哦~

我的邮箱地址:[email protected]

你可能感兴趣的:(java案例)