還是挺簡單的,功能過於強大。
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 類型。