Hangman "Word" em PHP
-
20-09-2019 - |
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.
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