Pergunta

Estou tentando fazer algo semelhante ao Hangman, onde quando você adivinha uma carta, ela substitui um sublinhado pelo que é a carta. Eu inventei um caminho, mas parece muito ineficiente e estou me perguntando se há uma maneira melhor. Aqui está o que eu tenho -

<?
$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 faz o oposto do que eu quero. Eu quero o que o valor de $finalWord é sem ter que passar por um loop para obter o resultado que desejo.

Foi útil?

Solução

Se estou seguindo você direito, você quer fazer o oposto da primeira linha:

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

Por que não criar uma variedade de $opposite = range('a', 'z'); e depois use array_diff () Contra $ Lettersgueded, o que lhe dará uma variedade de cartas não dominadas. Certamente salvaria algumas linhas de código. Tal como:

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

Outras dicas

É uma matriz, foreach é o que você deve fazer, é um raio rápido de qualquer maneira, acho que você está obcecado com algo que nem é um problema.

Você deseja usar uma matriz porque pode dizer facilmente quais índices na matriz são os que contêm a letra, que se correlaciona diretamente a qual local na sequência _ deve se tornar uma letra.

Seu loop foreach é uma boa maneira de fazê -lo. Não será lento, porque suas palavras nunca serão enormes.

Você também pode criar um padrão regex com as letras adivinhadas para substituir tudo, exceto essas letras. Assim:

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

Outra maneira seria acessar a string como uma matriz, por exemplo

$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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top