Объект PHP угадать число

#php #class #object

#php #класс #объект

Вопрос:

Я делаю «Угадай мой номер в PHP», и я не знаю, как сделать «попытки», потому что сейчас у меня 10 попыток, но каждый раз обратный отсчет. Я угадываю число, и после 10 попыток я все еще могу угадать число.

Я получил 3 файла. index.php Guess.php Последний файл — это только представление с формой

Index.php файл

 <?php

// Guess my number

require __DIR__ . "/config.php";
require __DIR__ . "/autoload.php";

// Start a named session
session_name("maub");
session_start();

//Deal with incoming variables
$guess = $_POST["guess"] ?? null;
$doInit = $_POST["doInit"] ?? null;
$doGuess = $_POST["doGuess"] ?? null;
$doCheat = $_POST["doCheat"] ?? null;


// Settings for session.
$number = $_SESSION["number"] ?? null;
$tries = $_SESSION["tries"] ?? null;
$games = null;

// Init the game
if ($doInit || $number === null ) {
    session_destroy();
    session_start();
    $games = new Guess();
    $_SESSION["number"] = $games->number();
    $_SESSION["tries"] = $games->tries();
} elseif ($doGuess) {
    $games = new Guess($number, $tries);
    $result = $games -> makeGuess($guess);
    $_SESSION["tries"] = $games -> tries();
}

// Render the page
require __DIR__ . "/view/guess_my_number.php";

echo "<pre>";
var_dump($_POST);
echo "<br>";
var_dump($_SESSION);
  

Guess.php файл

 <?php
/**
 * Guess my number, a class supporting the game through GET, POST and SESSION.
 */
class Guess
{
    /**
    * @var int $number   The current secret number.
    * @var int $tries    Number of tries a guess has been made.
    */
    private $number = null;
    private $tries = 10;


    /**
    * Constructor to initiate the object with current game settings,
    * if available. Randomize the current number if no value is sent in.
    *
    * @param int $number The current secret number, default -1 to initiate
    *                    the number from start.
    * @param int $tries  Number of tries a guess has been made,
    *                    default 10.
    */

    public function __construct(int $number = -1, int $tries = 10)
    {
        $this->tries = $tries;
        if ($number === -1) {
            $number = rand(1,100);
        }
        $this->number = $number;
    }




    /**
    * Randomize the secret number between 1 and 100 to initiate a new game.
    *
    * @return void
    */
    public function random() : void
    {
        $this->number = rand(1, 100);
    }



    /**
    * Get number of tries left.
    *
    * @return int as number of tries made.
    */

    public function tries() : int
    {
        return $this->tries;
    }




    /**
    * Get the secret number.
    *
    * @return int as the secret number.
    */

    public function number() : int
    {
        return $this->number;
    }




    /**
    * Make a guess, decrease remaining guesses and return a string stating
    * if the guess was correct, too low or to high or if no guesses remains.
    *
    * @throws GuessException when guessed number is out of bounds.
    *
    * @return string to show the status of the guess made.
    */

    public function makeGuess(int $guess) : string
    {
        if ($guess < 1 || $guess > 100 ) {
            throw new GuessException("You can type only number between 1-100");
        }
        $this->tries--;

        if ($guess === $this->number) {
            $result = "Correct! Good Job";
            session_destroy();
        } elseif ($guess > $this->number) {
            $result = "Too high try again!";
        } else {
            $result = "Too low try again!";
        };
        return $result;
    }
}

<h1>Hey guess my number</h1>
<p>Guess a number between 1 and 100, you have <b><?= $tries ?></b> left.</p>

<form method="post">
    <input type="text" name="guess">
    <input type="hidden" name="number" value="<?= $number ?>">
    <input type="hidden" name="tries" value="<?= $tries ?>">
    <input type="submit" name="doGuess" value="Make guess">
    <input type="submit" name="doInit" value="Start from beginning">
    <input type="submit" name="doCheat" value="Cheat">
</form>


<?php if ($doGuess) : ?>
    <p>Your guess is : <?= $guess ?> is <?php echo $result ?>. </p>
<?php endif; ?>

<?php if ($doCheat) :  ?>
    <p>Cheat: Current number is: <?= $number ?>. </p>
<?php endif; ?>

<!-- <pre>
    <?= var_dump($_POST) ?>
</pre> -->
  

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

1. Где логика, чтобы остановиться после 10 попыток?

2. @JasonK В этом проблема, я не знаю, как.

Ответ №1:

В какой-то момент вам просто понадобится оператор if в вашей основной логике.

 if($games->tries() < 1 ){
  echo 'To many guesses';
  // Reset the game.
 }
  

Ответ №2:

22.6.2021 я написал число предположений в диапазоне [0 .. aMaxIntValue] пример веб-приложения, использующего PHP. я думаю, что следующий код может вам помочь. код хранится в одном файле PHP. он генерирует # 4 HTML-страницы …

  • 1-я начальная страница используется для сбора параметров приложения (например, максимальное число Int для угадывания)

  • 2-я страница — это главная страница игры, где пользователю предлагается угадать секретное число или сбросить игру. на этой странице показаны предыдущие предположения пользователя и некоторые советы для пользователя о предположении

  • 3-я страница используется для уведомления пользователя о проигрыше игры (то есть у него больше не осталось попыток)

  • 4-я страница используется для уведомления пользователя о выигрыше в игре (то есть предположение было в порядке)

Количество попыток, оставшихся у пользователя, вычисляется с использованием диапазона значений [0 .. max]

Угадываемое секретное число — это случайно сгенерированное целое число в диапазоне [0 .. max]

это код PHP HTML …

 <?php

    session_start();

    error_reporting (E_PARSE | E_COMPILE_ERROR);

    function ResetGame()
    {
        unset ( $_SESSION['theMaxNumber'] );
    }

    function InitGame()
    {
        $_SESSION['theNumberToGuess'] = mt_rand (0, $_SESSION['theMaxNumber']);

        $_SESSION['theMaxNumberOfTries'] = floor ( log ($_SESSION['theMaxNumber'], 2) )   1;

        $_SESSION['theUserTriesCount'] = 0;

        $_SESSION['thePrevGuessesString'] = '';

        $_SESSION['theUserGuess'] = 0;
    }

    function ComputeNumberOfTriesLeft()
    {
        return $_SESSION['theMaxNumberOfTries'] - $_SESSION['theUserTriesCount'];
    }

    function IsNoMoreTriesLeft()
    {
        return ComputeNumberOfTriesLeft() <= 0;
    }

    $aCanPlayGame = false;

    $aUserSubmittedGuess = false;

    $aIsNoMoreTriesLeft = false;

    if ($_SERVER['REQUEST_METHOD'] == 'POST') {

        if ( isset ($_REQUEST['playgame']) ) {

            $_SESSION['theMaxNumber'] = intval($_REQUEST['theMaxNumber']);

            // init game ...
            InitGame();

            $aCanPlayGame = true;

        }
        elseif ( isset ($_REQUEST['submituserguess']) ) {

            $aCanPlayGame = true;

            $aUserSubmittedGuess = true;

            $_SESSION['theUserGuess'] = intval($_REQUEST['theUserGuess']);

        }
        elseif ( isset ($_REQUEST['resetgame']) ) {

            ResetGame();

        }
        else {
            ResetGame();
        }

    }
    else {
        ResetGame();
    }

    // check a play

    $aUserShouldTryLower = false;
    $aUserShouldTryHigher = false;

    $aUserWins = false;

    $aUserLooses = false;

    if ($aCanPlayGame) {

        $aIsNoMoreTriesLeft = IsNoMoreTriesLeft();

        if ( ! $aIsNoMoreTriesLeft ) {

            // user have tries left

            if ($aUserSubmittedGuess) {

                // check user guess ...
                $aUserGuess = intval($_SESSION['theUserGuess']);

                if ( $aUserGuess > $_SESSION['theNumberToGuess'] ) {

                    $aUserShouldTryLower = true;

                }
                elseif ( $aUserGuess < $_SESSION['theNumberToGuess'] ) {

                    $aUserShouldTryHigher = true;

                }
                else {

                    $aUserWins = true;

                    // also reset game
                    ResetGame();

                }

                // add the current guess to the prev guesses string
                $_SESSION['thePrevGuessesString'] .= $_SESSION['theUserGuess'] . ' ';

                // increase the user tries count
                   $_SESSION['theUserTriesCount'];

                // check tries count
                if ( ! $aUserWins ) {

                    $aIsNoMoreTriesLeft = IsNoMoreTriesLeft();

                    if ($aIsNoMoreTriesLeft) {
                        // this was the last try

                        // no more tries left
                        $aUserLooses = true;

                        // also reset game
                        ResetGame();
                    }

                }
            }

        }
        else {
            // no more tries left
            $aUserLooses = true;

            // also reset game
            ResetGame();
        }

    }

?>

<?php if ($aUserLooses): ?>

<!DOCTYPE html>
<html>
<head>
    <title>Guess a Number</title>
</head>
<body>
    <p>Sorry, you loose the game</p>
    <p>the Number to Guess was <?php echo $_SESSION['theNumberToGuess']; ?></p>
    <form method="post">
        <input type="submit" name="resetgame" value="reset game">
    </form>
</body>
</html>

<?php elseif ($aUserWins): ?>

<!DOCTYPE html>
<html>
<head>
    <title>Guess a Number</title>
</head>
<body>
    <p>Congrats, you Win the Game</p>
    <p>the Number to Guess was <?php echo $_SESSION['theNumberToGuess']; ?></p>
    <form method="post">
        <input type="submit" name="resetgame" value="reset game">
    </form>
</body>
</html>

<?php elseif ($aCanPlayGame): ?>

<!DOCTYPE html>
<html>
<head>
    <title>Guess a Number</title>
</head>
<body>

    <p>the Max Number is <?php echo $_SESSION['theMaxNumber']; ?></p>
    <p>Guess a Number in the Range [ 0 .. <?php echo ($_SESSION['theMaxNumber']); ?> ]</p>
    <p>[DEBUG] the secret number to guess is <?php echo $_SESSION['theNumberToGuess']; ?></p>
    <p>you have <?php echo ComputeNumberOfTriesLeft(); ?> tries left</p>
    <form method="post">
        <label for="theUserGuess">Enter your Guess: </label>
        <input type="text" id="theUserGuess" name="theUserGuess">
        <input type="submit" name="submituserguess" value="Guess">
        <input type="submit" name="resetgame" value="reset game">
    </form>
    <p>Prev Guesses: <?php echo $_SESSION['thePrevGuessesString']; ?> </p>
    <p>
        <?php
            if ($aUserShouldTryLower) {
                echo 'you should try a lower < guess';
            }
            elseif ($aUserShouldTryHigher) {
                echo 'you should try a higher > guess';
            }
            else {
                echo 'no guess';
            }
        ?>
    </p>

</body>
</html>

<?php else: ?>

<!DOCTYPE html>
<html>
<head>
    <title>Guess a Number</title>
</head>
<body>

    <p>Guess a Number from (0) to ... </p>
    <form method="post">
        <input id="theMaxNumber" name="theMaxNumber">
        <input type="submit" name="playgame" value="play game">
    </form>

</body>
</html>

<?php endif; ?>
  

вот и все, ребята…