Сохранение двух случайных чисел через игровой цикл

Мой код должен предоставить два случайных числа и пользователь должен ввести их продукт (умножение).

Если вы вводите неправильный ответ, он говорит вам угадать снова, но сохраняет те же случайные числа, пока вы не ответите правильно. Ответьте правильно, и все начнется с новой пары чисел.

Приведенный ниже код изменяет значение двух случайных чисел, Даже если я ввел неправильное число. Я хотел бы сохранить значения неизменными, пока не будет введен правильный ответ.

<?php
$num1=rand(1, 9);
$num2=rand(1, 9);
$num3=$num1*$num2;
$num_to_guess = $num3;
echo $num1."x".$num2."= <br>";


if ($_POST['guess'] == $num_to_guess) 
        { // matches!
            $message = "Well done!";
        } 
        elseif ($_POST['guess'] > $num_to_guess) 
        {
            $message = $_POST['guess']." is too big! Try a smaller number.";
        } 
            elseif ($_POST['guess'] < $num_to_guess) 
            {
                $message = $_POST['guess']." is too small! Try a larger number.";
            } 
                else  
                { // some other condition
                    $message = "I am terribly confused.";
                }
?>
<!DOCTYPE html>
<html>
<body>
<h2><?php echo $message; ?></h2>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="hidden" name="answer" value="<?php echo $answer;?>">
<input type="hidden" name="expression" value="<?php echo $expression;?>">
What is the value of the following multiplication expression: <br><br>
<?php echo $expression; ?> <input type="text" name="guess"><br>
<input type="submit" value="Check">
</form>
</body>
</html>

3 ответа

  1. Для того, чтобы сохранить те же номера, вы должны сохранить их на странице, а затем проверить их при отправке формы с помощью php. Вы также должны установить случайное число, если форма никогда не была отправлена. В вашем случае вы всегда меняли num1 и num2. Я пытался оставить как можно больше вашего исходного кода нетронутым, но для его упрощения все еще требуется некоторая работа.

    1. Сначала я добавил еще 2 скрытых поля в html под названием num1 и num2
    2. Во-вторых, я установил $num1 и $num2 в значение, которое было отправлено из формы.
    3. После следования остальной логике, я убеждаюсь, что $num1 и $num2 сбрасываются, если ответ правильный, форма никогда не была отправлена.

    Вы можете увидеть комментарии в коде ниже.

    Кроме того, если вы собираетесь использовать это в рабочей среде, необходимо проверить значения, передаваемые из формы, чтобы злонамеренные пользователи не использовали преимущества кода. 🙂

     <?php
    // Setting $num1 and $num2 to what was posted previously and performing the math on it.
    $num1 = $_POST['num1'];
    $num2 = $_POST['num2'];
    $num_to_guess = $num1*$num2;
    
    // Check for the correct answer
    if ($_POST && $_POST['guess'] == $num_to_guess)
    {
        // matches!
        $message = "Well done!";
        $num1=rand(1, 9);
        $num2=rand(1, 9);
    } 
    // Give the user a hint that the number is too big
    elseif ($_POST['guess'] > $num_to_guess)
    {
        $message = $_POST['guess']." is too big! Try a smaller number.";
    } 
    // Give the user a hint that the number is too small
    elseif ($_POST['guess'] < $num_to_guess) 
    {
        $message = $_POST['guess']." is too small! Try a larger number.";
    } 
    // If the form wasn't submitted i.e. no POST or something else went wrong
    else  
    {
        // Only display this message if the form was submitted, but there were no expected values
        if ($_POST)
        {
            // some other condition and only if something was posted
            $message = "I am terribly confused.";
        }
        // set num1 and num2 if there wasn't anything posted
        $num1=rand(1, 9);
        $num2=rand(1, 9);
    }
    
    // Show the problem
    echo $num1."x".$num2."= <br>";
    
    ?>
    <!DOCTYPE html>
    <html>
    <body>
    <h2><?php echo $message; ?></h2>
    <form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <input type="hidden" name="num1" value="<?= $num1 ?>" />
    <input type="hidden" name="num2" value="<?= $num2 ?>" />
    <input type="hidden" name="answer" value="<?php echo $num3;?>">
    <input type="hidden" name="expression" value="<?php echo $expression;?>">
    What is the value of the following multiplication expression: <br><br>
    <input type="text" name="guess"><br>
    <input type="submit" value="Check">
    </form>
    </body>
    </html>
    
  2. Когда вы загружаете страницу в первый раз, у вас есть (т. е.) “2*3” в качестве вопроса. $_POSTне определен, поэтому if ($_POST['guess']...будет выдавать неопределенное предупреждение индекса. Тогда вы эхо$message, но где вы определяете $message? $_POST['guess']не определено, поэтому оценивается как 0, $num_to_guessравно 6 (=2*3), поэтому $messageустановлено в » слишком мало! Попробуйте большее число.», даже если пользователь ничего не ввел. Параметр hidden answerимеет значение$answer, но эта переменная не определена, поэтому она имеет значение nothing (или” Notice: Undefined variable: answer», если вы активируете отчет об ошибках). Та же проблема для expressionввода и дляecho $expression.

    Попробуйте что-то вроде этого:

    $newQuestion = True;    // This variable to check if a new multiplication is required
    $message     = '';
    
    /* $_POST['guess'] check only if form is submitted: */
    if( isset( $_POST['guess'] ) )
    {
        /* Comparison with answer, not with new result: */
        if( $_POST['guess'] == $_POST['answer'] )
        {
            $message = "Well done!";
        }
        else
        {
            /* If result if wrong, no new question needed, so we propose same question: */
            $newQuestion = False;
            $answer      = $_POST['answer'];
            $expression  = $_POST['expression'];
            if( $_POST['guess'] > $_POST['answer'] )
            {
                $message = "{$_POST['guess']} is too big! Try a smaller number.";
            }
            else
            {
                $message = "{$_POST['guess']} is too small! Try a larger number.";
            }
        }
    }
    
    /* New question is generated only on first page load or if previous answer is ok: */
    if( $newQuestion )
    {
        $num1       = rand( 1, 9 );
        $num2       = rand( 1, 9 );
        $answer     = $num1*$num2;
        $expression = "$num1 x $num2";
        if( $message ) $message .= "<br>Try a new one:";
        else           $message  = "Try:";
    }
    
    ?>
    
    <!DOCTYPE html>
    (... Your HTML Here ...)
    
  3. Это также может быть интересно узнать. Это сессия. Позволяет хранить что-то временно. Это немного грязно. Но интересно учиться.
    http://www.w3schools.com/php/php_sessions.asp

     <?php
        session_start(); // Starts the Session.
    
        function Save() { // Function to save $num1 and $num2 in a Session.
            $_SESSION['num1'] = rand(1, 9);
            $_SESSION['num2'] = rand(1, 9);
            $_SESSION['num_to_guess'] = $_SESSION['num1']*$_SESSION['num2'];;
            $Som = 'Guess the number: ' . $_SESSION['num1'] .'*' .$_SESSION['num2'];
        }
         // If there is no session set
         if (!isset($_SESSION['num_to_guess'])) {
             Save();
             $message = "";
         }
    
         if (isset($_POST['guess'])) {
             // Check for the correct answer
             if ($_POST['guess'] == $_SESSION['num_to_guess']) {
                 $message = "Well done!";
                 session_destroy(); // Destroys the Session.
                 Save(); // Set new Sessions.
             }
             // Give the user a hint that the number is too big
             elseif ($_POST['guess'] > $_SESSION['num_to_guess']) {
                 $message = $_POST['guess']." is too big! Try a smaller number.";
                 $Som = 'Guess the number: ' . $_SESSION['num1'] .'*' .$_SESSION['num2'];
             }
             // Give the user a hint that the number is too small
             elseif ($_POST['guess'] < $_SESSION['num_to_guess']) {
                 $message = $_POST['guess']." is too small! Try a larger number.";
                 $Som = 'Guess the number: ' . $_SESSION['num1'] .'*' .$_SESSION['num2'];
             }
             // some other condition
             else { 
                 $message = "I am terribly confused.";
             }
        }
        ?>
    
        <html>
        <body>
        <h2><?php echo $Som . '<br>'; ?>
            <?php echo $message; ?></h2>
            <form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
                <input type="text" name="guess"><br>
                <input type="submit" value="Check">
            </form>
        </body>
        </html>