Java 创造彩票

Java 创造彩票,java,user-input,Java,User Input,生成三位数的彩票。程序提示用户输入一个三位数的数字,然后 根据以下规则确定用户是否获胜: (第1条)。如果用户输入与彩票号码的准确顺序匹配,则奖励为 $10,000. (第2条)。如果用户输入中的所有数字与彩票号码中的所有数字匹配,则奖励无效 $3,000. (第3条)。如果用户输入中的一个数字与彩票号码中的一个数字匹配,则奖励为 1000美元 我需要帮助,使我的程序能够在代码中看到的所有内容中正常运行。没有数组,没有字符串,只有已经存在的内容。我的问题是,如果忽略规则2,我无法猜测110。我将

生成三位数的彩票。程序提示用户输入一个三位数的数字,然后 根据以下规则确定用户是否获胜: (第1条)。如果用户输入与彩票号码的准确顺序匹配,则奖励为 $10,000. (第2条)。如果用户输入中的所有数字与彩票号码中的所有数字匹配,则奖励无效 $3,000. (第3条)。如果用户输入中的一个数字与彩票号码中的一个数字匹配,则奖励为 1000美元

我需要帮助,使我的程序能够在代码中看到的所有内容中正常运行。没有数组,没有字符串,只有已经存在的内容。我的问题是,如果忽略规则2,我无法猜测110。我将其设置为100以测试所有规则

import java.util.Scanner;

public class NewClass {
    public static void main(String[] args) {
        int lottery = 100;

 // Prompt the user to enter a guess
        Scanner input = new Scanner(System.in);
        System.out.print("Enter your lottery pick (three digits): ");
        int guess = input.nextInt();

 // Get digits from lottery
        int lotteryDigit1 = lottery / 100;
        int lotteryDigit2 = (lottery % 100) / 10;
        int lotteryDigit3 = lottery % 10;

 // Get digits from guess
        int guessDigit1 = guess / 100;
        int guessDigit2 = (guess % 100) / 10;
        int guessDigit3 = guess % 10;

        System.out.println("The lottery number is " + lottery);

 // RULE1 Check the guess
        if (guess == lottery)
            System.out.println("Exact match: you win $10,000");
 // RULE2   
        else if ((guessDigit1 == lotteryDigit1
            || guessDigit1 == lotteryDigit2 
            || guessDigit1 == lotteryDigit3)
            && (guessDigit2 == lotteryDigit1
            || guessDigit2 == lotteryDigit2
            || guessDigit2 == lotteryDigit3)
            && (guessDigit3 == lotteryDigit1
            || guessDigit3 == lotteryDigit2
            || guessDigit3 == lotteryDigit3))
            System.out.println("Match all digits: you win $3,000");
    // RULE3
        else if ((guessDigit1 == lotteryDigit1
            || guessDigit1 == lotteryDigit2
            || guessDigit1 == lotteryDigit3)
            || (guessDigit2 == lotteryDigit1
            || guessDigit2 == lotteryDigit2
            || guessDigit2 == lotteryDigit3)
            || (guessDigit3 == lotteryDigit1
            || guessDigit3 == lotteryDigit2
            || guessDigit3 == lotteryDigit3))   
            System.out.println("Match one digit: you win $1,000");

        else
            System.out.println("Sorry, no match");
    }
 }
更新:

import java.util.Scanner;
    public class NewClass {
        public static void main(String[] args) {
        int lottery = 456;

 // Prompt the user to enter a guess
        Scanner input = new Scanner(System.in);
        System.out.print("Enter your lottery pick (three digits): ");
        int guess = input.nextInt();

 // Get digits from lottery
        int lotteryDigit1 = lottery / 100;
        int lotteryDigit2 = (lottery % 100) / 10;
        int lotteryDigit3 = lottery % 10;

 // Get digits from guess
        int guessDigit1 = guess / 100;
        int guessDigit2 = (guess % 100) / 10;
        int guessDigit3 = guess % 10;

        System.out.println("The lottery number is " + lottery);

  // Sum up both sets of digits to compare for 3 inconsecutive matches
        int guessSum = guessDigit1 + guessDigit2 + guessDigit3;
        int lotterySum = lotteryDigit1 + lotteryDigit2 + lotteryDigit3;

 // RULE1 Check the guess
        if (guess == lottery)
            System.out.println("Exact match: you win $10,000");
 // RULE2   
        else if ((guessDigit1 == lotteryDigit1
            || guessDigit1 == lotteryDigit2 
            || guessDigit1 == lotteryDigit3)
            && (guessDigit2 == lotteryDigit1
            || guessDigit2 == lotteryDigit2
            || guessDigit2 == lotteryDigit3)
            && (guessDigit3 == lotteryDigit1
            || guessDigit3 == lotteryDigit2
            || guessDigit3 == lotteryDigit3)
            && guessSum == lotterySum)      
            System.out.println("Match all digits: you win $3,000");
// RULE3
        else if ((guessDigit1 == lotteryDigit1
            || guessDigit1 == lotteryDigit2
            || guessDigit1 == lotteryDigit3)
            || (guessDigit2 == lotteryDigit1
            || guessDigit2 == lotteryDigit2
            || guessDigit2 == lotteryDigit3)
            || (guessDigit3 == lotteryDigit1
            || guessDigit3 == lotteryDigit2
            || guessDigit3 == lotteryDigit3))   
            System.out.println("Match one digit: you win $1,000");

        else
            System.out.println("Sorry, no match");
    }
 }

这似乎是最有效的。我一直在通过数字来验证猜测的正确性。我没有遇到一个错误的猜测
&&guessSum==lotterySum)
仅与规则2一起使用。

这里的问题是您有重复项,因此规则2的当前条件计算为100 110的true

为了消除这种影响,通常的变体是对数字和比较中的数字进行排序,如下所示(伪语言):

如果不能使用数组,以下是对3位数字进行排序的简单函数:

int sortDigits(int n) {
int d1 = n/100;
int d2 = (n/10)%10;
int d3 = n%10;

int min = Math.min(d1, Math.min(d2, d3));
int max = Math.max(d1, Math.max(d2, d3));
int mid = -1;
if (min == d1) mid = Math.min(d2, d3);
else if (min == d2) mid = Math.min(d1, d3);
else mid = Math.min(d1, d2);

return (min*100) + (mid*10) + max;
}

你的问题是,你用彩票的每一个数字检查猜测的每一个数字。这就是你得到错误的原因,你需要记住你匹配了什么。 要做到这一点,一个真正快速而肮脏的解决方案是检查double并将其替换为一个永远不会匹配的值,如-1:

    if(guessDigit1 == guessDigit2){
        guessDigit1 = -1;
    }
    else if (guessDigit1 == guessDigit3 ) {
        guessDigit1 = -1;
    }
    else if (guessDigit2 == guessDigit3 ) {
        guessDigit2 = -1;
    }
请注意,这根本不是最好的解决方案

更新:为了记住您检查的内容,您必须实现许多if条件。其中一个的伪代码如下所示:

If guessDigit2 == lotteryDigit1 
    if guessDigit1 == lotteryDigit2 
        if guessDigit3 == lotteryDigit3
             -> You found all digits
    else if guessDigit1 == lotteryDigit3
        if guessDigit3 == lotteryDigit2
        -> You found all digits

当然,您必须实现这个代码*3,因为您需要为guessDigit1==lotteryDigit1和guessDigit3==lotteryDigit1创建另外两个ifs。

您的规则2的条件是错误的;它当前的意思是(用伪代码):

这显然不是你想要的,因为它意味着多个猜测数字可以匹配同一个彩票数字,就像你在
110
匹配
100
中遇到的那样-因为
1
0
都在中奖号码中,所以即使它不应该也会通过


相反,您希望将每个数字与其余数字匹配。“正确”的方法是使用a,但听起来你还不能使用它们。你可以手动完成,写下所有的案例只需要一点工作。基本上,您将猜测的一个数字与彩票的一个数字进行比较,然后将剩余的两个猜测数字与剩余的两个彩票数字进行比较。对每个数字重复冲洗。

我认为问题在于你没有考虑重复的数字。您可以检查以确保所有数字都与样本号相加,即:

1+1+0 = 2
1+0+0 = 1
1!=2
Move onto rule 3. 
使用此代码:

guessDigit1  + guessDigit2 + guessDigit3 == lotteryDigit1 + lotteryDigit2 + lotteryDigit3
我不知道这是否能解决您所有的问题,但这只是一个开始,它应该能用“110”值解决您当前的问题。祝你好运

正如@dimo414(以及其他答案)所提到的,您需要某种内存来检查哪些数字。以下条件将为您提供所需的排列。如果
matched1
matched2
matched3
在末尾是
-1
,则它不是匹配项

import java.util.Scanner;

public class NewClass {
    public static void main(String[] args) {
        int lottery = 100;

        // Prompt the user to enter a guess
        Scanner input = new Scanner(System.in);
        System.out.print("Enter your lottery pick (three digits): ");
        int guess = input.nextInt();

        // Get digits from lottery
        int lotteryDigit1 = lottery / 100;
        int lotteryDigit2 = (lottery % 100) / 10;
        int lotteryDigit3 = lottery % 10;

        // Get digits from guess
        int guessDigit1 = guess / 100;
        int guessDigit2 = (guess % 100) / 10;
        int guessDigit3 = guess % 10;

        System.out.println("The lottery number is " + lottery);

        int matched1 = -1;
        int matched2 = -1;
        int matched3 = -1;

        // RULE1 Check the guess
        if (guess == lottery) {
            System.out.println("Exact match: you win $10,000");
        } 
        // RULE2   
        else {
            if (guessDigit1 == lotteryDigit1) {
                matched1 = 1;
                if (guessDigit2 == lotteryDigit2) {
                    matched2 = 2;
                    if (guessDigit3 == lotteryDigit3) {
                        matched3 = 3;
                    }
                } else if (guessDigit2 == lotteryDigit3) {
                    matched2 = 3;
                    if (guessDigit3 == lotteryDigit2) {
                        matched3 = 2;
                    }
                }
            } else if (guessDigit1 == lotteryDigit2) {
                matched1 = 2;
                if (guessDigit2 == lotteryDigit1) {
                    matched2 = 1;
                    if (guessDigit3 == lotteryDigit3) {
                        matched3 = 3;
                    }
                } else if (guessDigit2 == lotteryDigit3) {
                    matched2 = 3;
                    if (guessDigit3 == lotteryDigit1) {
                        matched3 = 1;
                    }
                }
            } else if (guessDigit1 == lotteryDigit3) {
                matched1 = 3;
                if (guessDigit2 == lotteryDigit1) {
                    matched2 = 1;
                    if (guessDigit3 == lotteryDigit2) {
                        matched3 = 2;
                    }
                } else if (guessDigit2 == lotteryDigit2) {
                    matched2 = 2;
                    if (guessDigit3 == lotteryDigit1) {
                        matched3 = 1;
                    }
                }
            }

            if (matched1 != -1 && matched2 != -1 && matched3 != -1) {
                System.out.println("Match all digits: you win $3,000");
            } 
            // RULE3
            else if ((guessDigit1 == lotteryDigit1 || guessDigit1 == lotteryDigit2 || guessDigit1 == lotteryDigit3)
                    || (guessDigit2 == lotteryDigit1 || guessDigit2 == lotteryDigit2 || guessDigit2 == lotteryDigit3)
                    || (guessDigit3 == lotteryDigit1 || guessDigit3 == lotteryDigit2 || guessDigit3 == lotteryDigit3)) {  
                    System.out.println("Match one digit: you win $1,000");
            } else {
                System.out.println("Sorry, no match");
            }
        }
    }
 }
首先检查您猜测的第一个数字是否是彩票的第一个数字。如果是这样,它会将matched1(用于猜测的数字)与值1(用于彩票中的第一个数字)一起保存。然后将第二个猜测的数字与彩票的数字2和3进行比较。我们不会再次检查您猜测的第二位数与彩票的第一位数,因为我们已经知道第一个猜测与第一个彩票匹配。如果第一个数字与第一个彩票号码不匹配,那么我们看看猜测的第一个数字是否是彩票号码的第二个数字,然后冲洗并重复。(如果是这样,那么matched1将是彩票第二位数的2。)


(matched1,matched2,matched3)的所有匹配值为(1,2,3)、(1,3,2)、(2,1,3)、(2,3,1)、(3,1,2)和(3,2,1)。您可以看到上面嵌套的if语句中如何涵盖所有这些排列。

相反,您希望将每个数字与其余数字匹配。要做到这一点,“正确”的方法是使用一套设备,但听起来你还不能使用这些设备。你可以手动完成,写下所有的案例只需要一点工作。基本上,您将猜测的一个数字与彩票的一个数字进行比较,然后将剩余的两个猜测数字与剩余的两个彩票数字进行比较。对每个数字重复冲洗

会不会是这样的:

else if ((guessDigit1 == lotteryDigit2 
            || guessDigit1 == lotteryDigit3)
            && (guessDigit2 == lotteryDigit1
            || guessDigit2 == lotteryDigit3)
            && (guessDigit3 == lotteryDigit1
            || guessDigit3 == lotteryDigit2))
            System.out.println("Match all digits: you win $3,000");

这就是我所能做的——没有其他公式。用于输入代码的程序对输入非常严格。它只接受设置为接受的内容。

我想我知道这一点,这可能是因为110在规则2中是正确的,在规则3中也是正确的,这就是为什么它显示两个规则的输出。这是规则2的布尔表达式

((guessDigit1 == lotteryDigit2
            && guessDigit2 == lotteryDigit3
            && guessDigit3 == lotteryDigit1)
            || (guessDigit1 == lotteryDigit3
            && guessDigit2 == lotteryDigit1
            && guessDigit3 == lotteryDigit2)
            || (guessDigit1 == lotteryDigit1
            && guessDigit2 == lotteryDigit3
            && guessDigit3 == lotteryDigit2)
            || (guessDigit1 == lotteryDigit3
            && guessDigit2 == lotteryDigit2
            && guessDigit3 == lotteryDigit1)
            || (guessDigit1 == lotteryDigit2
            && guessDigit2 == lotteryDigit1
            && guessDigit3 == lotteryDigit3))

所有可能的答案都在那里。

第一个
中的
&&
|
的混合可能会导致问题。尝试在单独的语句中检查每个数字,或嵌套它们。对这些数字求和将不起作用,这将导致大量冲突。例如,如果彩票是
456
,猜测
178
将符合规则2。我的意思是,除了已经存在的代码之外,还要求和数字,作为规则2的额外检查。但不可否认,这可能不是最全面的解决方案,它完全是错误的。对数字求和不可能正确地符合规则2……而且你已经一针见血了--至少在某种程度上我能理解。我知道它是这样做的,但我认为这是必要的
else if ((guessDigit1 == lotteryDigit2 
            || guessDigit1 == lotteryDigit3)
            && (guessDigit2 == lotteryDigit1
            || guessDigit2 == lotteryDigit3)
            && (guessDigit3 == lotteryDigit1
            || guessDigit3 == lotteryDigit2))
            System.out.println("Match all digits: you win $3,000");
((guessDigit1 == lotteryDigit2
            && guessDigit2 == lotteryDigit3
            && guessDigit3 == lotteryDigit1)
            || (guessDigit1 == lotteryDigit3
            && guessDigit2 == lotteryDigit1
            && guessDigit3 == lotteryDigit2)
            || (guessDigit1 == lotteryDigit1
            && guessDigit2 == lotteryDigit3
            && guessDigit3 == lotteryDigit2)
            || (guessDigit1 == lotteryDigit3
            && guessDigit2 == lotteryDigit2
            && guessDigit3 == lotteryDigit1)
            || (guessDigit1 == lotteryDigit2
            && guessDigit2 == lotteryDigit1
            && guessDigit3 == lotteryDigit3))