題目為:抽彩是從多個數字中隨機抽取幾個不重復的值,進行排序輸出且判斷是否中獎,若中獎則輸出中獎次數,若未中獎則給出提示,
輸出結果示例:

代碼可為:
package Three.NewLearn;
import java.util.Arrays;
import java.util.Scanner;
public class 抽彩游戲 {
public static void main(String[] args) {
int count = 0;
//定義一個計量數,計算中獎了幾次
Scanner sc = new Scanner(System.in);
System.out.println("請輸入您要抽取數字的最高數:");
int n = sc.nextInt();
//設定一個n存放最高位數值
int n1 = n;
//定義了一個n1與n的數值相同
System.out.println("請輸入您要抽取幾個數字(1~"+n+"):");
int k = sc.nextInt();
//設定了抽取數
if(k>n){
System.out.println("對不起,您輸入的數字不符合規范!");
//若此時抽取數比最高數要低則報錯
}else{
int[] numbers = new int[n];
int[] numbers2 = new int[n1];
//定義了兩個陣列,其長度分別與n和n1相同
for (int i = 0; i < numbers.length; i++) {
numbers[i] = i+1;
//對陣列numbers進行從1~n的賦值;
}
for (int i = 0; i < numbers2.length; i++) {
numbers2[i] = i+1;
//對陣列numbers2進行從1~n1的賦值;
}
int[] result = new int[k];
//定義了result陣列使其長度等于抽取數k
for (int i = 0; i < result.length; i++) {
int r =(int) (Math.random()*n);
//此時的Math.random()*n為double型別需要強制轉換為int型別,
result[i] = numbers[r];
//選擇亂數numbers[r]賦值給result[i]
numbers[r] = numbers[n - 1];
n--;
//這里確保了不會再次抽取到同一個值
}
int[] winning = new int[k];
for (int i = 0; i < winning.length; i++) {
int w = (int) (Math.random()*n);
winning[i] = numbers2[w];
numbers2[w] = numbers2[n1 - 1];
n1--;
}
Arrays.sort(result);
//對陣列進行排序
System.out.println("抽取完成,您抽取的數為:");
for(int r :result){
System.out.print(r+" ");
}
//使用foreach回圈對陣列進行遍歷
System.out.println("");
//換行
Arrays.sort(winning);
System.out.println("中獎數為:");
for (int w:winning){
System.out.print(w+" ");
}
for (int x = 0; x < result.length; x++) {
for (int y = 0; y < winning.length; y++) {
if(result[x] == winning[y]){
count++;
}
}
}
//使用兩個for回圈且利用if陳述句對陣列的值進行判斷
//若有相同值則count計數值自增
System.out.println("");
if(count == 0){
System.out.println("對不起,您未中獎,請再接再厲!");
}else{
System.out.println("恭喜您,您中獎了"+count+"次");
}
}
}
}
介紹一下思路:
因為這個游戲是全程都要鍵盤輸入所以我先定義了一個Scanner方法,
而抽彩游戲需要先定義它的范圍,所以我定義了一個整形n去存盤它的最高值,然后再定義一個整形k去存盤我需要抽取的數量,那為什么還會有個n1=n呢?這個我們等等會講到,
等輸入完之后需要判斷n和k的值,若n>k則沒問題繼續下面的程式,若n<k則不行,因為這里要抽取的值是不重復的而抽取出來的數量比它定義的范圍還要大肯定是不行的,所以我們用if else陳述句進行判斷,
接下來先定義一個陣列numbers來存盤抽彩的值,所以我將值1,2,3,···,n全部存盤到陣列numbers中,此時可以利用for回圈對陣列進行賦值,
而第三個陣列result和第四個陣列winning存放抽取出來的數,其中使用Math.random方法回傳一個0~1之間(包含0、不包含1)的隨機浮點數,此時使用n去乘這個浮點數,就可以得到從0~n-1之間的一個亂數,但是此時得到的還是浮點數,所以我用強制轉換將浮點數轉換為int型別且用一個變數r去存盤這個亂數的值,
接下來就是重點了,如何解決重復這個問題呢?
這里我將result的第i個元素設定為numbers[r]存放的值,最初是r+1.
即:
result[i] = numbers[r];
若這樣設定numbers陣列的內容在每一次抽取之后都會發生變化,
所以我這里使用陣列中的最后一個數覆寫numbers[r],并將n減1.
即:
numbers[r] = numbers[n-1];
n--;
其中的關鍵在于每次抽取的都是下標(索引),而不是實際的值,而下標指向陣列中尚未抽取過的值,
而winning陣列就不能再用n這個值,否則會出現兩個陣列抽取的值會永不相同,所以需要重新定義一個陣列與一個變數來進行重新計數和抽取,至于抽取原理與上面相同,
在抽取過k個數之后,可以對result陣列進行排序可以使用Arrays.sort()方法,
在最后使用兩個for陳述句回圈,進行判斷兩個抽取出來的陣列中的值是否相同,若相同則計數的變數count進行自增,
最后輸出結果,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/335316.html
標籤:其他
上一篇:KN戰爭游戲(文字版)
下一篇:1024為大家帶來個猜數字游戲
