Список массивов, если цикл не работает должным образом: JAVA

#java #loops #arraylist

#java #циклы #arraylist

Вопрос:

У меня есть программа, которая запрашивает у пользователя его имя и т.д. Затем он спрашивает, сколько раз вы хотите, чтобы числа повторялись (поэтому моя программа генерирует 3 случайных числа от 7 до 13, и если в сумме получается 31, они являются победителями), и моя проблема в том, что я хочу, чтобы учитывалось только последнее напечатанное число, если игрок выигрывает или проигрывает, тоя думаю, другие цифры просто для показа или дразнить. проблема в том, что независимо от того, выигрывает игрок или проигрывает, оператор losing всегда выводится. Ниже приведен весь мой код.

  import java.util.InputMismatchException;
 import java.util.Scanner;
 import java.io.IOException;
 import java.util.Random;

 public class StringVariables {



public static void main(String[] args) throws NumberFormatException,
        IOException {

    // user inputs their name in this section
    Scanner user_input = new Scanner(System.in);
 //enter their first name

    String first_name;
    System.out.print("Enter Your First Name: ");
    while
        (!user_input.hasNext("[A-Za-z] ")) {
        System.out.println("Please only enter alphabet characters. Try again.");
        user_input.next();
    }
    first_name = user_input.next();

 //enter their last name
    String last_name;
    System.out.print("Enter Your Last Name: ");
    while
        (!user_input.hasNext("[A-Za-z] ")) {
        System.out.println("Please only enter alphabet characters. Try again.");
        user_input.next();
    }
    last_name = user_input.next();
  //full name printed together
    String full_name;
    full_name = first_name   " "   last_name;

    System.out.println(full_name   " Is Now Playing");

    // this is the shuffle portion as well as something to see if a number

    int numShuffles = -1;
    while (numShuffles < 0) {

        System.out.println("How many times do you want the numbers shuffled? ");

        try {
            numShuffles = user_input.nextInt();
        } catch (InputMismatchException inputException) {
            System.out.print("Please enter a valid number. n");
            //this is the buffer that resets if the user types a letter instead of a number, or any other character
            user_input.next();
        }
    } 

    // here is going to be the loop for shuffles

    // we are now going to generate their random number and add a delay
    // after completing their name fields

    delay(3000);
    System.out
            .println(" You will be given "   numShuffles    " hand(s) of 3 random numbers between 7-13" );

    delay(2000);
    System.out
            .println(" Then, the computer will add the random numbers and if it is equal to 31, you win!");

    /*
     * end of explanation of the game, next i will create a new screen with
     * the user's name and numbers
     */

    delay(4000);
    // printing 25 blank lines
    for (int i = 0; i < 25; i  )
        System.out.println(" ");


    System.out.println("User playing: "   full_name);

    System.out.println("Number of times shuffled: "   numShuffles);

    System.out.println("Your lucky numbers are...");

    // random number generator

    Random random = new Random();



    while (true) {

        // the shuffle loop
        Arraylist numberStore = new Arraylist();
        boolean isWinner = false;
        for (int i = 0; i < numShuffles; i  ) {
            int num1 = 7   random.nextInt(7);
            int num2 = 7   random.nextInt(7);
            int num3 = 7   random.nextInt(7);

            System.out.println(num1   "   "   num2   "   "   num3   " = "   (num1   num2   num3));
            numberStore.add(num1   num2   num3);


        int lastNumber = (numberStore.size() - 1);
        if (lastNumber == 31) {
                isWinner = true;
                System.out.println("Congratulations !! You are the Lucky Winner !!!!");
                break;
                //if you loose every shuffle
        }
        }
       if (!isWinner) {
            System.out.println("Better Luck Next Time");
       }
        // play again prompt
        System.out
                .println(" Do you want to play again? (If you do enter y or yes) n To exit press any other key ");
        String input = user_input.next();
        if (!"y".equalsIgnoreCase(input) amp;amp; !"yes".equalsIgnoreCase(input)) {
            break;
        }
    }

    // if pressed y or yes the program will run again with the same number of shuffles entered from before
    user_input.close();
}

// delay field

public static void delay(int millis) {
    try {
        Thread.sleep(millis);
    } catch (InterruptedException exp) {

        // delay field

    }
}
 }
  

Комментарии:

1. Um? int lastNumber = (numberStore.size() - 1);

2. Прежде всего, это ArrayList, а не Arraylist … Я думаю, опечатка…

Ответ №1:

                  int lastNumber = (numberStore.size() - 1);
                 if (lastNumber == 31) {
  

вы, вероятно, хотите что-то вроде

                  int lastNumber = numberStore.get(numberStore.size() - 1);
                 if (lastNumber == 31) {
  

чтобы убедиться, что это ошибка, попробуйте изменить эту строку на

                  int lastNumber = num1   num2   num3;
  

Редактировать на основе дальнейших сообщений:

Похоже, вы действительно хотите этого:

     for (int i = 0; i < numShuffles; i  ) {
        int num1 = 7   random.nextInt(7);
        int num2 = 7   random.nextInt(7);
        int num3 = 7   random.nextInt(7);


        System.out.println(num1   "   "   num2   "   "   num3   " = "   (num1   num2   num3));
        numberStore.add(num1   num2   num3);


        int lastNumber = num1   num2   num3;

        boolean lastShuffle = (i == (numShuffles - 1));
        if (lastShuffle) {
            if (lastNumber == 31) {
                System.out.println("Congratulations !! You are the Lucky Winner !!!!");
            } else {
                System.out.println("Better Luck Next Time");
            }
        }
    }
    // play again prompt
    System.out
        .println(" Do you want to play again? (If you do enter y or yes) n To exit press any other key ");
    String input = user_input.next();
    if (!"y".equalsIgnoreCase(input) amp;amp; !"yes".equalsIgnoreCase(input)) {
        break;
    }
  

Просто общее предложение: избегайте использования break, если это возможно, это затрудняет отслеживание потока управления и не является хорошей практикой программирования.

Комментарии:

1. да, но мне нужны только последние 3 числа для подсчета, а не если одно из них в цикле выполняется. распечатаны только последние 3 числа

2. Добавьте это: if (lastNumber == 31 amp;amp; i==(numShuffles=1))

3. он по-прежнему выводит строку проигравшего, даже если последние 3 числа равны 31. я полностью в тупике по этому поводу

4. вы пробовали использовать int lastNumber = num1 num2 num3; и if (lastNumber == 31 amp;amp; i==(numShuffles-1)) ? (обратите внимание, что в комментарии выше есть опечатка)

5. это работает… у меня есть еще одна вещь, которую я должен спросить у вас. можно ли сделать так, чтобы он не выводил код проигравшего в каждом цикле чисел?

Ответ №2:

Здесь нужно сделать несколько замечаний. Во-первых, ваш код довольно запутанный и его трудно читать. Это полезно, когда вы просите о помощи (и вообще в любом случае) для правильного отступа вашего кода. Это хорошая практика, и если вы используете другие языки, такие как Python, это может вам очень помочь. Кроме того, зачем проверять!isWinner? Полностью удалите переменную isWinner и просто проверьте число, равное 31, а затем создайте оператор else для оператора losing. Вот так:

     if (lastNumber == 31) {
        System.out.println("Congratulations !! You are the Lucky Winner !!!!");
        break;
        //if you loose every shuffle
    }
    else {
        System.out.println("Better Luck Next Time");
    }
  

Кроме того, выполните несколько шагов, чтобы найти ошибку. Распечатайте каждое число по мере его получения и используйте

 int lastNumber = num1   num2   num3;
  

вместо

 int lastNumber = (numberStore.size() - 1);
  

Также для всех, кто это компилирует, это ArrayList, а не Arraylist … просто небольшая ошибка.

Комментарии:

1. проблема с этим заключается в том, что после каждой строки из 3 распечатанных чисел она сообщает мне, проигравший он или нет, и если он победитель, он полностью останавливает цикл, введенный пользователем. я помню, что был на этом этапе раньше, но я не могу понять, как просто заставить последнее число считаться победителем или проигравшим

2. Позвольте мне посмотреть, смогу ли я получить то, что вы просите здесь (я нахожу вашу формулировку немного неясной). Вы хотите, чтобы только последнее из 3 добавляемых чисел учитывалось при выигрыше / проигрыше?

3. да. извините, я знаю, что мою формулировку трудно понять. только последние 3 числа цикла должны учитываться при выигрыше или проигрыше. остальные просто «для показухи», как если бы вы сделали только 4 перетасовки, вы бы выиграли, чтобы представить это в более выгодном свете.

4. вы знаете, как это сделать? @brld

5. Хорошо, по какой-то причине он не компилируется для меня в моей IDE, поэтому я попытаюсь отладить это с вами. Сначала выполните цикл, который генерирует числа, до тех пор, пока он не станет меньше 3, а не количество перетасовок. А также переместите следующий код, который устанавливает сумму и проверяет, выиграли ли вы, за пределы цикла. Это только для отладки. Дайте мне знать ваши результаты.

Ответ №3:

Извините, возможно, мне придется сказать, что ваши коды немного запутаны. небольшая фабрика с решением, которое вы запрашиваете, надеюсь, это может вам немного помочь

 public static void main(String[] args) throws NumberFormatException,
        IOException {
    Scanner user_input = new Scanner(System.in);
    String full_name = registeGamePlayer(user_input);
    int numShuffles = initGame(user_input);
    showTheGameInfo(full_name, numShuffles);
    runningGame(user_input, numShuffles);
    user_input.close();
}

/**
 * @param user_input
 * @param numShuffles
 */
private static void runningGame(Scanner user_input, int numShuffles) {
    // random number generator
    Random random = new Random();
    while (true) {
        // the shuffle loop
        boolean isWinner = false;
        for (int i = 0; i < numShuffles; i  ) {
            int num1 = 7   random.nextInt(7);
            int num2 = 7   random.nextInt(7);
            int num3 = 7   random.nextInt(7);

            int amount = num1   num2   num3;
            System.out.printf("%d   %d   %d = %d n", num1,num2,num3,amount);
            if (amount == 31) {
                isWinner = true;
                System.out.println("Congratulations !! You are the Lucky Winner !!!!");
                break;
                // if you loose every shuffle
            }
        }
        if (!isWinner) {
            System.out.println("Better Luck Next Time");
        }
        // play again prompt
        System.out.println(" Do you want to play again? (If you do enter y or yes) n To exit press any other key ");
        String input = user_input.next();
        if (!"y".equalsIgnoreCase(input) amp;amp; !"yes".equalsIgnoreCase(input)) {
            break;
        }
    }
}

/**
 * @param full_name
 * @param numShuffles
 */
private static void showTheGameInfo(String full_name, int numShuffles) {
    // printing 25 blank lines
    for (int i = 0; i < 25; i  )
        System.out.println(" ");

    System.out.println("User playing: "   full_name);

    System.out.println("Number of times shuffled: "   numShuffles);

    System.out.println("Your lucky numbers are...");
}

// delay field

public static void delay(int millis) {
    try {
        Thread.sleep(millis);
    } catch (InterruptedException exp) {

        // delay field

    }
}

private static String registeGamePlayer(Scanner user_input){
    String first_name;
    System.out.print("Enter Your First Name: ");
    while (!user_input.hasNext("[A-Za-z] ")) {
        System.out
                .println("Please only enter alphabet characters. Try again.");
        user_input.next();
    }
    first_name = user_input.next();

    // enter their last name
    String last_name;
    System.out.print("Enter Your Last Name: ");
    while (!user_input.hasNext("[A-Za-z] ")) {
        System.out
                .println("Please only enter alphabet characters. Try again.");
        user_input.next();
    }
    last_name = user_input.next();
    // full name printed together
    String full_name;
    full_name = first_name   " "   last_name;

    System.out.println(full_name   " Is Now Playing");

    return full_name;
}

private static int initGame(Scanner user_input){
    // this is the shuffle portion as well as something to see if a number

            int numShuffles = -1;
            while (numShuffles < 0) {
                System.out.println("How many times do you want the numbers shuffled? ");
                try {
                    numShuffles = user_input.nextInt();
                } catch (InputMismatchException inputException) {
                    System.out.print("Please enter a valid number. n");
                    // this is the buffer that resets if the user types a letter
                    // instead of a number, or any other character
                    user_input.next();
                }
            }
            // here is going to be the loop for shuffles

            // we are now going to generate their random number and add a delay
            // after completing their name fields

            delay(3000);
            System.out.println(" You will be given "   numShuffles   " hand(s) of 3 random numbers between 7-13");

            delay(2000);
            System.out.println(" Then, the computer will add the random numbers and if it is equal to 31, you win!");

            /*
             * end of explanation of the game, next i will create a new screen with
             * the user's name and numbers
             */

            delay(4000);
            return numShuffles;
}
  

Комментарии:

1. я попытался вставить этот код в eclipse, но в итоге получил кучу ошибок, неправильно ли отформатировал код overflow или какая-то ошибка?

2. вам нужно импортировать необходимый класс: import java.io.IOException; import java.util. Исключение InputMismatchException; импортируйте java.util. Случайный; импортируйте java.util. Сканер; пожалуйста, создайте новый класс, а затем перенесите приведенные выше коды в свой класс с помощью импорта, который я только что прикрепил

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

4. что вы имеете в виду, что последние 3 числа, не могли бы вы привести наглядный пример? Я сбиваю с толку

5. Я думаю, что я могу получить то, что вы хотите, если число numShuffles равно 1, последними тремя числами будут num1, num2 и num3 из цикла. если число numShuffles равно 2, последние три числа будут числом из второго цикла. это правильно?