Hangman fue un juego muy divertido en nuestra casa. Tomamos un bolígrafo y papel y se turnamos para elegir palabras para que el otro adivine. Hoy, se utiliza en los entornos del aula para ayudar a los niños a practicar su ortografía, comprender la toma de decisiones estratégicas eligiendo primero las vocales y la lluvia de ideas posibles palabras de sugerencias.
En este artículo, pasaremos por el juego Hangman implementándolo en Python. Este es un proyecto para principiantes donde aprenderemos los conceptos básicos del lenguaje de Python, como definir variables, funciones comúnmente utilizadas, bucles y declaraciones condicionales.
Comprender el proyecto
Primero, entenderemos el juego y entraremos en las profundidades de cómo debería funcionar nuestro código.
En un juego típico de 2-jugador de 2 jugadores, el jugador 1 elige una palabra, ocultándola del jugador 2 y genera espacios en blanco correspondientes al número de letras en la palabra que eligió para adivinar. El jugador 2 tiene que adivinar la palabra adivinando una letra a la vez. El jugador 2 tiene un número definido de vidas al principio, y con cada suposición equivocada de letras, pierden una vida (hasta el punto en que el hombre está ahorcado). Con cada suposición correcta, las vidas siguen siendo las mismas que antes. Si el jugador 2 pierde toda su vida sin adivinar la palabra, el juego ha terminado y pierden. Si logran adivinar la palabra, ganan el juego. Este es el esquema del juego en su sentido tradicional.
En este proyecto, la computadora será el Jugador 1, generando la palabra para adivinar, mientras que nosotros, el usuario, seremos el jugador 2. Implementemos lo anterior utilizando un diagrama de flujo para una mejor comprensión.
Dibujar un diagrama de flujo y definir cada paso ayuda a convertir nuestro proceso de pensamiento en código, por lo que siempre es una buena práctica dibujar uno. ¡Ahora comencemos codificando el problema!
Paso 1: Lista de palabras y el módulo aleatorio
El primer paso en este proyecto es que la computadora elija una palabra aleatoria que el usuario tendrá que adivinar. Para este propósito, necesitaremos ambas palabras de las cuales la computadora elige una palabra para adivinar, y una función de Python llamada Random, que elegirá al azar esa palabra de la lista dada.
Para generar la lista, busqué en Google los 100 sustantivos más comunes utilizados en el idioma inglés y encontré un lista. Usé estas palabras y creé una lista de Python con ella para ser utilizada en este proyecto.
Como su nombre indica, un Lista de Python es un tipo de datos que almacena en sí mismo una colección de elementos. Una lista de colores se definirá en Python como colors = ["red", "yellow", "green", "blue", "pink"]. Puede consultar la sintaxis de la lista y la información adicional de la página oficial de Python en Lista.
word_list = [
"time",
"year",
"people",
"way",
"day",
"man",
"thing",
...
]
Puede acceder a los archivos del proyecto desde mi Github repositorio. hangman_words.py es el archivo de Python que contiene la lista de palabras de las cuales la computadora elegirá una palabra al azar para el juego.
Ahora, una vez que se crea nuestra lista, necesitamos que la computadora elija una palabra aleatoria de la lista dada de palabras word_list. Python tiene un módulo, especialmente para este propósito llamado “aleatorio”. Importaremos el módulo y lo usaremos para permitir que la computadora elija aleatoriamente una palabra word_to_guess de la lista words_list. Puedes imprimir el word_to_guess ¡Mientras codifica el proyecto para mejorar la comprensión, y comente al jugar con la computadora!
import random
word_to_guess = random.choice(word_list)
print(word_to_guess)
Para más información sobre el random.choice() función, haga clic aquí.
Paso 2: generar espacios en blanco
El siguiente paso es generar espacios en blanco igual al número de letras en el word_to_guess para que el usuario tenga una idea del número de letras en la palabra que tiene que adivinar. Para esto, definiremos una variable llamada blanks que actuará como un contenedor para las letras sin guarda de la palabra. Contendrá el número de “_” igual al número de letras en el word_to_guess.
Para calcular el número de letras en el word_to_guess que ha sido elegido al azar por la computadora de la words_listusaremos la función de pitón len()que calcula la longitud de una cadena. Se puede acceder a más información sobre esta función incorporada a través de este enlace.
blanks = ""
word_length = len(word_to_guess)
Como ahora sabemos el número de letras en word_to_guessusaremos este número para agregar un número igual de “_” en la variable blanks. Para este propósito, usaremos el for bucle, una funcionalidad de Python que nos permite iterar sobre los elementos en una secuencia, en nuestro caso, la cadena que se almacena en la variable word_to_guess. Hacer clic aquí Para aprender más sobre for bucle y su sintaxis.
for i in range(word_length):
blanks = blanks + " _"
print("Word to guess: " + blanks)
El bloque anterior del código se iterará sobre el número de letras en el word_to_guess Cadena y genere un espacio en blanco para cada letra. Imprimirá tantas _ como el número de letras, cada una en blanco como marcador de posición para la letra de la palabra a adivinar. Entonces, para la palabra “tiempo”, la salida impresa en la pantalla será:
Palabra para adivinar: _ _ _ _
Paso 3: solicitar al usuario que adivine una carta
¡Ahora el juego realmente comienza! La computadora ha elegido una palabra, generó marcadores de posición en blanco para las letras en esa palabra. Ahora llega el momento para que el usuario comience a adivinar la palabra adivinando una letra a la vez.
Para pedirle al usuario una carta, usaremos el input función en python y guárdelo en la variable guess:
guess = input("Guess a letter").lower()
Hacer clic aquí Para obtener más información sobre la función incorporada de Python input().
Paso 4: Verifique si la letra está en la palabra
Una vez que el usuario haya adivinado una carta, verificaremos si el usuario lo ha adivinado y verifique si está en el word_to_guess.
Para hacer esto, usaremos un for bucle. Además, también crearemos otra variable, your_wordque se actualizará con las letras adivinadas y una lista vacía llamada,letters_guessed que almacenará las letras admitidas correctamente por el usuario (esto será útil como veremos más adelante).
Entonces, por ejemplo, si la computadora ha elegido la palabra “pastel de queso”, a medida que avanza el juego y el usuario ha adivinado las letras “c”, “e” y “a”, esto es lo que ambos your_word y letters_guessed se vería como:
Your_word = C_EE_ECA_E
letras_guessed = [“c”, “e”, “a”]
letters_guessed = []
your_word = ""
for letter in word_to_guess:
if letter == guess:
your_word = your_word + letter
letters_guessed.append(guess)
elif letter in letters_guessed:
your_word = your_word + letter
else:
your_word = your_word + "_"
Entonces, básicamente, lo que hace el bucle anterior es que itera a través del word_to_guess una carta a la vez y cheques:
- Si la carta admitida por el usuario
guessesta en elword_to_guessel código actualizará la variableyour_wordPara agregar la carta adivinada en su ubicación apropiada. Necesitamos entender que en Python, las cadenas son, de hecho, una secuencia de caracteres, y muchas funciones de la lista también son aplicables a las cadenas. Además, también agregaremos esta carta adivinada correctamente a la listaletters_guessed. - Si la carta que el usuario ha adivinado,
guessestá en elletters_guessedlo que significa que el usuario ya ha sugerido esta carta antes, entonces no tendremos que agregar esto a laletters_guessedpero solo tengo que agregar la carta en elyour_worden su ubicación apropiada. - Más, si la carta adivinada por el usuario no está en el
word_to_guessy por lo tanto no estará en elletters_guessedSimple generaremos espacios en blanco en algunos lugares.
Si el código anterior parece un poco abrumador, siéntase libre de ejecutar lo anterior para el bucle mientras defines las variables e imprimiendo cada una de las variables: word_to_guess, guess, guessed_lettersy your_word e imprimir las variables donde se cambian.
Paso 5: Crear el bucle while que se ejecuta hasta que termine el juego
Volvamos al diagrama de flujo que creamos para ayudarnos a comprender el proyecto. Para codificar este proyecto, debemos tener en cuenta los siguientes puntos:
- El usuario tiene un número definido de vidas al principio
- Por cada carta adivinada mal, las vidas se reducen en 1
- Si el usuario se queda sin vidas, el usuario pierde y el juego ha terminado
- Si al usuario le quedan vidas, la computadora le pedirá al usuario que adivine otra letra
- Por cada carta adivinada, las vidas permanecen sin cambios, y un espacio en blanco es reemplazado por una carta en el marcador de posición
blanks- Si la variable
your_wordestá todo lleno, el usuario gana el juego y el juego ha terminado - Si la variable
<code>your_wordQuedan espacios en blanco, luego la computadora nuevamente le pedirá al usuario que adivine la siguiente letra
- Si la variable
Desde que hemos creado el for El bucle previamente que atiende a la carta adivinada, ahora es el momento de incorporar la idea de vidas y reducirla cuando el usuario ha adivinado una carta incorrecta.
Definamos el número de vidas para el usuario con la variable number_of_lives. El usuario tiene 6 oportunidades de sugerir la letra incorrecta para adivinar la palabra.
number_of_lives = 6
Ahora, teniendo en cuenta los puntos mencionados anteriormente, también necesitamos una variable o una condición que nos indique que dejemos de pedirle al usuario que adivinemos cuándo termina el juego. Lo codifiquemos con la ayuda de una variable booleana.
Simplemente declarando, un booleano es un tipo de datos en Python que almacena verdadero o falso. Usaremos esta variable booleana para continuar el juego mientras es falso y viceversa. Inicialmente, mientras comienza el juego, esta variable será Falselo que significa que el juego no ha terminado.
game_over = False
Ahora presentaremos un while Luce con la condición de que se ejecute mientras el juego no haya terminado, e incluiremos las condiciones mencionadas anteriormente en este bucle. Mira más sobre el while bucle de la documentación oficial de Python aquí.
while not game over:
print("\nYou have ", number_of_lives, " lives remaining!")
guess = input("Guess a letter: ").lower()
your_word = ""
for letter in word_to_guess:
if letter == guess:
your_word = your_word + letter
letters_guessed.append(guess)
elif letter in letters_guessed:
your_word = your_word + letter
else:
your_word = your_word + "_"
print("Word to guess: ", your_word)
En la pieza de código anterior, hemos agregado la instrucción de entrada, así como la instrucción de impresión, que generará las letras adivinadas hasta ahora de acuerdo con su posición en el word_to_guess.
Paso 6: Situaciones de manejo
El último paso es manejar diferentes circunstancias. ¿Qué sucede si la carta que el usuario ha adivinado ya ha sido sugerida por el usuario o la carta no está en la palabra? Además, ¿qué pasa si se han adivinado todas las cartas y no hay más espacios en blanco en your_word? Esto significaría que el usuario ha adivinado la palabra y, por lo tanto, ganó.
Agregaremos esta situación en el código con las siguientes líneas:
if guess in letters_guessed:
print(f"\nYou've already guessed {guess}")
if "_" not in your_word:
game_over = True
print("\nYou have guessed the word! YOU WIN!")
Además, si la carta adivinada por el usuario no está en el word_to_guessLa suposición del usuario es incorrecta, entonces sus vidas se reducirán en 1, e informaremos al usuario que su carta adivinada no está en la palabra. Si reducir las vidas por una suposición incorrecta termina todas las vidas del usuario, entonces nuestra variable booleana game_over se establecerá como True y el juego terminará, con el usuario perdiendo el juego.
if guess not in word_to_guess:
number_of_lives -= 1
print(f"\nYou guessed {guess}, that's not in the word. You lose a life.")
if number_of_lives == 0:
game_over = True
print(f"\nIT WAS {word_to_guess}! YOU LOSE!")
Recuerde agregar los bloques de código anteriores dentro del while Loop que se ejecuta hasta que el juego no haya terminado. Se puede acceder a un código completo junto con comentarios valiosos a través de este repositorio de GitHub para una mejor comprensión.
Conclusión
El proyecto de codificación anterior se realizó con los conceptos básicos del lenguaje de Python. Nos encontramos con algunas funciones incorporadas, como print()y input()usamos el random módulo para generar palabras aleatorias para adivinar y usar for y while bucles en varias iteraciones según la necesidad. También pasamos por el condicional if, elif y else declaraciones. Estas son todas las herramientas básicas que cada principiante debe saber antes de que salgan a una codificación compleja. También podríamos haber definido y llamado funciones en este programa, pero esto estaba destinado a ser una introducción para principiantes al idioma de Python. Si eres un profesional en Python, ¡no dudes en compartir otras formas en que podríamos haber abordado este proyecto!