Game of Simon

June 09, 2014

In this chapter, we are going to create the game of Simon using our Aisoy1 and the Scratch programming tool.

Rules of the Game

In the game of Simon, we have to recite the correct sequence of colors displayed by the bot relying on the Aisoy1 voice recognition to capture our answers. The game will start simply by displaying one color and progress with incrementally longer color sequences displayed at faster speeds. The game ends when the user fails to recite a color sequence correctly.

The Program

So how can we accomplish this task? It’s easy using Scratch. First we will explain the variables used in this program.

  • active_grammar: Internal flag variable.

  • continue: Indicates if the game is finished (value = 1) or not (value = 2). We will set the default value to 0.

  • end: Enables aborting the main loop if the player chooses to do so.

  • hearing color: Set to allow bot to listen (1 when it is listening, 0 when it is not).

  • hearing confirmation: Set when bot is listening and a “Yes” or “No” answer is expected from the player. These variables allow us to manage the expected words to recognize in context.

  • iterator: Supports iterating through loops.

  • latch: Internal flag variable.

  • lose: Set to 1 if player fails to recite colors in the correct sequence. Default value is 0.

  • new color: Set to represent the new color in the sequence (a new color is added with each iteration).

  • points: Records points player has achieved (1 point for each sequence iteration).

  • time: Stores the amount of time that we set to display the colors (we decrement this value as we proceed to display the colors faster and make the game more difficult).

And now, the lists:

  • colors: This list will contain all the colors that the robot will display.

  • grammar: This list contains the vocabulary that we want the bot recognize (BLUE, RED, GREEN, YELLOW, YES, NO).

Now that we understand the different variables used in the program, we are going to review the process of constructing the game using Scratch programming blocks:

These first blocks initialize variables setting them to specific values. Note that time is set to 1.5 representing the delay time in seconds between color displays. We will decrease this value dynamically. In addition, we clear the "colors" list to remove the values from previous runs.

The first step is set the bot to the normal state (eyebrows, eyes, mouth and hearth color). Here is the block that will accomplish this:

Now, we turn off the Aisoy1’s heart color to enable the players to more easily see the change. Finally, we set the grammar or vocabulary of the robot using “grammar” variable.

These are the messages the bot will recite and that Scratch will display on screen to indicate that it will play the Simon game. Now we can investigate the core code of the program.

We set up a loop to repeat the game indefinitely while the "end" variable is set to 0 (this value will change when the player wants to end the program).

Then the "if" statement checks to see if the number of historic iterations is odd or even. If it is even we decrease the time delay by 25% (effectively making the sequencing faster every other iteration).

Will set the “lose” variable to 0 when we restart the loop. We are in a new iteration and want to add a new color to display. We generate a random number between 1 and 4 and add the corresponding color to the colors list (1 = BLUE, 2 = red, 3 = GREEN, 4 = YELLOW).

This block just tells the player to pay attention because we are about to display the colors.

This is the loop that displays the colors stored in the “colors” list. This list is the sequence that the player must repeat correctly in order to continue. Note that "secs wait time" block uses variable "time" to drive the amount of time to display each color.

Now we check to see if the player recites the displayed colors properly. Will reuse the variable "iterator" to count how many times the player has said a word (a color in this case). Therefore we must to restart and set the iterator to 1. Do you see that we use the “hearing color” variable to control that it’s hearing a color (view next image)?

Now, the bot asks the player to repeat the displayed sequence and waits until the player has recited all the correct colors or makes a mistake (setting the “lose” variable to 1).

We use these blocks to manage the evaluation of recited colors:

The code is exactly the same for the case for each of the four colors just differing in the associated value. For each iteration we check that the spoken value corresponds to that stored (so shown by the bot) in “colors” variable.

An incorrectly recited color results in failure. Then the "lose" variable will be set to 1 and the game ends.

After the previous “wait until” block, we continue with:

First, we find an “if-else” block that checks the value of lose” (1 indicates a fail).

If “lose” is not 1, the code will run the “else” sentences. The game continues and the player’s points are increased by 1 (the colors sequence was guessed correclty).

However, if “lose” is equal to 1, we set the bot to a sad state.

Next we inform the player of the failure and tell him or her the number of points that he or she scored.

At this point, the game is over. Then the bot will ask player if he or she wants to start a new game and wait for an answer. The “continue” value results from the player’s answer (“YES”=1 or “NO”=2).

If the answer is “NO”, the program will set the “continue” variable to 2 and the bot will thank the player for playing.

However, if the answer is “YES”, the bot will tell us the game will restart and set “continue” to 1. The “time” variable is reset to the default value (1.5) when we start a new game. We also turn off the heart color at the start of a new game.

Now we are back to the point where the loop had been waiting for the player’s reply.

Basically we check if the "continue" variable is set to 2, which would mean that we have decided not to play and end the program. If so, we set the value of the "end" variable to 1, which would take the program out of the loop for the next iteration and finish.

The other actions reset variables and lists to their default values. We have to do this step if the player answered "YES" to continue and restart the game.

We have finished the SIMON game for our Aisoy1. The final step is to connect our bot and launch the program by clicking the green flag.

Cheers to all and we hope you like it!

 

En este capítulo vamos a crear el juego del Simón basando su funcionamiento en nuestro Aisoy1.

Reglas

El juego consiste en acertar la serie de colores que mostrará el bot en su corazón, utilizando el sistema de reconocimiento de voz de Aisoy1. Se empezará mostrando un color, y conforme se avance en el juego dictando la secuencia exacta, su desarrollo será más rápido y más difícil de seguir, puesto que habrán más colores y éstos, a su vez, se mostrarán con mayor rapidez. Al fallar cualquier color al citar la serie, el juego terminará.

El programa

¿Cómo hacer esto para que funcione en nuestro robot? Utilizando Scratch es muy sencillo. Antes de nada veamos las variables que utilizaremos en el programa:

  • active_grammar: variable de uso interno.

  • continue: esta variable se utilizará para controlar el hecho de continuar una partida al terminar (tomará valor 1) o no hacerlo (valor 2) y terminar el programa. Tomará valor 0 por defecto.

  • end: esta variable abortará el bucle principal en caso de desear terminar el programa.

  • hearing colour: se utiliza para controlar el caso en que el bot esté esperando la secuencia de colores (1 si está escuchando, 0 si no).

  • hearing confirmation: esta determina cuando se está escuchando respuesta de tipo “SI  - NO”. A 1 significa que está escuchando y 0 cuando no. Con estas variables evitamos ejecutar código asociado a estas palabras en el momento equivocado durante la ejecución.

  • iterator: variable auxiliar utilizada como iterador en bluces.

  • latch: variable de uso interno.

  • lose: variable que toma valor 1 en caso de haber fallado en el dictado de alguno de los colores de la secuencia actual.

  • new color: variable donde se almacena el nuevo color añadible en cada paso del juego (puesto que en cada iteración se añade un color más).

  • points: aquí se almacenarán los puntos conseguidos (1 por cada iteración superada).

  • time: en esta almacenaremos el tiempo que queremos establecer para qu se muestre cada color (útil ya que este valor lo queremos modificar de forma dinámica para hacerlo cada vez más rápido, es decir, darle un valor más bajo)

Ahora veamos las listas utilizadas:

  • colours: esta lista contendrá todos los colores que vayamos mostrando en el robot.

  • grammar: lista que especifica el vocabulario a reconocer por voz por el robot (AZUL, ROJO, VERDE, AMARILLO, SI, NO).

Ahora que ya conocemos las diferentes variables que se utilizarán en el programa, veamos el procedimiento para construir el juego utilizando bloques de programación Scratch:

Estos primeros bloques inicializan las variables a un valor concreto. Notemos que time se establece a 1.5, que serán los segundos que habrá de espera entre un color y otro al ser mostrados de forma inicial. Más adelante iremos disminuyendo de forma dinámica este valor. A su vez, establecemos la lista “colours” a vacío para evitar problemas de ejecuciones anteriores.

Lo primero que hará el programa será establecer al robot en modo normal (valores de cejas, ojos, boca y corazón por defecto). Veamos el bloque creado por nosotros mismos a tal fin:

Seguidamente apagamos el corazón del robot para que sea palpable el cambio de color cuando aparezca el primero a adivinar. Y por último, seteamos la gramática o vocabulario del robot con la variable grammar.

Estos son los mensajes que emitirá el bot tanto por voz como por pantalla en Scratch para indicar que se va a jugar al Simon. Así que pasemos a comentar el código donde realmente se encuentra el meollo de la cuestión:

Establecemos un bucle para que el juego se repita de forma indefinida mientras la variable “end” tenga como valor 0 (este valor cambiará en el momento que se desee terminar con el programa).

A continuación, la sentencia “if” comprueba el caso en que el número de iteraciones (en este caso utilizamos la variable “points” dado que al acertar cada iteración sumará su valor en 1 y es un indicativo claro de en qué paso nos encontramos) sea par  o no (y no nos encontremos en el caso inicial, antes de hacer ninguna iteración, puesto que con la anterior condición también se cumpliria, al tomar “0 mod 0 = 0”). En ese caso haremos disminuir el tiempo en un 25% (esto es, cada dos iteraciones se hace más rápido el mostrado de colores).

Ahora estableceremos la variable “lose” a 0 dado que en el caso en que se reinicie la partida debe estar a 0. Y dado que nos encontramos en una nueva iteración y queremos añadir un nuevo color a mostrar, lo cogeremos con esta sentencia en que coge un valor de 1 a 4 de forma aleatoria, y seguidamente lo añadimos al vector de colores (1=AZUL, 2=ROJO, 3=VERDE, 4=AMARILLO).

Esto solamente es para indicar al jugador que se van a mostrar los colores y debe estar atento.

Este es el bucle que mostrará los colores almacenados en la variable “colours”, que es la secuencia que progresivamente se va construyendo y deberá el jugador repetir para continuar. Observemos que el bloque “wait time secs” utiliza la variable “time” para indicar el tiempo de muestreo de cada color.

Ahora queda comprobar que el jugador repita los colores que ha visto de forma adecuada. Reutilizaremos la variable “iterator” para contar las veces que el jugador va dictando palabras (o colores en este caso), con lo que debemos reiniciarlo y setearlo a 1. Notar como aquí utilizamos la variable “hearing colour” para determinar que solamente se atienda a la escucha de los colores que se encuentran en nuestra paleta (azul, rojo, verde, amarillo).

Ahora ya es cuestión de que el bot indique al jugador que dicte la secuencia y mientras esperar a que se nombren tantos colores como los hay en la lista colores, o el jugador haya fallado al nombrar alguno de los colores (lose toma valor 1).

Para gestionar la cita de colores se utilizan los siguientes bloques de código:

El código es exactamente el mismo para el caso en que se cite cualquiera de los cuatro colores, solamente se diferencia en que la comprobación se realiza con el valor asociado a cada uno de ellos. Vemos como para cada iteración se comprueba que el valor dictado por voz se corresponda con el almacenado (y por lo tanto mostrado por el bot) en la variable colours.

En caso de no corresponder, se habrá producido fallo, con lo que se seteará la variable “lose” a 1, lo que posteriormente hará que el juego finalice.

Veamos ahora la porción de código a ejecutar una vez se haya superado el bloque “wait until” anterior

Primero nos encontramos con un bloque de tipo “if-else”, en el cual se comprueba si la variable “lose” tiene el valor 1 (y por lo tanto se ha fallado) o no.

Si “lose” es distinto a 1, se iniciará el código dentro de la sentencia “else”, que básicamente hace que el bot indique que continuamos con el juego e incrementamos los puntos conseguidos en uno, puesto que se ha acertado la secuencia.

En cambio, si “lose=1”, establecemos al robot en estado triste (sad state).

A continuación se comunica que ha fallado, y se le indican los puntos conseguidos en la partida durante 7 segundos.

Dado que la partida ha terminado, el bot preguntará al jugador si quiere iniciar una partida nueva. Entonces, el bloque “Wait until” que podemos observar en la imagen, estará esperando hasta que el valor de la variable “continue” sea distinto a 0. ¿Y esto por qué es así? Porque ese valor lo cambiará el hecho de que entonces respondamos con un “SI” o un “NO” a la pregunta del robot.

Al recibir “SI” o “NO”, se ejecutará el bloques correspondiente. Para el caso del “NO”, simplemente se trata de setear la “variable” continue a 2 y agradecer al jugador su juego.

Por su parte, al afirmar, se nos indica que vamos a jugar de nuevo, y seteamos “continue” a 1, y la variable “time” a su valor por defecto, además de apagar el corazón.

Así que volvamos al punto en que el bucle se había quedado esperando la contestación del jugador.

Básicamente lo que hacemos es comprobar si la variable “continue” ha tomado el valor 2, lo cual significaría que hemos decidido no seguir jugando y terminar con el programa. Si esto es así, establecemos el valor de la variable “end” a 1, lo cual haría que el programa saliera del bucle en la siguiente iteración y termine.

Veamos que el resto de acciones son reinicializar variables y listas a sus valores por defecto, dado que esto es necesario si se ha respondido que “SÍ” a la opción de continuar e iniciar de nuevo la partida.

Y con esto ya tenemos listo nuestro juego de SIMON para nuestro Aisoy1. Solamente resta conectar debidamente nuestro robot y lanzar el programa presionando la banderita verde en Scratch.

¡Un saludo a todos y esperamos que os guste!

 


Also in Aisoy Blog

Aisoy welcomes North American Learning Robots, our new official distributor in the US.
Aisoy welcomes North American Learning Robots, our new official distributor in the US.

March 06, 2017

North American Learning Robotics is now the exclusive official distributor of Aisoy products in the US.

Aisoy, is a Spanish manufacturer of emotional educational robots which favor creativity and the development of multiple intelligences in a personalized way is ready to conquer the American market.

Read More

Aisoy wishes you a happy 2017
Aisoy wishes you a happy 2017

December 23, 2016

Every year has 365 days plenty of opportunities for enjoying life, with your family, with your friends, and why not, with a new robot that has come to our life and make us smile.

Read More

Aisoy is highly committed to children's education, particularly to children with special needs

October 29, 2016


New Friends 2016

Aisoy creates emotional robots for changing the way children play and learn. And makes them affordable for everyone. Since the first day, we participate and collaborate with people and initiatives aligned with us.

Read More