Estás en:   ArielOrtiz.com > Estructura de datos > Adivinando el animal

Adivinando el animal

Objetivos

Durante esta actividad, los alumnos serán capaces de:

Esta actividad promueve las siguientes habilidades, valores y actitudes: análisis y síntesis, capacidad de resolver problemas, creatividad, y uso eficiente de la informática y las telecomunicaciones.

Descripción

Esta actividad puede ser elaborada de manera individual o en parejas.

Escribe un programa completo en Python que permita jugar el juego "Adivinando el animal", el cual consiste en solicitar al usuario que piense en un animal. Posteriormente el programa tratará de adivinar de qué animal se trata haciendo preguntas a las que el usuario deberá contestar con "sí" o "no". Aquí se muestra una corrida (los caracteres en azul corresponden a la entrada del usuario):

Piensa en un animal.
Yo trataré de adivinar cuál es haciéndote varias preguntas.

¿Es un animal doméstico? (s/n): s
¿Es un (una) perro? (s/n): n
* Escribe el nombre del animal que pensaste: toro
* Escribe una afirmación que sea verdad para un (una) toro
  pero que sea falsa para un (una) perro: tiene  cuernos
  
¿Deseas jugar otra vez? (s/n): s

¿Es un animal doméstico? (s/n): s
¿Tiene cuernos? (s/n): s
¿Es un (una) toro? (s/n): n
* Escribe el nombre del animal que pensaste: vaca
* Escribe una afirmación que sea verdad para un (una) vaca
  pero que sea falsa para un (una) toro: da leche
  
¿Deseas jugar otra vez? (s/n): s

¿Es un animal doméstico? (s/n): n
¿Es un (una) cocodrilo? (s/n): s
¡¡¡Adiviné!!!

¿Deseas jugar otra vez? (s/n): n

Adiós.

Como se puede observar, el programa aprende de sus errores, de tal forma que cada vez que no acierta se incrementa su conocimiento. El programa se debe implementar utilizando un árbol binario de decisiones, en donde cada nodo interno del árbol es una pregunta y cada hoja es el nombre de un animal. A partir de las respuestas del usuario, el árbol se recorre hacia la izquierda o derecha, dependiendo si se contestó de manera positiva o negativa, respectivamente. Al llegar a una hoja, se pregunta si el animal contenido ahí fue el que se pensó. En caso de no serlo, se hacen dos preguntas que causan que el árbol crezca, agregando una nueva hoja y un nuevo nodo intermedio. La siguiente figura muestra el árbol al inicio y al final de la corrida anterior.

Árbol binario de decisiones para el juego adivinando el animal

Debes usar un archivo binario para leer y escribir el árbol de decisión al inicio y final de la ejecución del programa, respectivamente. Esto con el fin de no perder toda la información provista por el usuario entre distintas corridas. El siguiente código, que utiliza el módulo pickle, permite leer y escribir casi cualquier objeto de Python desde o hacia un archivo binario:

from pickle import dump, load

#--------------------------------------------------------------------
def escribe_dato(nombre_archivo, dato):
    '''
    Escribe cualquier dato en el archivo binario indicado por 
    nombre_archivo.
    '''
    with open(nombre_archivo, 'wb') as archivo:
        dump(dato, archivo)

#--------------------------------------------------------------------        
def lee_dato(nombre_archivo):
    '''
    Lee cualquier dato contenido en el archivo binario indicado por
    nombre_archivo.
    '''
    with open(nombre_archivo, 'rb') as archivo:
        return load(archivo)

Para escribir un dato, la función escribe_dato se puede llamar así:

dato_a_escribir = ['Balin', 'Bifur', 'Bofur',
                   'Bombur', 'Dori', 'Dwalin',
                   'Fili', 'Gloin', 'Kili',
                   'Nori', 'Oin', 'Ori',
                   'Thorin']
escribe_dato('dato.bin', dato_a_escribir)

Vale la pena notar que dato_a_escribir puede contener una lista, un árbol binario, o prácticamente cualquier otro objeto de Python.

Para leer un dato previamente guardado, se puede invocar la función lee_dato así:

dato_leido = lee_dato('dato.bin')

Ten en cuenta que la primera vez que corras tu programa no va a existir aún el archivo de datos. Es necesario, por tanto, que el programa pregunte primero si el archivo existe:

from os.path import isfile

if isfile('dato.bin'):
    # El archivo dato.bin sí existe.
else:
    # El archivo dato.bin no existe.

Si el archivo existe puedes proceder a abrirlo y leer el dato ahí contenido. Sin embargo, si el archivo no existe, entonces debes crear un árbol inicial como el del inciso (a) de la figura de arriba y continuar tu programa a partir de ahí.

¿Qué se debe entregar?

Coloca la implementación completa del programa en un archivo llamado arbol_decision.py.

Sube el archivo arbol_decision.py usando el Sistema de Entrega de Tareas Automatizado. No se aceptan tareas por ningún otro medio.

Fecha límite: Viernes, 9 de noviembre.

IMPORTANTE: El archivo fuente debe incluir hasta arriba la información personal de los autores (nombre y matrícula) dentro de un comentario. Por ejemplo:

#--------------------------------------------------------------------
# Actividad de programación: Adivinando el animal
# Fecha: 9-Nov-2012
# Autores:
#           1166611 Pepper Pots  
#           1160611 Anthony Stark
#--------------------------------------------------------------------

Evaluación

Esta actividad será evaluada usando los siguientes criterios:

100 La actividad cumple con todos los requerimientos.
-10 No se incluyó en comentario los datos de los autores.
10 El programa fuente contiene errores sintácticos.
50-90 El programa produce algunos errores al momento de correrlo.
DA La solución es un plagio.