Цикл не останавливается и случайно сгенерированное число не сохраняется (игра в угадывание чисел)

Я делаю игру в угадывание чисел в приложении для Android. У вас есть три попытки угадать число. Если у вас закончились испытания, то вы проиграли.

Я добавил цикл for, чтобы каждый раз, когда пользователь вводит данные, он добавлял еще один. Но когда я запускаю приложение и ввожу числа более трех раз, оно не показывает сообщение «У вас больше нет попыток», как будто оно не считает попытки.

Я попытался изменить for на кнопку перезагрузки, а затем каждый раз, когда я нажимаю кнопку перезагрузки, добавляется еще одна. Но это тоже не сработало.

Мой текущий код:

public class MainActivity extends AppCompatActivity {
    private int trials;
    private int maxTrials = 3;
    private TextView s_title, t_rules, strt_title, t_introgss;
    private Button btn_start;
    private EditText num_input;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    num_input = findViewById(R.id.num_input);
    btn_start = findViewById(R.id.btn_start);
    s_title = findViewById(R.id.s_title);
    t_rules = findViewById(R.id.t_rules);
    strt_title = findViewById(R.id.strt_title);
    t_introgss = findViewById(R.id.t_introgss);

    btn_start.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View arg0){

            s_title.setVisibility(View.INVISIBLE);
            t_rules.setVisibility(View.INVISIBLE);
            btn_start.setVisibility(View.INVISIBLE);

            strt_title.setVisibility(View.VISIBLE);
            t_introgss.setVisibility(View.VISIBLE);
            num_input.setVisibility(View.VISIBLE);
        }
    });



    num_input.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int guessNum = Integer.parseInt(num_input.getText().toString());
            int number = 1 + (int) (30 * Math.random());

            for (trials = 0; trials < maxTrials; trials++) {
                if (guessNum == number) {
                    Toast.makeText(MainActivity.this, "You won!", Toast.LENGTH_SHORT).show();

                } else if (guessNum < number && trials != maxTrials - 1) {
                    Toast.makeText(MainActivity.this, "The number is bigger", Toast.LENGTH_SHORT).show();

                } else if (guessNum > number && trials != maxTrials - 1) {
                    Toast.makeText(MainActivity.this, "The number is smaller", Toast.LENGTH_SHORT).show();
                }

                if (trials == maxTrials) {
                    Toast.makeText(MainActivity.this, "You dont have more tries", Toast.LENGTH_SHORT).show();
                    Toast.makeText(MainActivity.this, "The number was " + number, Toast.LENGTH_SHORT).show();
                    break;
                }
            }
        }
    });
}

}

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

Я думаю, что ваша проблема связана с условием цикла for trials < maxTrials. Поэтому, когда trails == maxTrails, он даже не войдет в цикл for. Попробуйте изменить его на trails <= maxTrails

viv3k 12.05.2022 05:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

trials никогда не будет == до maxTrials. В цикле for вы начинаете с trials = 0 и останавливаете цикл, когда trials < maxTrials. Вместо этого критерии следует изменить на trials == maxTrials-1. Кроме того, вам не нужно break, так как это должно обрабатываться циклом for

Ответ принят как подходящий

You do not have to break as that should be handled by the for loop -- @mkjh

Это уже является причиной того, что цикл for заканчивается, поэтому размещение его позже, а не в качестве условия проверки/разрыва, будет более эффективным. Также,

Try changing it to trials <= maxTrials – @viv3k

// start at trial 1 & end when trial == the max
for (trials = 1; trials <= maxTrials; trials++) 
{
    ...
}
// then after that loop
Toast.makeText(MainActivity.this, "You dont have more tries", Toast.LENGTH_SHORT).show();
Toast.makeText(MainActivity.this, "The number was " + number, Toast.LENGTH_SHORT).show();

Оператор break предоставляется тестовым условием trials < maxTrials в цикле for.

РЕДАКТИРОВАТЬ для дополнительной информации

once I input a number, the "the number is ..." message repeats three times, and shows that the user ran out of trials, but only one number has been input.

Я вижу, что значение вводится из цикла

public void onClick(View view) 
{
    int guessNum = Integer.parseInt(num_input.getText().toString());
    int number = 1 + (int) (30 * Math.random());

Затем внутри цикла нет другого места, где пользователь может предположить, поэтому он каждый раз проверяет эти условия с одним и тем же номером. Чтение предположения пользователя в цикле позволит вам переназначить значение для проверки в следующем цикле (отредактирован формат в цикле while)

    trials = 0;
    boolean found = false;
    // under 3 guesses and not found
    while(++trials <= maxTrials && !found) 
    {
        // they guessed it
        if (guessNum == number) 
        {
            they win;
            found = true;
        } // they didn't guess it
        else 
        {
            if (guessNum < number)
                it is bigger;
            else
                it is smaller;
            // take the next guess when it is > or <
            guessNum = Integer.parseInt(num_input.getText().toString());
        }
    }
    ...
}    

ПРИМЕЧАНИЕ Это не полный код

Это сработало! Но теперь, когда я ввожу число, сообщение «число ...» повторяется три раза и показывает, что у пользователя закончились испытания, но был введен только один номер.

aurora 12.05.2022 15:11

@aurora -- я включил дополнительную информацию

Kemper Lee 16.05.2022 04:16

Другие вопросы по теме