值未保存到变量中

时间:2019-09-01 13:53:40

标签: php

我正在做一个子手游戏。

一切正常,直到最后一部分。 我想展示他设法正确猜出的字母。 这有点奏效,但只有在第二次猜测之后。 但这不是我苦苦挣扎的主要问题。

当用户实际猜出正确的字母时,会在密码中显示该字母。 (秘密词表示用户必须猜测但以虚线表示的词)

但是,当用户再次猜测时,上一个字母将从秘密单词中消失。

我要苦苦挣扎的最后一件事是,当同一个单词中有多个字母时,循环会在找到的第一个字母处停止。 (对不起,我的脚本不好。我对此非常陌生!) (还请原谅我的荷兰人)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hangman Back end php</title>
    <h1> Hangman </h1>
    <h3>Raad een letter van het te raden woord</h3>
</head>
<body>
<?php
$hang[0] =
' ------- 
 |/    | 
 |
 |
 |
 |
 | 
/|\
-------------';
$hang[1] =
' -------
 |/    | 
 |     o
 |
 |
 |
 | 
/|\
-------------';
$hang[2] =
' -------
 |/    | 
 |     o
 |     |
 |     |
 |
 | 
/|\
-------------';
$hang[3] =
' -------
 |/    | 
 |     o
 |     |
 |     |
 |    /
 | 
/|\
-------------';
$hang[4] =
' -------
 |/    | 
 |     o
 |     |
 |     |
 |    / \
 | 
/|\
-------------';
$hang[5] =
' -------
 |/    | 
 |     o
 |   --|
 |     |
 |    / \
 | 
/|\
-------------';
$hang[6] =
' -------
 |/    | 
 |     o
 |   --|--
 |     |
 |    / \
 | 
/|\
-------------';

function HasBeenUsed($allLettersGuessed, $letter){
    if ($allLettersGuessed =="") {
        #No letter guessed yet
        return false;
    }
    else {

        $hasLetter = false;
        #$length = strlen($allLettersGuessed);
        $hasLetter = strpos($allLettersGuessed, $letter) !== false;
            if ($hasLetter) {
                $hasLetter = true;
                return $hasLetter;
            }
            else {
                $hasLetter = false;
                return $hasLetter;
            }
        }
}
function Restart()
{

        $wrongGuess = 0;
        return array($oldLetterGuessed, $wrongGuess);
}
$solution = "DANSEN";
    if (isset($_GET['letterGuessed'])) {
        $currentGuess = $_GET['letterGuessed'];
        # Check the letter
        if (HasBeenUsed($solution, $currentGuess) == false) {
             echo "<b> Wrong </b>";
            $wrongGuess = $_GET['wrongGuess'] + 1;
             echo "<pre>" . $hang[$wrongGuess] . "</pre>";

        }
        else {
            $wrongGuess = $_GET['wrongGuess'];
            echo "<pre>" . $hang[$wrongGuess] . "</pre>";
        }
    }
    else {
        $wrongGuess = 0;
        $currentGuess = "";
    }
echo "<form name = 'myForm' method='get' action='hangman.php'>";

    # Alle geraden letters in een veriabele steken
    if (isset($_GET['oldLetterGuessed'])) {
        $oldLetterGuessed = $_GET ['oldLetterGuessed'];
        $allLettersGuessed = $oldLetterGuessed . $currentGuess;
        $allLettersGuessed;

        echo "<input type = 'hidden' name = 'oldLetterGuessed' value ='". $allLettersGuessed ."'>";
        echo $allLettersGuessed;
        echo "<p> The number of wrong guesses so far is $wrongGuess </p>";
    }
    else {
        echo "<input type = 'hidden' name = 'oldLetterGuessed' value = '' >";
    }

echo "<input type = 'hidden' name = 'wrongGuess' value= '$wrongGuess'>";

if ($wrongGuess < 6) {
    $alphas = range('A', 'Z');
    # display letter buttons
    for ($i=0; $i < count($alphas) ; $i++) { 
        echo "<input type = 'submit' name = 'letterGuessed' value = '" .  $alphas[$i] . "' >";
    }
}

else {
    #The Screen when you're lost
    echo nl2br("Oops looks like you've lost ");
    echo nl2br("\n");
    echo "The word you had to guess was ". $solution;
    echo nl2br("\n");
    echo "<form method = 'post' action = 'Restart()'>";
    echo "<input type = 'submit' value  = Restart'>";
    echo "</form>";
}
echo "</form>";
#Display omzetten naar lijnen
$display = $solution;
$length = strlen($display);
for ($i=0; $i < $length ; $i++) { 
    $display[$i] = "-";
}
if (isset($oldLetterGuessed)) {
    if ($oldLetterGuessed == "") {
        $display = "_ _ _ _ _ _";
    }
    else
    {
    $currentGuess = $_GET['letterGuessed'];
        # Looks at every letter and checks if it's the same
        if (HasBeenUsed($solution, $currentGuess) == true ) {
            # Positie zoeken $currentGuess in $solution
            $posLetter = strpos($solution, $currentGuess);
            # _ omzetten in de gegokte letter
            if ($posLetter !== NULL) {
                $display[$posLetter] = $currentGuess;
            }
        }
    }
    if ($display != $solution) {
        echo $display;
    }
    else {
        echo "You guessed the word";
    }
}
?>
</body>
</html>

2 个答案:

答案 0 :(得分:0)

每次您猜数字时都会有一个服务器呼叫,并且先前猜出的字母不再存在!

所以,您需要做的是使用$ _SESSION :) 我将在这里演示:

在您的PHP代码中:

<?php
session_start();
$_SESSION[word]=array();

// if a letter is correct just push it to your session array:
array_push($_SESSION[word],$letter);

// then you iterate the session array and according to the letters that resides there
// you revile the correct letters

答案 1 :(得分:0)

您可以使用会话来存储正确的答案及其位置,这是基于您的代码的示例:

首先启动会话:

session_start();

然后,您可以通过以下方式存储正确的猜测及其位置:

$_SESSION['guessed'][$posLetter] = $currentGuess;

在上面我创建了一个名为 guessed 的会话,向其中添加了职位和当前正确的猜字母。

然后,当您的页面重新加载时,它需要在正确的位置显示所有正确的猜测字母,因此您需要循环我们上面创建的会话:

if(isset($_SESSION['guessed'] )) { // Check if this session already exist
    foreach ($_SESSION['guessed'] as $position=>$guessed ) {
       $display[$position]=$guessed; // Assign the correct answer to the right position
    }
} 

此外,我建议您在表单中使用 post 方法而不是 get ,对于这种游戏,您最好使用JavaScript,这样速度更快,页面不会不必重新加载每个猜出的字母。

祝你好运!