Gabriel Ignacio China Cortez
EstudianteVictor Manuel Rodriguez
EstudianteJorge Luis Rueda Marin
EstudianteKenneth Angulo L
EstudianteYensi Reyes
EstudianteJhon Carlos Romo Ramirez
EstudianteAka SinssChoss
EstudianteYEISON FERNANDO CASTAÑO UBILLUS
EstudianteJosé Fabián Beltrán Meza
EstudianteGabriel Puig
EstudianteLuis Humberto Osorio Quiceno
EstudianteJuan David Rueda Quiroga
EstudianteKenneth Angulo L
EstudianteJoel Dominguez Merino
EstudianteMagdiel Linares
Estudiantekleber Aguilar
EstudianteBenjamín Parra
EstudianteJimmy Buriticá Londoño
EstudianteAngel David Velasco Bonifaz
EstudianteLautaro Agustin Barrera
EstudianteAlejandra Ojeda
EstudianteJonathan Samah
EstudianteJonathan Samah
EstudianteJohn Alexander Diaz Astudillo
EstudianteAndrés Felipe Bocanegra Portela
EstudianteLariza Sandoval
EstudianteHenry
EstudianteLaura Juliana Serrano Garcia
EstudianteIlia Adad Infante Trejo
EstudianteDaniel Urviola
EstudianteMarcos Sarmiento Loarte
EstudianteJhon Isnober Diaz Ruiz
EstudianteKenneth Angulo L
EstudianteLUIS DIAZ
EstudianteJulio Cardenas
EstudiantePara los que no les funcione system("cls") pueden utilizar popen('cls', 'w');
gracias por el aporte!!!
Buen aporte, gracias.
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. .
Que tal ya terminaste. Seria bueno ver como te quedo :)
Llegó a terminar?
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"; ?>
Gracias Keneth, excelente aporte
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 amigo.... ¿dónde se agrega eso? y ¿cómo?
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.
es mejor poner siempre las llaves como por ejemplo en los if else, siento que para mi es una mejor práctica
muy de acuerdo con el companero.
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) .
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"); } }
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. 💚
la función system("cls") no me funciona en window.. hay alguna otra forma?
Uso windows 10 y VSCODE
Estoy usando Windows 11 y clear también funciona, prueba usar:
system('clear');
Igual no me funciona, ni uno de los 2 codigos en windows clear y cls
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.
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!
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";>
Comparo con el video anterior no parece haber diferencia
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.
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
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í?
=== 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.
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";
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";
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.
Completé las Ideas a mejorar (retos) del juego
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]; } }
Claro, buena idea lo de cargar la imagen !!
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