почему мой оператор while не проверяет 2 условия, прежде чем двигаться дальше, даже если между обоими условиями есть &&? - PullRequest
0 голосов
/ 04 августа 2020

Итак, я пытался создать программу броска кубиков, в которой бросаются 2 кубика, пока они не станут равны 6. Я хочу, чтобы мое условие проверяло, равны ли кубики и dice02 6, прежде чем двигаться дальше, но на данный момент он только проверяет, равен ли 1 из кубиков 6, прежде чем двигаться дальше, даже если в условии есть &&.

Любая помощь будет принята с благодарностью.

Random numberGen = new Random();

int roll = 0;

int roll02 = 1;
int attempts = 0;

Console.WriteLine("Press Enter to roll the 2 dices");

while (roll != 6 && roll02 != 6)
{
    Console.ReadKey();


    roll = numberGen.Next(1, 7);
    roll02 = numberGen.Next(1, 7);
    Console.WriteLine("You rolled a: " + roll);
    Console.WriteLine("You rolled a: " + roll02 + "\n");

    attempts++;
}


if (attempts == 1)
{
    Console.WriteLine("It took you " + attempts + " attempt to roll 2 of a kind");
}
else
{
    Console.WriteLine("It took you " + attempts + " attempts to roll 2 kind of kind");
}


Console.ReadKey();
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Давайте вкратце расскажем, как работает ваш код:

Сначала он проверяет, не равен ли первый бросок 6, если он равен 6, то он не удовлетворяет состояние обоих валков не равно 6 и будет отскакивать от l oop (Это действительно сбивает с толку, не так ли?).

Чтобы убедиться, что оба значения не равны 6, вы должны использовать оператор || так что вы выполняете итерацию, пока ROLL1 или ROLL2 не равны 6.

 while (roll != 6 || roll02 != 6)
    {   
        Console.ReadKey();

        
        roll = numberGen.Next(1, 7);
        roll02 = numberGen.Next(1, 7);
        Console.WriteLine("You rolled a: " + roll);
        Console.WriteLine("You rolled a: " + roll02 + "\n");
    
        attempts++;
    }

Как указано в комментариях, есть более понятный способ сделать это со следующим условием:

while(!(roll == 6 && roll02 == 6))
1010 * Оператор! является логическим оператором «не», поэтому он даст вам обратное значение следующего за ним условия. В этом случае, когда оба броска равны 6, это ложь, что заставляет его больше не следовать условию и выходит из l oop.
1 голос
/ 04 августа 2020

даже если есть && в условии

Что ж, проблема, похоже, вы неправильно поняли поведение логических операторов. && является оператором короткого замыкания логического И. Если первое условие - false, то второе условие никогда не оценивается, потому что логическая операция всегда будет false.

Если вам не нужна сокращающая версия оператора, используйте &.

Тем не менее, если вы хотите, чтобы ваша программа двигалась на только , когда оба кубика равны 6, тогда logi c должен быть:

if (dice == 6 && dice2 == 6)
   //move on
else
   //roll again

Здесь короткое замыкание действительно имеет смысл, потому что вам все равно, что такое dice2, если dice не 6; вы собираетесь катиться снова независимо от того, что dice2 свернуло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...