【问题标题】:Lottery program using arrays and methods (Java)使用数组和方法的彩票程序(Java)
【发布时间】:2021-03-17 10:48:48
【问题描述】:

我正在制作一个彩票程序,模拟一个人选择 6 个中奖号码并使用方法抽取中奖号码。

这是一个示例输出

Enter your numbers:

25
31
20
8
47
31

The winning numbers are:
48 16 28 38 46 36

0 out of the 6 numbers you chose are winning numbers, better luck next time!

我的问题是查找总匹配数字的方法不起作用,我不知道如何解决它。用户输入的数字和开奖随机数都是数组

这是我的代码:

import java.util.*;

public class Main {

    private static boolean[] lottery;
    private static boolean[] array;

    public static void main(String[] args) {

        getUserNumbers();

        getRandomNumbers();

        getTotalMatchedNumbers();

}


    public static void getRandomNumbers(){

            int[] lottery = new int[6];
            int lotteryNumbers;
        
            for (int i = 0; i < 6; i++) {
                lotteryNumbers = (int) (Math.random() * 50);
                for (int x = 0; x < i; x++) {
                    if (lottery[x] == lotteryNumbers)
                    {
                        lotteryNumbers = (int) (Math.random() * 50);
                        x = -1;
                    }
        
                }
                lottery[i] = lotteryNumbers;
            }
            
            System.out.println("The winning numbers are: ");
            for (int i = 0; i < lottery.length; i++)
                System.out.print(lottery[i] + " ");
        
        }
    

    public static void getUserNumbers(){
        Scanner scanner = new Scanner(System.in);
         
            int[] array = new int[10];  
    
        System.out.println("Enter your numbers: "); 
    
        for(int i=0; i < 6; i++){  
      
            array[i]=scanner.nextInt();  
    
        }  

        System.out.println("You have entered: ");  

        for (int i=0; i < 6; i++){  
            System.out.print(array[i]);  
            System.out.print(" ");
            System.out.println(" ");
           
        }  
    }

    public static void getTotalMatchedNumbers(){

        int matched = 0;
        for(int i = 0; i < 6; i++){
            for(int j = 0;j < 6; j++){
                if(lottery[i] == array[j]){
                        matched = matched + 1;
                }
            }
            if (matched != 6){
                System.out.println(matched + " out of the 6 numbers you chose are winning numbers, better luck next time!");
            }
            else{
                System.out.println("You got picked all the winning numbers! You win!");
            }
        }

    }
}

【问题讨论】:

  • 乍一看,在您的getUserNumbers() 中,您正在创建一个新的局部变量int[] array,而不是使用您定义的类级变量。 getRandomNumbers 中的 int[] lottery 也是如此。
  • 您在填写字段时将lotteryarray 重新定义为局部变量。改用类的字段。
  • 该示例是否输出了您正在获得的、您希望获得的的示例?

标签: java arrays for-loop input methods


【解决方案1】:

最好提供接受一些参数并返回结果的函数,而不是在函数之外修改一些变量/字段,因为它有助于避免许多错误并便于对此类函数进行测试。

另外,如果相同的数字/值在代码中出现多次,最好将其提取到一个单独的常量中,以减少代码中可能需要更改的位置的数量,例如,上面的代码在所有方法中都包含6,因此如果需要更改这个绝对单一的参数,很多地方都需要更新。

因此,可以像这样增强代码:

// main method
final int NUM_COUNT = 6;
final int LOTTERY_SIZE = 12; // use small number for testing purpose

int[] userNums = getUserNumbers(NUM_COUNT, 1, LOTTERY_SIZE);
int[] lottery  = getLotteryNumbers(NUM_COUNT, 1, LOTTERY_SIZE);

System.out.print("The winning numbers are: ");
Arrays.stream(lottery).forEach(i -> System.out.print(i + " "));
System.out.println();

int win = getWinCount(lottery, userNums);

System.out.printf("%d out of %d numbers guessed.%n", win, NUM_COUNT);

if (win == NUM_COUNT) {
    System.out.println("You won the jackpot!");
}else {
    System.out.println("Better luck next time!");
}

读取用户输入的数字并验证用户输入。

public static int[] getUserNumbers(int numCount, int minNum, int maxNum) {
    int[] userNums = new int[numCount];
    Scanner input = new Scanner(System.in);
    System.out.printf("Input %d numbers between %d and %d%n", numCount, minNum, maxNum);
    for (int i = 0; i < numCount; i++) {
        userNums[i] = input.nextInt();
        if (userNums[i] < minNum || userNums[i] > maxNum) {
            System.out.println("Invalid number, please correct");
            i--;
        }
    }
    return userNums;
}

使用数组生成彩票号码并确保不会出现重复,但在这种情况下使用Set 会更方便。

public static int[] getLotteryNumbers(int numCount, int minNum, int maxNum) {
    Random random = new Random();
    int[] lottery = new int[numCount];
    for (int i = 0; i < numCount; i++) {
        int n = minNum + random.nextInt(maxNum);
        boolean duplicate = false;
        for (int j = i - 1; j >= 0; j--) {
            if (lottery[j] == n) {
                duplicate = true; 
                break;
            }
        }
        if (!duplicate) {
            lottery[i] = n;
        } else {
            i--;
        }
    }
    return lottery;
}

计算猜出的数字的数量。也可以使用Set 和方法retainAll 来实现。

public static int getWinCount(int[] lottery, int[] user) {
    int win = 0;
    for (int i = 0; i < lottery.length; i++) {
        for (int j = 0; j < user.length; j++) {
            if (lottery[i] == user[j]) {
                win++;
                break;
            }
        }
    }
    return win;
}

示例输出

Input 6 numbers between 1 and 12
2 3 6 7 10 11
The winning numbers are: 7 6 3 8 11 5 
4 out of 6 numbers guessed.
Better luck next time!

【讨论】:

    【解决方案2】:

    您应该在与数字相关的方法中使用字段,因为您的数字是在本地方法中生成的,而不是按类生成的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      相关资源
      最近更新 更多