JAVA的双色球 小程序

  还是挺简单的,功能过于强大。

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class doubleRedBall {
    private static Scanner inputScanner;
    /**
     * 顺着思路写 就行
     * 
     * */

    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,blueCount = 0;//用户选择正确的红球数和蓝球数。
        int[] redBall = new int[33];
        inputScanner = new Scanner(System.in);
        Random random = new Random();
        //需要随机生成6个在1-33之间不重复的数(算法)
        for(int i=0;i<redBall.length;i++) {
            redBall[i] = i+1;
        }
        //游戏开始,系统提示。
        System.out.println("定个小目标,先中它一个亿!");
        System.out.println("打算自选号码,还是首选号码? \n请输入\"机选\"或\"手选\"。");
        Boolean answerRight = false;
        while (!answerRight) {
            String choose = inputScanner.next();
            answerRight = true; // 下次默认跳出while
            switch (choose) {
            case "机选":
                computerSelection(redBall, userRedBall);
                userBlueBall = random.nextInt(16) + 1;
                break;
            case "手选":
                System.out.println("请选择6个红球号码(1-33):");
                for(int i=0;i<userRedBall.length;i++) {
                    System.out.println("输入第"+(i+1)+"个号码:");
                    userRedBall[i] = inputScanner.nextInt();
                    if(userRedBall[i]<1|userRedBall[i]>33) {
                        System.out.println("输入有误,请重新输入");
                        i--;
                    }
                }
                System.out.println("请选择1个蓝球号码(1-16):");
                userBlueBall = inputScanner.nextInt();
                
                break;
            default:
                System.out.println("输入有误!请输入\"机选\"或\"手选\"。");
                answerRight = false; // 输入不合法,继续while。
                break;
            }
        }// 至此 用户 球号确定
        //系统随机生成号码。
        computerSelection(redBall, sysRedBall);//虽然 redBall 的顺序变了 但是不影响乱序生成
        sysBlueBall = random.nextInt(16)+1;
        //至此  系统球号确定。
        for(int i=0;i<userRedBall.length;i++) {
            for(int j=0;j<sysRedBall.length;j++) {
                if(userRedBall[i]==sysRedBall[j]) {
                    redCount++;
                }
            }
        }
        if(userBlueBall==sysBlueBall) {
            blueCount++;
        }
        System.out.println("红球一致个数:"+redCount);
        System.out.println("蓝球一致个数:"+blueCount);
        //公布中奖号码
        System.out.println("本期中奖红球号码:");
        Arrays.sort(sysRedBall);
        System.out.println(Arrays.toString(sysRedBall));
        System.out.println("本期中奖蓝球号码:"+sysBlueBall);
        //公布用户号码
        System.out.println("您选择的红球号码:");
        Arrays.sort(userRedBall);
        System.out.println(Arrays.toString(userRedBall));
        System.out.println("您选择的蓝球号码:"+userBlueBall);
        
    }
    //用于在指定数列中 随机生成多个不重复的数的算法。
    /**
     * @param balls 给定的需要在其中选出6个元素的数组
     * @param redBall 存储选出的6个元素的数组
     * 传进来的 ball userRedBall 都会改变。
     */
    public static void computerSelection(int[] balls,int[] userRedBall) {
        
        Random random = new Random();
        int index = -1;
        for(int i=0;i<userRedBall.length;i++) {
             index = random.nextInt(balls.length-1-i);
             userRedBall[i] = balls[index];
             
             balls[index] = balls[index]^balls[balls.length-1-i];
             balls[balls.length-1-i] = balls[index]^balls[balls.length-1-i];
             balls[index] = balls[index]^balls[balls.length-1-i];
        }
        // 此时得到的 userRedBall 就是选出的六个不重复的红球。
    }
    /**
     * @param first
     * @param second
     * @return
     * 尽量优化速度,之后的结果 nlogn 的速度。
     */
    public static int compSame(int[] first,int[] second) { 
        int lenFirst = first.length,lenSecond = second.length;
        int sameNum=0;
        for(int i=0;i<lenFirst;i++) {
            if(Arrays.binarySearch(second, first[i])>=0&Arrays.binarySearch(second, first[i])<lenSecond) {
                sameNum++;
            }
        }
        return sameNum;
        
    }
}
/**
 * 形参和实参的变化。
 * 如果基本类型和String  是存储在栈内存当中的,当被调函数被调用时形参申请空间,开始执行操作,在操作完毕的时候释放 形参申请的空间。这样的话  实参根本没有改变。
 * 如果操作对象是对象的话,形参接受栈内存 内的地址,然后去堆内存中进行操作,此时操作的是 堆内存中的数据,虽然地址没变 ,但是地址指向的空间内的 数据已经改变。 
 * 
 * 
 * */

 

 

 

byte short  int 在计算的时候  会自动转换为  int 类型。

posted @ 2016-06-25 23:13  X-POWER  阅读(5013)  评论(0编辑  收藏  举报