嗨大家好。 我是一个Java新手。这不是作业,我对编程非常热衷,我真的想学习更多。我坚持做一次练习。
基本上我必须创建一个简单的彩票游戏。 用户必须输入0到999之间的一个数字,一个三位数字。
到目前为止我的代码:我不知道如何处理条件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)
}
}
}
}
我可以对代码发表一些评论吗?它是可读的还是可怕的?我真的不知道,因为我真的只是编程的新手。感谢。
答案 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
}
}
}