Вопрос

Я пытаюсь сделать что-то похожее на hangman, где, когда вы угадываете букву, она заменяет подчеркивание на то, что это за буква.Я придумал способ, но он кажется очень неэффективным, и мне интересно, есть ли способ получше.Вот что у меня есть -

<?
$word = 'ball';
$lettersGuessed = array('b','a');

echo str_replace( $lettersGuessed , '_' , $word ); // __ll

echo '<br>';

$wordArray = str_split ( $word );

foreach ( $wordArray as $letterCheck )
{

    if ( in_array( $letterCheck, $lettersGuessed ) )
    {
        $finalWord .= $letterCheck;
    } else {
        $finalWord .= '_';
    }

}

echo $finalWord; // ba__
?>

str_replace делает прямо противоположное тому, чего я хочу.Я хочу, какова ценность $finalWord это без необходимости проходить через цикл, чтобы получить желаемый результат.

Это было полезно?

Решение

Если я правильно вас понимаю, вы хотите сделать обратное первой строке:

echo str_replace( $lettersGuessed , '_' , $word ); // __ll

Почему бы не создать массив из $opposite = range('a', 'z'); и затем используйте array_diff () против $lettersGuessed, который выдаст вам массив не угаданных букв.Это, безусловно, сэкономило бы несколько строк кода.Такие , как:

$all_letters = range('a', 'z');
$unguessed = array_diff ($all_letters, $lettersGuessed);
echo str_replace( $unguessed , '_' , $word ); // ba__

Другие советы

Это массив, предполагается, что вы делаете foreach, в любом случае это происходит молниеносно, я думаю, вы зациклены на чем-то, что даже не является проблемой.

Вы хотите использовать массив, потому что вы можете легко определить, какие индексы в массиве содержат букву, которая напрямую соотносится с тем, в каком месте строки _ должно стать буквой.

Ваш цикл foreach - прекрасный способ сделать это.Это не будет медленным, потому что ваши слова никогда не будут громкими.

Вы также можете создать шаблон регулярного выражения с угаданными буквами, чтобы заменить все, кроме этих букв.Вот так:

$word = 'ball';
$lettersGuessed = array('b','a');
$pattern = '/[^' . implode('', $lettersGuessed) . ']/';   // results in '/[^ba]/
$maskedWord = preg_replace($pattern, '_', $word);
echo $maskedWord;

Другим способом было бы получить доступ к строке в виде массива, например

$word = 'ball';
$length = strlen($word);
$mask = str_pad('', $length, '_');
$guessed = 'l';

for($i = 0; $i < $length; $i++) {
    if($word[$i] === $guessed) {
        $mask[$i] = $guessed;
    }
}
echo $mask; // __ll
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top