如何检查三个数字是否被猜到?

时间:2016-08-08 13:15:41

标签: java

嗨大家好。 我是一个Java新手。这不是作业,我对编程非常热衷,我真的想学习更多。我坚持做一次练习。

基本上我必须创建一个简单的彩票游戏。 用户必须输入0到999之间的一个数字,一个三位数字。

  • 如果猜测完全相同,奖金为10.000 $,
  • 如果猜测大致相同(数字猜到但不按顺序) 奖金为3,000美元
  • 如果猜测不是真的相同(数字猜到== 1)奖品 是1,000 $。

到目前为止我的代码:我不知道如何处理条件2和3.我可以提一些提示或评论吗?

import java.util.Scanner;
public class Test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("Please enter a three digit number");
        int guess = input.nextInt();


        //generate number:
        int lottery = (int)(Math.random() * 1000);

        if ((guess > 999) || (guess < 100)) {
            System.out.println("The number is not a three digit number. The system will exit NOW.");
            System.exit(1);
        }

        else {
            // extract digits from lottery number

            int lotteryDigit1 = lottery / 100;
            int lotteryDigits = lottery % 100;
            int lotteryDigit2 = lottery / 10;
            int lotteryDigit3 = lottery % 10;


            // extract digits from guessed number

            int guessDigit1 = guess / 100;
            int remainingDigits = guess % 100;
            int guessDigit2 = guess / 10;
            int guessDigit3 = guess % 10;

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

            // check the guess:

            if (guess == lottery) {
                System.out.println("Exactly what the number was.");
            }

            else if {
                // digits guessed, but not in exact order (eg. 332 = 233)
            }

            else if {
                // only one digit is guessed (eg. 332 = 442)

            }

        }

    }
}

我可以对代码发表一些评论吗?它是可读的还是可怕的?我真的不知道,因为我真的只是编程的新手。感谢。

2 个答案:

答案 0 :(得分:2)

使用数组,您可以计算实数和猜测数字包含的位数,并与之进行比较。首先制作两个长度为10的数组(每个数字一个插槽),然后为实数中的每个数字将每个相关的“插槽”增加1。对猜测做同样的事情,并进行比较。

我推荐这种方法,因为它可以扩展到4,5或甚至15位数的猜测,而手动编码这些检查很快就会变成一个有很多重复代码的问题。

如果由于某种原因,你不允许使用数组,你可以手动进行计数 - 听起来很容易检查另一组数字中是否存在每个数字,但你会遇到重复的麻烦数字(考虑112,与122相比,将包含“全部”数字;只是数量不正确!)。这将导致许多重复的代码。

这就是这样......

int matchingDigits = 0;
if ( guessDigit1 == lotteryDigit1 || guessDigit1 == lotteryDigit2 || guessDigit1 == lotteryDigit3) {
    matchingDigits++;
}
if ( guessDigit2 == lotteryDigit1 || guessDigit2 == lotteryDigit2 || guessDigit2 == lotteryDigit3) {
    matchingDigits++;
}
if ( guessDigit3 == lotteryDigit1 || guessDigit3 == lotteryDigit2 || guessDigit3 == lotteryDigit3) {
    matchingDigits++;
}

正如您所看到的,它有很多重复的代码,并且它无法正确处理112 vs 122的情况。为了正确处理这个问题,你必须将每个支票拆开并划掉你已经“使用过”的数字......这是可能的,但会导致代码非常冗长。

这是你怎么做的......

boolean digit1Used = false;
boolean digit2Used = false;
boolean digit3Used = false;
int matchingDigits = 0;
if ( guessDigit1 == lotteryDigit1) {
    matchingDigits++;
    digit1Used = true;
} else if ( guessDigit1 == lotteryDigit2) {
    matchingDigits++;
    digit2Used = true;
} else if ( guessDigit1 == lotteryDigit3) {
    matchingDigits++;
    digit3Used = true;
}

if ( guessDigit2 == lotteryDigit1 && !digit1Used) {
    matchingDigits++;
    digit1Used = true;
} else if ( guessDigit2 == lotteryDigit2 && !digit2Used) {
    matchingDigits++;
    digit2Used = true;
} else if ( guessDigit2 == lotteryDigit3 && !digit3Used) {
    matchingDigits++;
    digit3Used = true;
}

if ( guessDigit3 == lotteryDigit1 && !digit1Used) {
    matchingDigits++;
} else if ( guessDigit3 == lotteryDigit2 && !digit2Used) {
    matchingDigits++;
} else if ( guessDigit3 == lotteryDigit3 && !digit3Used) {
    matchingDigits++;
}

请注意,我在第一次检查中省略了对digitUsed的检查,为第三组检查省略了digitUsed的集合 - 因为我们不再使用它们了。正如你所看到的,它真的很长而且它基本上是伪造阵列。因此,为什么不建议这样做。

想象一下15位阵列的解决方案!它是(N + 1 +(N * 3 * N)+ N + N)行长 - digitUsed声明为15,匹配数字为1,15行为3行的15位数比较,加上15个闭合支架和15个空行 - 总共721行!这就是为什么你应该为此使用数组,而不是手工检查它。

如果您已经了解了方法,我建议您将数字匹配器放在一个单独的函数中;这样你可以保持你的数字匹配逻辑和结果 - 奖品匹配逻辑有些分离。

答案 1 :(得分:0)

这不是很好的代码。对于第二个项目符号,猜测所有数字但不是正确的顺序,你可以写一个类,如:

public class ThreeDigitNumber {

    int digit1;
    int digit2;
    int digit3;

    public ThreeDigitNumber(int number) {
        digit1 = number / 100;
        int remainingDigits = number % 100;
        digit2 = remainingDigits / 10;
        digit3 = remainingDigits % 10;
    }

    public int getDigit1() {
        return digit1;
    }

    public int getDigit2() {
        return digit2;
    }

    public int getDigit3() {
        return digit3;
    }

    boolean isDigitGuessed(int digit) {
        if (digit == digit1) {
            // allow digit to be guessed only once, so set to a non-digit value when returning true
            digit1 = -1;
            return true;
        }
        if (digit == digit2) {
            digit2 = -1;
            return true;
        }
        if (digit == digit3) {
            digit3 = -1;
            return true;
        }
        return false;
    }

}

现在您可以测试是否已猜到所有数字:

ThreeDigitNumber lotteryTdn = new ThreeDigitNumber(lottery);
ThreeDigitNumber guessTdn = new ThreeDigitNumber(guess);

boolean allDigitsGuessed = false;
if (lotteryTdn.isDigitGuessed(guessTdn.getDigit1())) {
    if (lotteryTdn.isDigitGuessed(guessTdn.getDigit2())) {
        if (lotteryTdn.isDigitGuessed(guessTdn.getDigit3())) {
            allDigitsGuessed = true; // 3000 $ won
        }
    }
}