#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; ?>
вот и все, ребята…