Proyecto de Programación – Campos Semánticos

Proyecto de Programación – Campos Semánticos

En esta actividad, vamos a aprender a programar, un juego muy sencillo en el que relacionar campos semánticos de algunas palabras.

¿Qué harás?

Aisoy, dirá un campo semántico y a continuación varias opciones de palabras con las que relacionarlo. El usuario tendrá que responder la opción correcta. Al final del juego este sumará las respuestas acertadas por el niño y comentará los resultados.

¿Qué aprenderás?

  1. Mientras programas con Python, vas a aprender a:
    • Utilizar diversas herramientas de python con Aisoy
    • Crear diálogos coherentes con el juego haciendo dinámica cada partida
    • Cómo estructurar el código de una Botapp sencilla
    • Uso de diccionarios para almacenar preguntas y respuestas correctas

Desarrollo

En este documento te damos los pasos para programar cada una de las partes necesarias para que Aisoy pueda ejecutar esta Botapp, y pasemos un rato agradable jugando con el.

1.- Crear el proyecto

Para crear vuestro primer proyecto os adjuntamos guía muy completa, sobre los métodos de crear un proyecto, para visualizarla click aquí.

2.- ¿Qué librerías vamos a usar?

 

 

Estos van a ser los módulos necesarios para desarrollar esta pequeña aplicación, conforme vayamos leyendo la documentación, veremos para qué van ser usados. Aun así esbozaremos lo que hace cada uno de estos import:

  • random: Se utilizará para generar números aleatorios.
  • time: Se usa para generar tiempos de espera en la ejecución.
  • threading: Se utiliza para ejecutar tareas de manera simultánea de una misma aplicación.
  • AirosHelper y Aisoy: Son librerías de Aisoy para las usar diferentes utilidades del robot.

 

3.- Rutina inicial: Movements

Cuando iniciamos una botapp, el robot inicia el juego con una serie de movimientos, sea de párpados, cejas o cabeza, que perduran durante toda la partida. Esto se realiza a través de la clase Movements, la cual a través de su método run.

Primero, hay que crear una clase init, para iniciar el hilo de ejecución de los movimientos e inicializar los parámetros.

 

Además, necesitamos un método run que será el que contemple toda la funcionalidad de clase y que se ejecutará en el Thread.

 

 

El método run ejecutará de forma aleatoria alternando movimientos de cabeza, ojos y párpados constantemente hasta que finalice el juego.

4.- Funcionalidades del robot Aisoy.

Crearemos la clase Botapp con un objeto estático Aisoy, para poder trabajar con nuestro robot. En esta clase todos sus métodos son estáticos, por ello, no es necesaria la instanciación de esta para su uso.

 

Para repetir el juego

Dentro de la clase Botapp, utilizamos este sencillo código, para preguntarle al niño si quiere seguir jugando o no. Este devuelve un 1 si quiere seguir jugando y un -1 si no quiere.

 

Comprobar los resultados obtenidos

En este método estático de la clase Botapp, comprobaremos el porcentaje de respuestas acertadas por el niño y según este porcentaje, se le dirá que necesita o no mejorar dentro de este juego.

 

Resultado incorrecto: oops

Tendremos que realizar un método que de feedback sobre un resultado incorrecto por parte del jugador, que le indique que ha fallado la pregunta. Además, cambiaremos la emoción del Aisoy, mostrándose triste por el fallo.

 

Dar la enhorabuena por un resultado acertado

Realizamos un método para dar la enhorabuena por acertar una de las cuestiones realizadas por Aisoy. Éste lo manifestará tanto por el habla  como por la emoción que expresa.

Presentación inicial del juego

Al iniciar la Botapp, Aisoy hará una breve presentación propia, indicando quién es él y su intención de querer jugar. Asimismo, para que Aisoy sepa que queremos jugar con él, tendremos que tocarle la cabeza, por lo que tenemos que utilizar which_touched() para recoger los datos del sensor de la cabeza.

 

Explicación del juego

 Este método estático explicará el juego si así lo desea el niño, según toque la parte izquierda o derecha de su cuerpo.

Despedida tras finalizar el juego

Cuando el juego finaliza, y no se quiere repetir, entonces Aisoy realiza una breve despedida, dando sus impresiones sobre el juego y cambiando sus emociones.

 

Recoger la respuesta del usuario

Esta función obtiene primero un campo semántico aleatorio, junto a las opciones posibles y a la opción correcta (llamando a get_options()), después llama a tts.say() para que Aisoy diga la pregunta, a continuación se llama a say_options() donde Aisoy dice las opciones posibles y devuelve la respuesta del usuario, que se asigna a respuesta. Entonces compara la respuesta correcta con la dada por el usuario. Por último devuelve si se ha acertado o no (CORRECT o INCORRECT). En caso de acertar elimina el campo semántico acertado del diccionario temporal.

 

Decir las posibles opciones de resultado

Este método estático, dirá las posibles opciones de resultado. Tras ello, para poder recoger la respuesta obtenida tras decir las opciones, necesitamos un método que llame a las funcionalidades del micrófono y recoja en una variable la respuesta, lo cual se hace empleando ASR y llamando a la función listen. La función devuelve la respuesta.

5.- Manejar las respuestas del usuario

Botapp_Struct es una clase que contiene métodos necesarios para establecer la estructura de las preguntas, más inclinados a la funcionalidad del juego que a la representación.

Tiene tres variables estáticas, que hacen referencia a los números que representan en el juego una respuesta correcta y una incorrecta, y al diccionario de campos semánticos que vamos a utilizar.

Además, también tiene varios métodos estáticos, que como hemos dicho atañen a la funcionalidad.

 

Obtener un campo aleatorio

Primero necesitamos elegir aleatoriamente un campo semántico del diccionario, por lo que primero tenemos que crear en el inicializador de la clase (_init_) una instancia del diccionario para esta partida. Desde esta instancia podremos eliminar y obtener campos aleatoriamente, junto a sus respectivas palabras. El método get_options() es el que se ocupa de la elección aleatoria, devolviendo el campo semántico, la respuesta correcta y las opciones posibles.

 

Eliminar campo del diccionario

Este método elimina un campo pasado por parámetro del diccionario de campos auxiliar de la partida, para que cuando se responda correctamente una pregunta no vuelva a salir después el mismo campo.

6.- Secuencia normal del Botapp

La clase Game, tiene como objetivo establecer la secuencia del juego, llamando a los métodos de las demás clases.

Tenemos que inicializar algunas variables globales de clase, que representan la opción de salir, repetir el juego y continuar. Además, se define la explicación y el título del juego.

 

 

Inicializador de la clase

Cuando se crea una instancia de esta clase, se llama automáticamente a este método, el cual inicializa algunas variables que se usarán en el transcurso del juego, como playing que indica que el juego se está ejecutando, por lo que cuando se quiere finalizar, pasa a valer False. Las demás son el número de cuestiones total en el juego, las preguntas acertadas hasta ahora, la opción de repetir el juego

Secuencia normal del juego

Es un trozo de código que a priori puede parecer más complicado que el resto de la Botapp, pero realmente tiene un procedimiento muy sencillo.

Primero presenta y explica en qué va consistir el juego, posteriormente inicializa siempre las respuestas acertadas a 0, y una vez hecho eso entra en un bucle for, donde por cada pregunta produce una emoción normal en Aisoy, llama a ask_input() pasando al estructura como parámetro y recoge el resultado del usuario. Si el resultado es CORRECT le da la enhorabuena y le suma un punto a las respuestas correctas, y si es INCORRECT, simplemente avisa de que la respuesta ha sido errónea llamando a oops(). Este bucle lo hace un cierto número de veces establecidas en el constructor de la clase. Por último llama a results() para comentar los resultados obtenidos.

Una vez terminado el juego pregunta si quieres repetir llamando a want_to_repeat(), si es así, vuelve a entrar en el bucle, sino, llama a bye_bye() y termina el main_loop().

7.- ¿Dónde ejecutamos todo el código que hemos escrito?

Lógicamente, debe existir un método main, el Thread principal, desde el cual crearemos una instancia del juego y lanzaremos main_loop() para que lleve a cabo la ejecución.

Desde este main se crea también el Thread de Movements y se inicia. Al acabar el juego (main_loop) entonces se debe unir este Thread al principal para que ambos terminen.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *