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 类型。