Gabriel Ignacio China Cortez
Para los que no les funcione system("cls") pueden utilizar popen('cls', 'w');
Victor Manuel Rodriguez
gracias por el aporte!!!
Jorge Luis Rueda Marin
Buen aporte, gracias.
Kenneth Angulo L
Queria compartirles el reto que me puse, correr el juego en el navegador: Aun tengo que superar algunos bugs, pero ahi vamos, se esta logrando. .
Yensi Reyes
Que tal ya terminaste. Seria bueno ver como te quedo :)
Jhon Carlos Romo Ramirez
Llegó a terminar?
Aka SinssChoss
Reto terminado
Vistas
Código
<?php function clear() { if (PHP_OS === "WINNT") system("cls"); else system("clear"); } /* Solo agrega palabras */ $lista_palabras = ["programador", "gato", "comida", "desprolijo", "pensamiento", "satisfacción", "dormir", "codear"]; // constantes define("MAX_INTENTOS", 3); // variables lógica $palabra = $lista_palabras[rand(0, count($lista_palabras) -1)]; // resto porque los arrays comienzan en cero $palabra = strtolower($palabra); // paso la palabra a minuscula para asegurar $size_palabra = strlen($palabra); $cadena_letras = str_pad("", 2*$size_palabra, "_ "); // variables jugador $vidas = 3; $letra; $gano = false; $econtro_letra = false; // clear(); do{ // inicio echo "\n\n\t¡Bienvenido al juego del ahorcado!\n\n\n"; // va a variar echo "VIDAS = $vidas" . "\n\n"; echo "\t\t" . $cadena_letras . "\n\n"; $letra = readline("Ingrese una letra: "); $letra = strtolower($letra); // aseguramos que sea minuscula // busca coincidencia de la letra con la palabra, si es asi lo remplaza for ($i=0; $i < strlen($palabra) ; $i++) { if( $letra == $palabra[$i]){ // multiplico x2 a la posición porque mi cadena es así "_ _ _ _ _ _ _ _" $cadena_letras[2*$i] = $letra; $econtro_letra = true; } } // si no hubo por lo menos una coincidencia disminuye la vida if($econtro_letra == false){ $vidas--; } $econtro_letra = false; // reiniciamos la variable // obtenemos la palabra encontrada, quitando espacios en blanco y guiones bajo $palabra_encontrada = preg_replace(array('/\s/', '/_/'), '', $cadena_letras); // termina el juego si econtro la palabra if($palabra == $palabra_encontrada){ $gano = true; break; } }while($vidas > 0 && $gano == false); echo "\n\n\n\n"; if($gano == true){ echo "\tFelicitaciones!!! 🏆😊, econtraste la palabra"; echo "\nPalabra mágica = " . $palabra; } else{ echo "\tLo siento 😥, intentalo otra vez!!!😉"; echo "\nPalabra mágica = " . $palabra; echo "\nEcontraste = " . $cadena_letras ; } echo "\n\nHecho por Keneth Lopez 💚\n\n\n"; ?>
YEISON FERNANDO CASTAÑO UBILLUS
Gracias Keneth, excelente aporte
José Fabián Beltrán Meza
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); } }
Gabriel Puig
Hola amigo.... ¿dónde se agrega eso? y ¿cómo?
Luis Humberto Osorio Quiceno
Un saludo. La funcion esta en PHP para la version 8.0 en adelante. Vi esa solucion antes, pero no me funcion. Toco instalar PHP 8.0.19
y listo.
Juan David Rueda Quiroga
es mejor poner siempre las llaves como por ejemplo en los if else, siento que para mi es una mejor práctica
Kenneth Angulo L
muy de acuerdo con el companero.
Joel Dominguez Merino
Habra que implementar el muñequito pero de momento con el programa hecho en clase me pone feliz ver que la entendí la lógica del código solo que no sabia que existían la mayoría de funciones jaja Comparto el código como quedo (el de clase) .
Magdiel Linares
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"); } }
kleber Aguilar
Hola llege tarde pero si alguien mas ve esto debes tener una imagen de tu codigo y lo arrastras a la seccion de aportes aqui en Platzi y ya se genera saludos. 💚
Benjamín Parra
la función system("cls") no me funciona en window.. hay alguna otra forma?
Uso windows 10 y VSCODE
Jimmy Buriticá Londoño
Estoy usando Windows 11 y clear también funciona, prueba usar:
system('clear');
Angel David Velasco Bonifaz
Igual no me funciona, ni uno de los 2 codigos en windows clear y cls
Lautaro Agustin Barrera
Estoy teniendo problemas con la función clear.
Entonces probé poniendo unos echos para ver si estaba entrando en los condicionales.
Ahí pude darme cuenta que estaba entrando al de window.
En algunos aportes pude ver que window ahora soporta el comando clear así que decidí probar.
Ahora si hace algo pero no lo que esperaba 😕
Todo lo estoy haciendo desde un Windows 11 en la terminal Git Bash de Visual Studio Code.
Alejandra Ojeda
No me funciona, tengo el codigo exactamente igual, el guion bajo me muestra cantidad erronea de letras y cuando pongo una letra que coincide (osea es la correcta) me la toma mal, y posta, esta igual!
Jonathan Samah
Consulta me arroja un error que no me permite avanzar en la clase en la variable $intento inicializada en 0.
Uncaught Error: Undefined constant "O" in /home/jonathan/Documentos/CursoPHPBasic/clasesRelaxMaster/Ahorcado.php:23 Stack trace: #0 {main} thrown in /home/jonathan/Documentos/CursoPHPBasic/clasesRelaxMaster/Ahorcado.php on line 23
<<?php $Possible_words = ["gato", "perro", "leon", "pulpo", "vaca", "gorrion", "paloma", "leon", "gaviota"]; #listado de palabras define("MAX_ATTEMPS", 6); #cantidad de intentos en una costante echo "Juego del ahorcado de animales \n\n"; #inicializamos el juego $choosen_word = $Possible_words[rand(0,8)];#elecciop palabra al azar con funcion rand $choosen_word=strtolower($choosen_word);#strlower convierte todo a minusculas $word_length = strlen ($choosen_word); #strlen tiene funcion que cuenta cuanto mide la palabra en letras $discovered_letters = str_pad("", $word_length, "_"); #str_pad permite rellenar un string de guiones bajos #("" (string vacio), $word_length variable, el simbolo con que rellenar.) $attemps = O; //variable para que me diga cuantas veces a fallado echo "Palabra de $word_length letras \n\n"; #para decirle de cuantas letras es echo $discovered_letters . "\n\n";# las letras que ha descubierto de la palabra #pedimos al usuario que escriba $player_letter = readline ("Escribe una letra: "); #se guarda en esta variable $player_letter= strtolower($player_letter); if ( str_contains($choosen_word, $player_letter)){ #verificamos todas las ocurrencias de estas letras para reemplazarla #por medio de un ciclo while #strpos devuelve en cual posicion la letra que el usuario escribio #utilizo while para generar un ciclo que siga buscando la letra dentro de la palabra #offset = le dice a strpos que vuelva a iniciar busqueda en la palabra de la primera letra $offset=0; while( ($letter_position = strpos($choosen_word, $player_letter, $offset) !==false) ) { $discovered_letters[$letter_position]=$player_letter; $offset = $letter_position +1;# seria sumar el inicializador de la palabra } }else { $attemps++; echo"Letra icorrecta te quedan ". (MAX_ATTEMPS - $attemps). "intentos \n" ; } echo "\n";>
Jonathan Samah
Comparo con el video anterior no parece haber diferencia
John Alexander Diaz Astudillo
Hola Jonathan el problema es como inicializaste:
$attemps = O;
La inicializaste con una letra O;
$attemps = 0;
Cambiala por el numero 0 y ya... listo calixto.
Andrés Felipe Bocanegra Portela
no se por que siempre me sale este mensaje :(
Fatal error: Uncaught ValueError: strpos(): Argument #3 ($offset) must be contained in argument #1 ($haystack) in C:\Curso-php2\ahorcado.php:37 Stack trace: #0 C:\Curso-php2\ahorcado.php(37): strpos('carro', 'a', 6) #1 {main} thrown in C:\Curso-php2\ahorcado.php on line 37
Lariza Sandoval
Tuve problemas con la primera letra, hasta que vi en la documentación que hay usar === o !== (como lo hiciste tu). Porque es eso así?
Henry
=== compara dos valores y devuelve true si ambos además de ser idénticos son del mismo tipo.
!== compara dos valores y devuelve true si ambos además de no ser idénticos no son del mismo tipo.
Laura Juliana Serrano Garcia
Paz y bien, al código entregado sólo le agregue un switch para ir dibujando el dibujito que muestra como va nuestro juego. Muchas gracias, bendiciones.
<?php function clear() { if(PHP_OS === "WINNT"){ system("cls"); }else{ system("clear"); } } $possible_words = ["Bebida", "Piloto","Asteroide","Platzi"]; define("MAX_ATTEMPS", 6); echo "😼¡Juego del ahorcado! \n\n"; //Inicializamos el juego $choosen_word = $possible_words[rand(0,3)]; $choosen_word = strtolower($choosen_word); $word_length = strlen($choosen_word); $discovered_letters = str_pad("", $word_length, "_"); $attemps = 0; do{ echo "Palabra de $word_length letras \n\n"; echo $discovered_letters . "\n\n"; //Pedimos al usuario que escriba $player_letter = strtolower(readline("Escribe una letra: ")); 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(); $attemps++; echo "Letra incorrecta 😿. Te quedan " . (MAX_ATTEMPS - $attemps) . " intentos."; switch($attemps){ case 1: echo " ________ | |_| | | | | --- "; break; case 2: echo " _______ | |_| | | | | | | --- "; break; case 3: echo " ________ | |_| | /| | | | | --- "; break; case 4: echo " _______ | |_| | /|\ | | | | --- "; break; case 5: echo " _______ | |_| | /|\ | | | / | --- "; break; case 6: echo " _______ | |_| | /|\ | | | / \ | --- "; break; }; sleep(2); } }while($attemps < MAX_ATTEMPS && $discovered_letters != $choosen_word); clear(); if ($attemps < MAX_ATTEMPS) echo "¡Felicidades! Has adivinado la pantalla 😸 \n\n"; else echo "Suerte para la próxima \n\n"; echo "La palabra es: $choosen_word \n"; echo "Las letras descubiertas: $discovered_letters \n\n"; echo "\n";
Ilia Adad Infante Trejo
Esta es mi solución al reto: 1.- Se añade el continuar jugando con un ciclo while 2.- Se coloca el muñeco de ahorcado con un arreglo que se imprime con un ciclo for que evalúa el número de intentos 3.- Se corrige un error del programa cuando el usuario no introduce una letra, sino que presiona directamente enter generando una variable con contenido null. Queda pendiente: un selector de temas con acceso a un arreglo asociativo.
<?php function clear (){ if (PHP_OS === "Linux"){ system("clear"); } } clear(); $hang_man = [ "_____\n", " | \n O \n", //0 " /", //1 "|", //2 "\\ \n", //3 " /", //4 " \\", //5 ]; $possible_words = ["Ratón", "Pantalla", "Asteroide", "Gallo", "Gato", "Bocina", "Bota", "Edificio", "Lluvia", "Estudiante"]; define("MAX_ATTEMPS",6); $continue = 's'; echo "¡Juego del ahorcado! x_x \n\n"; //Inicializar juego while ($continue == 's'){ $choosen_word = $possible_words[rand(0,9)]; $choosen_word =strtolower($choosen_word); $word_lenght = strlen($choosen_word); $discovered_letters = str_pad("_",$word_lenght,"_"); $attemps = 0; sleep(2); do { clear(); echo "Palabra de $word_lenght letras \n"; echo $discovered_letters . "\n\n"; for ($i=0;$i<=$attemps;$i++){ echo $hang_man[$i]; }; echo "\n\n"; //Pedimos al usuario que accese la letra $player_letter = readline("Escribe una letra: "); if ($player_letter == null){ continue; } else { $player_letter = strtolower($player_letter); if (str_contains($choosen_word, $player_letter)){ $offset = 0; while (($letter_position = strpos($choosen_word,$player_letter,$offset)) !== false ){ $discovered_letters[$letter_position] = $player_letter; $offset = $letter_position + 1; } } else { $attemps++; echo "\n Letra incorrecta >_<', te quedan " . (MAX_ATTEMPS - $attemps) . " intentos. \n"; sleep(2); //pausa la ejecución en segundos } } } while( $attemps < MAX_ATTEMPS && $discovered_letters != $choosen_word ); clear(); if ($attemps < MAX_ATTEMPS) echo "¡Felicidades! Has adivinado la palabra. =) \n\n"; else echo "Suerte para la próxima, dude ;) \n\n"; echo "La palabra es '$choosen_word' \n"; echo "Descubriste las letras '$discovered_letters'"; echo "\n\n"; $continue = readline("Quieres seguir jugando? s/n: "); $continue = strtolower($continue); } echo "\n";
Daniel Urviola
Para dibujar al hombrecito ahorcado, he creado esta función
function ahorcado($intentos){ switch ($intentos) { case 1: echo " ____\n | |\n | O\n |\n | \n |\n-----\n"; break; case 2: echo " ____\n | |\n | O\n | | \n |\n |\n-----\n"; break; case 3: echo " ____\n | |\n | O\n | /| \n |\n |\n-----\n"; break; case 4: echo " ____\n | |\n | O\n | /|\ \n |\n |\n-----\n"; break; case 5: echo " ____\n | |\n | O\n | /|\ \n | /\n |\n-----\n"; break; case 6: echo " ____\n | |\n | O\n | /|\ \n | / \ \n |\n-----\n"; break; default: echo " ____\n | |\n |\n |\n |\n |\n-----\n"; break; } }
Y lo llamas dentro del ciclo do-while.
Marcos Sarmiento Loarte
Completé las Ideas a mejorar (retos) del juego
Jhon Isnober Diaz Ruiz
Estimados, comparto mi solucion. Es una adaptacion del mismo script que realice en el curso de python.
El archivo del require contiene el dibujo del ahorcado que lo tome de este git
<?php require('ascii_hangman.php'); define('HEARTS', 7); // Lista de palabras $dictionary = ["Bebida", "Prisma", "Ala", "Dolor", "Piloto", "Baldosa", "Terremoto", "Asteroide", "Gallo", "Platzi"]; // Obtener palabra del diccionario $selected_word = strtolower($dictionary[rand(0, count($dictionary)-1)]); $word_array = str_split($selected_word); $typed_letter = ''; $offsets = array(); $game_info = array( "word" => $word_array, "placeholder" => array_fill(0, count($word_array), '_'), "hearts" => HEARTS, "remaining_hearts" => HEARTS, "won_game" => false, "typed_letters" => [] ); while($game_info["remaining_hearts"] > 0 && !$game_info["won_game"]) { render($game_info, $hangman); if($game_info["word"] == $game_info["placeholder"]) { $game_info["won_game"] = true; break; } else { $typed_letter = readline("Escribe una letra: "); // Validar si es una letra if(ctype_alpha($typed_letter)) { $game_info["typed_letters"][] = $typed_letter; // Validar si la letra esta en la palabra if(in_array($typed_letter, $game_info["word"])) { // Obtiene la posicion de la letra en la palabra $offsets = array_keys($game_info["word"], $typed_letter); foreach($offsets as $key) { $game_info['placeholder'][$key] = $typed_letter; } } // La letra no existe en la palagra, descontar una vida else { $game_info['remaining_hearts']--; } } // No es una letra, descontar una vida else { $game_info['remaining_hearts']--; } } } if($game_info['won_game']) { echo PHP_EOL . "🥳🥳🥳 Felicidades, has ganado el juego 🥳🥳🥳" . PHP_EOL . PHP_EOL; } else { render($game_info, $hangman); echo PHP_EOL . "😭😭😭 Lo siento, has perdido 😭😭😭" . PHP_EOL; echo PHP_EOL . "La palabra era: $selected_word" . PHP_EOL . PHP_EOL; } function render( array $game_info, array $hangman = []) { // Limpiar pantalla system('clear'); $interface = array( "+==================================+" . PHP_EOL, "+++ Juego del ahorcado +++" . PHP_EOL, " " . PHP_EOL, "" . PHP_EOL, " " . PHP_EOL, "Vidas " .str_repeat("💖 ", $game_info["remaining_hearts"]) . PHP_EOL, "+==================================+" . PHP_EOL, ); $interface[3] = implode(' ',$game_info['placeholder']) . PHP_EOL; // Imprime imagen del ahorcado junto con la interface for($i = 0, $size = count($interface); $i < $size; $i++) { $index = $game_info["hearts"] - $game_info["remaining_hearts"]; echo $hangman[$index][$i] . ' ' . $interface[$i]; } }
Kenneth Angulo L
Claro, buena idea lo de cargar la imagen !!
LUIS DIAZ
Profe lo unico que pude ver que falto es verificar que el jugador no digite ninguna letra, creo que una simple verificacion despues de que el usuario coloque su letra seria suficiente.
Grande ProfRetax
Julio Cardenas