Capítulo 9 bis: Extendiendo Ahorcado

Temas Tratados En Este Capítulo:

Este programa fue mucho mayor que el programa Reino de Dragones, pero también más sofisticado. Realizar un diagrama de flujo o un pequeño esquema realmente ayuda a recordar como quieres que todo funcione.

Ahora que has creado un simple juego de Ahorcado, veamos algunos modos de que puedas extenderlo con nuevas funcionalidades.

Después de que hayas jugado al Ahorcado varias veces, puedes pensar que los seis intentos para adivinar la palabra no son suficientes para la mayoria de las palabras. Podemos sencillamente darle al jugador mas oportunidades agregando cadenas multi-linea a la lista IMAGENES_AHORCADO.

Guarda tu ahorcado.py como ahorcado3.py y luego agrega lo siguiente:

Ahora hay dos nuevas cadenas multi-línea en la lista, uno con sólo la oreja izquierda dibujada, y la otra con ambas dibujadas. Debido a que el programa dirá que el jugador perdió cuando el número de intentos es igual al número de cadenas en IMÁGENES_AHORCADO (menos uno), este es el unico cambio que debes hacer.

Cambia la lista de palabras cambiando las palabras en la línea 77. En vez de animales, podemos añadir colores:

O formas:

O frutas:

Con algunas modificaciones, podemos cambiar nuestro código para que nuestro juego del Ahorcado pueda utilizar todas estas palabras como conjuntos diferentes.

Diccionarios

Para realizar este cambio, necesitaras una nueva estructura de datos llamada diccionario. Un diccionario puede almacenar múltiples valores tal como lo hace una lista. Pero en vez de acceder a los elementos con un índice entero, puedes acceder a ellos con un índice de cualquier tipo. Para los diccionarios, estos índices son llamados claves (keys en inglés).

Los diccionarios usan llaves { y } en vez de corchetes [ y ]. Prueba ingresando lo siguiente en la consola interactiva:

En vez de utilizar un entero entre los corchetes, utilizas una valor cadena. Esto evaluará el valor para dicha clave.

Obteniendo el Tamaño de Diccionarios con len()

Puedes obtener la cantidad de pares clave-valor en el diccionario mediante la función len(). Prueba ingresando el siguiente ejemplo en la consola interactiva:

Las claves en los diccionarios también pueden iterarse utilizando un ciclo for. Prueba ingresando lo siguiente en la consola interactiva:

Los diccionarios se diferencian de las listas porque los valores dentro de ellos no son ordenados.
El primer elemento en una lista llamada listaCosas sería listaCosas[0]. Pero no hay un «primer» elemento en un diccionario, porque los diccionarios no tienen ningún tipo de orden. Prueba ingresando lo siguiente en la consola interactiva:

Expresiones, Duplas (clave-valor), Métodos key-values

La expresión favoritos1 == favoritos2 se evalúa a True porque los diccionarios no estan ordenados. Dos diccionarios se consideran iguales si tienen los mismos pares clave-valor, escritos en cualquier orden. Mientras tanto, las listas son ordenadas, dos listas con los mismos valores en distinto orden se consideran diferentes. Prueba ingresando lo siguiente en la consola interactiva:

Los diccionarios poseen dos métodos útiles, keys() y values(). Estos devolverán valores de un tipo llamados dict_keys y dict_values respectivamente (claves y valores). Similar a los objetos de rango, los valores de estos tipo de datos pueden convertirse facilmente a listas con la función list(). Prueba ingresando lo siguiente en la consola interactiva:

Conjuntos de Palabras para el Ahorcado

Cambiemos el código en el Ahorcado para soportar diferentes conjuntos de palabras secretas. Primero, cambia el valor en palabras a un diccionario cuyas claves sean cadenas y los valores sean listas de cadenas. El método de cadena split() será empleado para convertir la cadena en una lista de cadenas con una palabra cada una.

Este código dispuesto en múltiples líneas es interpretado como “una sola línea”, ya que la línea no termina hasta la llave } final.

La Función random.choice()

La función choice() del módulo random requiere una lista como argumento y devuelve un valor aleatorio de él, al igual que lo hacia la función obtenerPalabraAlAzar(). Usarás random.choice() en la nueva versión de obtenerPalabraAlAzar().

Para ver como funciona la función random.choice(), prueba ingresando lo siguiente en la consola interactiva:

Cambia el obtenerPalabraAlAzar() para que su parámetro sea un diccionario de listas de cadenas, en vez de tan sólo una lista de cadenas. Así es como la función se veía originalmente:

El nombre del parámetro listaDePalabras se cambia a diccionarioDePalabras para ser más descriptivo. Ahora en vez de elegir una cadena al azar de una lista de cadenas, la función elige primero una clave aleatoria del diccionario llamando a random.choice().

En vez de devolver listaDePalabras[índiceDePalabras], la función devuelve una lista con dos elementos. El primero es diccionarioDePalabras[claveDePalabras][índiceDePalabra]. El segundo claveDePalabras.

Evaluando un Diccionario de Listas

La expresión diccionarioDePalabras[claveDePalabras][índiceDePalabra] puede parecer complicada, pero es tan sólo una expresión que puedes evaluar un paso a la vez. Primero, claveDePalabras posee el valor ‘Frutas‘ y ahora índiceDePalabra posee el valor 5. Así es como se evalúa diccionarioDePalabras[claveDePalabras][índiceDePalabra]:

En este caso, el elemento de la lista que devuele la función será la cadena ‘sandia‘. (Recuerda que los índices comienzan en 0, así que [5] refiere al sexto elemento en la lista.)

Dado que obtenerPalabraAlAzar() ahora devuelve una lista de dos elementos en vez de una cadena, a palabraSecreta se le asignará una lista y no una cadena. Puedes asignar ambos elementos a dos variables separadas utilizando un truco de asignación múltiple.

Asignación Múltiple

Puedes especificar múltiples variables, separadas por comas, al lado izquierdo de la declaración de asignación. Prueba ingresando lo siguiente en la consola interactiva:

El ejemplo anterior es equivalente a las siguientes sentencias de asignación:

El truco está en colocar la misma cantidad de variables como elementos haya a la derecha del signo =. Python automáticamente asignará el valor del primer elemento a la primera variable, el valor del segundo elemento en la segunda variable y así continuamente. Pero si no posees la misma cantidad de elemento, el interprete de Python dará un error.

Cambia tu código en Ahorcado para utilizar este truco con la devolución de
obtenerPalabraAlAzar():

Imprimendo la Categoría para el Jugador

El último cambio que realizarás es decirle al jugador que conjunto de palabras está intentando de adivinar. De esta manera, cuando el jugador juegue el juego podrá saber si la palabra secreta es un animal, color, forma o fruta. Agrega estas líneas de código a partir de la línea 138.

Agrega una línea de modo que tu programa se vea así:

Ya hemos terminado con los cambios del Ahorcado. En vez de sólo una lista de cadenas, la palabra secreta es elegida de diferentes listas de cadenas. El programa también dirá al jugador de qué conjunto de palabras es la palabra secreta.

Prueba jugar esta nueva versión. ¡Ahora tu juego de Ahorcado se puede extender facilmente!

Resumen

Hemos terminado el Ahorcado. Incluso después de haber terminado de escribir un juego, puedes facilmente agregar más características trás haber aprendio más programación. El Ahorcado es ligeramente avanzado comparado con los juegos previos en este libro. Pero en este punto, sabes muchos de los conceptos básicos para escribir programas: variables, ciclos, funciones y los tipos de datos de Python como listas y diccionarios. Los siguientes programas en este libro seguirán siendo un desafío que tenemos que dominar, pero acabas de terminar la parte más empinada de la escalada.