2016-08-08 3 views
1

Приветствую вас на этом сообществе. Я новичок в Java. Это не домашнее задание, я очень увлечен программированием, и я действительно хочу узнать больше. Я застрял в одном упражнении.Как проверить, угадываются ли три номера?

В принципе, мне нужно создать простую лотерею. Пользователь должен ввести одно число от 0 до 999, трехзначное число.

  • Если предположение точно такой же, приз составляет 10.000 $,
  • Если предположение о том же (цифры угаданных но не по порядку) приз 3000 $
  • Если догадка на самом деле не то же самое (цифры догадываются == 1) приз составляет 1000 $.

Вот мой код: Я не знаю, как иметь дело с условиями 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) 

      } 

     } 

    } 
} 

Могу ли я прокомментировать код? Является ли это удобочитаемым или ужасно написанным? У меня действительно нет подсказки, так как я действительно новичок в программировании. Благодарю.

+1

Почему в downvoting , люди? –

+0

SO не предназначен для просмотра кода; вы могли бы попробовать codereview.stockexchange.com. – GhostCat

+0

@GhostCat, похоже, не просит пересмотра; похоже, спрашивает: «Как мне написать следующий бит кода?» ... хотя ... на самом деле, во втором чтении этот вопрос, кажется, делает оба одновременно. В любом случае, Code Review Stack Exchange будет отвечать на вопросы, содержащие только рабочий код, поэтому сначала необходимо будет реализовать функциональность. – Pimgd

ответ

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 против 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) длинные строки - 15 для digitUsed деклараций, 1 для соответствующих цифр, 15-значное сравнение 3 строк для 15 цифр, плюс 15 закрывающих фигур и 15 пустых линий между ними - всего 721 строка! Вот почему вы должны использовать массивы для этого, а не проверять их вручную.

Если вы уже узнали о методах, я предлагаю вам установить символ в отдельной функции; таким образом, вы можете сохранить логику соответствия цифр и несколько разделить логику соответствия результата к выигрышу.

+0

Спасибо! Однако это не правильное решение. В этой главе мы еще не рассматривали массивы, поэтому я полагаю, что есть более неэффективные, но полезные способы выполнения этой задачи. –

+0

@ m.rossi А, я вижу. В этом случае ... вы можете вручную сравнить каждую цифру друг с другом ... но было бы труднее сделать – Pimgd

+0

Согласитесь с @Pimgd, что было бы сложнее. Не забывайте учитывать, что при сравнении 232 с 323 каждая цифра может быть найдена в другом номере, но все же это не все правильные цифры. Я не уверен, как я буду заниматься этим без массивов. –

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 
     } 
    } 
} 
Смежные вопросы