Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Terminando de programar el juego

23/25
Recursos

Aportes 7

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

¡Te reto a que ahora agregues a la personita para que tengamos un juego de ahorcado de verdad!
.
¿Tienes alguna idea de cómo podríamos hacerlo? 👀 Por su puesto que yo sí, acá te dejo mi solución a este reto:
.
Juego del ahorcado terminado
.
¿Qué hay de ti? ¿Cómo lo hiciste? ¿Pudiste agregar a la personita? ¡Compártenos tu solución acá! 👀👇

Para aquellos que les de este mensaje de error al ejecutar el juego
_ Fatal error: Uncaught Error: Call to undefined function str_contains()_
,se debe a la versión del PHP. La solución es agregar un pequeño polyfill.

if (!function_exists('str_contains')) {
  function str_contains(string $haystack, string $needle): bool
  {
      return '' === $needle || false !== strpos($haystack, $needle);
  }
}

Hola, lo hice un poco diferente, y en ingles, no agregue la personita pero si algunas validaciones. Nota: no se como hacer para que me salga mi codigo aqui en el aporte como un screenshot tan bonito 😦 ayuda!

<code> 
<?php

$word_bank = ["immutable","interface","identifier","time","symfony","controller", "entity"];
define("MAX_ATTEMPS", 6);

while (true) {
    $word = $word_bank[rand(0, count($word_bank) - 1)];
    $word_length = strlen($word);
    $attemps = MAX_ATTEMPS;
    echo "Welcome to the game!!!\n";
    echo "The word you need to guess has " . $word_length . " letters" . " ..." . PHP_EOL;
    echo "Good luck!!!\n";
    $game = str_pad("", $word_length, "_");
    $discovered = false;

    do {
        echo "You have $attemps attemps available..." . PHP_EOL;
        echo $game . PHP_EOL .PHP_EOL;
        $letter = readline("Enter a letter:");
        $letter = strtolower($letter);

        if (strlen($letter) == 1) {
            if (str_contains($game, $letter)) {
                echo "Try a new letter.\n";
                cleanSreen();
                continue;
            }
        } else {
            echo "Yo can enter just 1 letter at a time.\n";
            cleanSreen();
            continue;
        }

        if (str_contains($word, $letter)) {
            $offset = 0;
            while (($position = strpos($word, $letter, $offset)) !== false) {
                $game[$position] = $letter;
                $offset = $position + 1;
            }
            echo "Good!";
            $discovered = ($game === $word);
        } else {
            $attemps--;
            echo "The letter is not in this word.\n";
        }
        cleanSreen();
    } while (($attemps > 0) && !$discovered);

    if ($discovered) {
        echo "Congratulations!!! the word is $game\n";
    } else {
        echo "I'm sorry. Game over.\n";
        echo "The word was $word.\n";
    }
    $continuePlaying = readline("Do you want to continue playing? Y/N \n");
    if (strtolower($continuePlaying) === 'n'){
        echo "Good bye!";
        cleanSreen();
        break;
    } else{
        cleanSreen();
    }
}

function cleanSreen() {
    sleep(2);
    if (PHP_OS === "WINNT") {
        system("cls");
    }
    else {
        system("clear");
    }
}

Les comparto mi ejercicio

<?php

function clear ()
{
   if (PHP_OS === "WINNT") {
       system ("cls");
   }
   else {
       system ("clear");
   }
}
function dibujar ($attempts)
{
    $intento = $attempts;
    switch ($intento) {
        case 1:
            $Panchito = "*******\n***O***\n*******\n*******\n*******\n\n";
            break;
 
        case 2:
            $Panchito = "*******\n***O***\n***|***\n*******\n*******\n\n";
            break;

        case 3:
            $Panchito = "*******\n***O***\n*--|***\n*******\n*******\n\n";
            break;
     
        case 4:
            $Panchito = "*******\n***O***\n*--|--*\n*******\n*******\n\n";
            break;

        case 5:
            $Panchito = "*******\n***O***\n*--|--*\n**/****\n*******\n\n";
            break;
     
        case 6:
            $Panchito = "*******\n***O***\n**-|-**\n**/ \**\n*******\n\n";
            break;

        default:
        $Panchito = "*******\n*******\n*******\n*******\n*******\n\n";
            break;
    }
    return $Panchito;
}
$possible_words = ["Bebida", "Prisma", "Ala", "Dolor", "Piloto", "Baldosa", "Terremoto", "Asteroide", "Gallo", "Platzi"];
define ("MAX_ATTEMPS", 6);
// Inicializamos el juego
$choosen_word = $possible_words [ rand(0, 9)];
$choosen_word = strtolower ($choosen_word);
$word_length = strlen ($choosen_word);
$discovered_letters = str_pad ("", $word_length, "_");
$attempts= 0;
$panchito= "";

do{
    echo "¡Juego del Ahorcado! \n\n";
    echo dibujar($attempts);
    echo "Palabra de $word_length letras \n\n";
    echo $discovered_letters . "\n\n";

    //Pedimos al usuario que escriba
    $player_letter =readline ("Escribe una letra: ");
    $player_letter = strtolower($player_letter);

    if (str_contains($choosen_word, $player_letter)){
        //verificamos todas las ocurrencias de esta letra para reemplazarla
        $offset = 0;
        while(
            ($letter_position = strpos($choosen_word, $player_letter, $offset)) !== false )
            {
                $discovered_letters [$letter_position] = $player_letter;
                $offset = $letter_position + 1;
            }
    } else {
        clear();
        $attempts++;
        echo "letra incorrecta :c. te quedan " . (MAX_ATTEMPS - $attempts) . " intentos.";
        sleep(1);
    }
    clear();
}while ($attempts < MAX_ATTEMPS && $discovered_letters != $choosen_word);

clear();

if ($attempts < MAX_ATTEMPS) {
    echo dibujar($attempts);
    echo "\n\n";
    echo "¡Felicidades! has adivinado la palabra \n\n";
}
else{
    echo dibujar($attempts);
    echo "\n";
    echo "¡Suerte para la próxima, amigo. \n\n";
}

echo "La palabra es $choosen_word \n";
echo "Tu descubriste $discovered_letters \n";

echo  "\n";

si ven que hay algo que optimizar, estoy abierto a sugerencias

<?php

// una funcion que nos ayude a limpiar la pantalla
function clear(){

// php tiene una constante pre definida que se llama PHP_OS, esto de aca me dice en cual sistema operativo mi programa me esta ejecutando 
// WINNT =  windows 
if(PHP_OS === "WINNT"){

    // ejecutaria una funcion llamada system que me permite ejecutar comandos del sistema (comandos del sistema operativo) y decirle que el comando que yo quiero ejecutar es (cls) que en windows es para limpiar la pantalla 
    system("cls");
} else {
    // en caso de que sea linux o mack sirve el comando clear 
    system("clear");
}

}

// Bienvenido al juego Ahorcado

// aca definimos las palabras que tendra nuestro juego, esto lo hacemos mediante un arreglo
$possible_words = [“Bebida”, “Prisma”,“Ala”, “Dolor”,“Piloto”,
“Baldisa”, “Terremoto”, “Asteroide”,“Gallo”,“Platzi”];

// podemos definir una constante y se hace con define
// aca declaramos el maximo intentos por jugador
define(“MAX_ATTEMPS”,6);

echo “Bienvenido al juego del ahorcado \n\n”;

                                // Incializamos el juego 

// yo deberia de ejegir de forma aleatoria algunas de estas palabras que estan en el array possible_words
$choosen_word = $possible_words[rand(0, 9)];
// convertimos todas las palabras a minuscula
$choosen_word = strtolower($choosen_word);
// necesitamos saber cuanto mide o cuantas letras tiene la palabra que me convirtio (vamos a calcular cuanto mide eso)
$word_length = strlen($choosen_word);
// normalmente en el juego ahorcado ahi unos _ o unos scor indicando que es
// un espacio que todavia no hemos adivinado en este caso tambien debemos de
// mostrasrselo al usuario y para eso yo lo voy a guardar en una nueva
// variable que se va a llamar $discovered_letters, por ultimo lo que tenemos que hacer
// es generar esos guines _ para eso podemos usar una funcion se php llamada str_pad
// esta funcion lo que hace es rellenar de lo que yo le indique un string, en este caso
// quiero rellenar un string de meros guiones bajos(),
// esta funcion recibe de primeras un string cual es el string que quiero rellenar un string vacio
// por que quiero generar un string de la nada, luego me pide cual va a hacer el largo de lo que yo quiero rellenar
// tamabien me pide cual va a hacer el string con el cual yo lo quiero rellenar
$discovered_letters = str_pad("", $word_length, "
");

                // vamos a empoezar a generar la interaccion con el usuario 

// vamos a generar una varibale que me va a decir cuantos intentos fallidos ha tenido mi usuarios
// con esto esta inicalizado el juego tambien
$attemps = 0;
do{

                        // iniciemos el juego 

// vamos a decir al usuario cuanto mide esta palabra 
echo "palabra de $word_length letras \n\n";
// tambien le vamos a dar otro mensaje y le vamos a decir cuantas letras a descubierto
echo $discovered_letters . "\n\n";

// pedimos al usario que escriba 
$player_letter = readline("escribe una letra: ");
$player_letter = strtolower($player_letter);

// esta funcion me dice si una letra existe en algun string, devulve true o false 
// dependiendo si una letra existe o no en un string 
// lo primero que me pide es que le diga por ejemplo cual es la palabra que yo quiero usar para buscar en este caso seria $choosen_word
// yo quiero buscar la letra que mi usuario ingreso $player_letter 
if(str_contains($choosen_word, $player_letter)){

// vamos a verificar basicamente en donde o cuantas veces aparece esa letra dentro de la palabra y tambien en donde aparece

                    // verificamos todas las ocurrencias de esta letra para reemplazarla 
    //esta variable $letter_position no influye nada en mi ciclo, gracias a la presedencia de php crea esta variable con el resultado de strpos()
    $offset = 0;
    while(($letter_position = strpos($choosen_word, $player_letter, $offset)) !== false ){

        $discovered_letters[$letter_position] = $player_letter;
        $offset = $letter_position + 1;
    }


} else {
    // en el caso en el que no exista, es aumentarle su numero en intentos en uno 
    clear();
    $attemps++;
    echo "Letra Inconrrecta. Te quedan " . (MAX_ATTEMPS - $attemps) . " intentos";
    // vamos a decirle a mi programa de que antes que se vuelva a repetir que me de chance de leer el error 
    sleep(2); //2 segundos
}
clear();
// si mi numero de intentos es menor que MAX_ATTEMPS, mientras yo todavia tenga intentos disponibles quiero que esto se siga repitiendo y que discovered_letters sea diferente a $choosen_word

} while ( $attemps < MAX_ATTEMPS && $discovered_letters != $choosen_word);

clear();
// vamos a informarle a mi usuarios si gano o perdio 
if($attemps < MAX_ATTEMPS){
    echo "Felicidades has adivinado la palabra.  \n\n";
} else {
    echo " Suerte para la proxima amigo \n\n";
}

echo "La paralabra es: $choosen_word \n\n";
// estas son las letras que descubrio mi usuario 
echo "Tu descubriste $discovered_letters";

echo “\n”;

Sufrí más de la cuenta con el while por no poner bien los parentesis de la validación. Pero fue un hit el reto

¡Hola! Acá les dejo mi ejercicio. Espero se puedan ver bien los caracteres Unicode en sus terminales, en mi terminal de Visual Studio Code parecía verse bien.

<?php

function showAhorcado($remainAttempts)
{
    switch ($remainAttempts) {
        case 0:
            echo "😄 JUEGO DEL AHORCADO 😄\n\n";
            echo "\u{250C}\n";
            echo "\u{2502}\n";
            echo "\u{2502}\n";
            echo "\u{2502}\n";
            echo "\u{2502}\n";
            echo "\u{2502}\n";
            echo "\u{2502}\n";
            echo "\u{2502}\n";
            echo "\u{2534}\u{2500}\u{2500}\n";
            echo "\n\n\n";
            break;
        case 1:
            echo "😃 JUEGO DEL AHORCADO 😃\n\n";
            echo "\u{250F}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{253B}\u{2501}\u{2501}\n";
            echo "\n\n\n";
            break;
        case 2:
            echo "😐 JUEGO DEL AHORCADO 😐\n\n";
            echo "\u{250F}\u{2501}\u{2501}\u{2501}\u{2501}\u{2513}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{253B}\u{2501}\u{2501}\n";
            echo "\n\n\n";
            break;
        case 3:
            echo "😟 JUEGO DEL AHORCADO 😟\n\n";
            echo "\u{250F}\u{2501}\u{2501}\u{2501}\u{2501}\u{2513}\n";
            echo "\u{2503}   \u{256D}\u{2538}\u{256E}\n";
            echo "\u{2503}   \u{2570}\u{2500}\u{256F}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{253B}\u{2501}\u{2501}\n";
            echo "\n\n\n";
            break;
        case 4:
            echo "😞 JUEGO DEL AHORCADO 😞\n\n";
            echo "\u{250F}\u{2501}\u{2501}\u{2501}\u{2501}\u{2513}\n";
            echo "\u{2503}   \u{256D}\u{2538}\u{256E}\n";
            echo "\u{2503}   \u{2570}\u{2530}\u{256F}\n";
            echo "\u{2503}    \u{2503}\n";
            echo "\u{2503}    \u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{253B}\u{2501}\u{2501}\n";
            echo "\n\n\n";
            break;
        case 5:
            echo "😨 JUEGO DEL AHORCADO 😨\n\n";
            echo "\u{250F}\u{2501}\u{2501}\u{2501}\u{2501}\u{2513}\n";
            echo "\u{2503}   \u{256D}\u{2538}\u{256E}\n";
            echo "\u{2503}   \u{2570}\u{2530}\u{256F}\n";
            echo "\u{2503}  \u{2501}\u{2501}\u{254B}\u{2501}\u{2501}\n";
            echo "\u{2503}    \u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{253B}\u{2501}\u{2501}\n";
            echo "\n\n\n";
            break;
        case 6:
            echo "😭 JUEGO DEL AHORCADO 😭\n\n";
            echo "\u{250F}\u{2501}\u{2501}\u{2501}\u{2501}\u{2513} \u{1F480}\n";
            echo "\u{2503}   \u{256D}\u{2538}\u{256E}\n";
            echo "\u{2503}   \u{2570}\u{2530}\u{256F}\n";
            echo "\u{2503}  \u{2501}\u{2501}\u{254B}\u{2501}\u{2501}\n";
            echo "\u{2503}    \u{2503}\n";
            echo "\u{2503}   \u{250F}\u{253B}\u{2513}\n";
            echo "\u{2503}   \u{2503} \u{2503}\n";
            echo "\u{2503}\n";
            echo "\u{253B}\u{2501}\u{2501}\n";
            break;
    }
}

// Inicializamos el juego
$possibleWords = [
    'BEBIDA', 'PRISMA', 'ALA', 'DOLOR', 'PILOTO', 'BALDOSA', 'NUEVO', 'TERREMOTO', 'ASTEROIDE', 'GALLO', 'PLATZI', 'ERIZO', 'RED', 'TARRO', 'PARA', 'COMIDA', 'MICHI', 'GATOS', 'ARTE', 'GLOSARIO', 'DESARROLLO', 'FILOSOFIA', 'AEROPUERTO', 'CARPA', 'QUINQUE', 'ALARIDO', 'RIZAR', 'GUERRA', 'AGUA', 'AZAFATA', 'SOMETIDO', 'GUIRNALDA', 'GRANDE', 'TRAPECIO', 'TELEFONO', 'PIZCA', 'CIRROSIS', 'ARENA',
];
define('MAX_ATTEMPTS', 6);

do {
    $choosenWord       = $possibleWords[rand(0, count($possibleWords) - 1)];
    $choosenWord       = strtoupper($choosenWord);
    $wordLength        = strlen($choosenWord);
    $discoveredLetters = str_pad('', $wordLength, '_');
    $attempts          = 0;
    do {
        echo PHP_OS === 'WINNT' ? `cls` : `clear`;
        showAhorcado($attempts);

        echo "Adivina la palabra de $wordLength letras.\n\n";
        echo 'Te quedan '.MAX_ATTEMPTS - $attempts." intentos.\t";
        echo $discoveredLetters."\n\n";

        $playerLetter = readline('Escribe una letra: ');
        $playerLetter = substr($playerLetter, 0, 1);
        $playerLetter = strtoupper($playerLetter);

        if (str_contains($choosenWord, $playerLetter)) {
            $offset = 0;
            // Verificar ocurrencias de la letra para reemplazarla
            while (($letterPosition = strpos($choosenWord, $playerLetter, $offset)) !== false) {
                echo $letterPosition."\n";
                $discoveredLetters[$letterPosition] = $playerLetter;
                $offset                             = $letterPosition + 1;
            }
        } else {
            $attempts++;
        }
    }
    while ($attempts < 6 && str_contains($discoveredLetters, '_'));

    echo PHP_OS === 'WINNT' ? `cls` : `clear`;
    showAhorcado($attempts);
    if ($attempts == 6) {
        echo "\n\nYa no tienes intentos restantes.\n";
        echo 'La palabra por encontrar era '.$choosenWord;
    } else {
        echo "\n¡Ganaste! (Intentos restantes: ".MAX_ATTEMPTS - $attempts.")\n";
        echo 'Hallaste la palabra, es: '.$choosenWord;
    }
    echo "\n\n";

    do {
        $continueGame = readLine('¿Deseas jugar de nuevo (S/N)?: ');
        $continueGame = strtoupper($continueGame);
    } while (!($continueGame === 'S' || $continueGame === 'N'));
} while ($continueGame === 'S');

echo "\n\n";