Primer videojuego: Pong

Objetivos

 

  • Hacer que un objeto se mueva de forma autónoma por el escenario.
  • Utilizar la categoría de bloques “Sensores”.
  • Crear varios programas para un sólo objeto.
  • Programar un Pong para un jugador.
  • Material requerido.

     

    ArduinoUNO Arduino Uno o compatible y con el firmware para S4A cargado.

    Un PC con el entorno S4A correctamente instalado y configurado.

    Img_3_4  Una Protoboard.
    potenciómetro keyes Un potenciómetro de 10KΩ
    Img_3_6 Algunos cables de Protoboard..

     

    UN POCO DE HISTORIA

     

    Hace mucho, mucho tiempo (1972-1976), en una galaxia no muy lejana, los niños y los no tan niños se divertían con la primera generación de consolas.

    Eran aparatos muy sencillos de usar, bastaba con conectarlos a la tele y ponerse a jugar. Los controles eran simplemente ruedas o clavijas distribuidas normalmente por la caja de la propia consola.

    Tenían uno o varios juegos grabados en la memoria y no podías comprar más juegos, porque no tenían ningún soporte para ello. Pero hubo un juego que sobresalió por encima de todos, el Pong, una especie de tenis muy simplificado. No había un sistema de aquella primera generación que no incluyera un juego tipo Pong.

    television pong

    Cuando en la navidad de 1975 Atari comercializó su propia versión del Pong, se convirtió en un éxito inmediato. Consistía básicamente en una carcasa con conexión a la televisión y dos ruedas como controles. Más tarde salieron versiones que incluían hasta 16 variaciones de este juego  (que eran prácticamente lo mismo) e infinidad de consolas clónicas.

    consola atari pong

    Lo que vamos a hacer en esta sesión es utilizar lo que hemos aprendido para hacer nuestra propia versión de Pong con Arduino para un jugador y de paso aprender unas cuantas cosas por el camino. En la siguiente sesión lo haremos para dos jugadores.

    Teniendo en cuenta que en su momento costaba unos 100$ (que ahora equivaldrían a casi 400$, lo mismo que una consola de última generación), supongo que si le hubieses dicho a alguien en aquella época que un niño podría fabricar su propio Pong en casa como vamos a hacer nosotros, te hubiera mirado como a un marciano.

     

    VERSIÓN DE PONG PARA UN JUGADOR

     

    La idea es simular una especie de frontón, donde controlaremos una barra para hacer rebotar una pelota e impedir que se nos escape. Como vamos a manejar la barra con un potenciómetro, el montaje será el mismo que en la sesión 11.

    Dibujamos una barra, la ajustamos al tamaño que queramos y la programamos para que se posicione y se mueva de la misma manera que en la sesión 11.

     

  • Recordad cambiar el nombre del objeto y del disfraz a Barra, o algo semejante, para seguir manteniendo el orden y la claridad en nuestros proyectos.
  • Con el mismo propósito os recomiendo borrar el disfraz donde está dibujada la placa Arduino.
  •  

    posicion x barra

    Para hacer la pelota crearemos un  nuevo objeto, como ya sabemos de otras sesiones, y le haremos un disfraz. Para programar el movimiento de la pelota vamos a utilizar algunos bloques nuevos y una nueva manera de enfocar nuestros programas.

     

    DIVIDE Y VENCERÁS

     

    Hasta ahora, siempre que hemos programado un objeto lo hemos hecho todo en una única secuencia de instrucciones. Sin embargo, a medida que los programas se complican puede sernos útil dividirlo en varios programas, de forma que cada uno de ellos nos solucione una parte concreta del problema.

  • Aunque no es exactamente lo que se entiende en la programación tradicional como función, durante este tutorial de S4A vamos a referirnos a cada uno de estos pequeños programas como función.
  • Si os resulta más sencillo organizar el programa en funciones diferentes a las que planteamos aquí, no dudéis en hacerlo como lo veáis más claro.
  • Dividir un problema grande en otros más pequeños y tratar de solucionarlos poco a poco, es una práctica muy recomendable en cualquier aspecto de nuestras vidas.
  •  

    Lo primero que vamos a hacer es posicionar la pelota de en la parte superior del escenario y en el centro del eje X. Utilizaremos el bloque “ir a x: … y: … “.

    posicion pelota pong 1j

    En este mismo programa (función) vamos también a darle a la pelota la dirección inicial y la velocidad a la que se moverá.

    Para darle la dirección inicial vamos a utilizar el bloque de “Movimientos”” apuntar en dirección”. Si desplegamos las opciones de ese bloque veremos a que dirección corresponden los valores.

    s4a direccion objeto

     

  • También podemos indicar la dirección con valores entre 180 y 360 en vez de utilizar valores negativos.
  • Como queremos que vaya hacia abajo en una dirección aleatoria que no sea muy próxima a la horizontal, le daremos un valor al azar entre 120 y 240.
  •  

    pong dirección pelota s4a

    La velocidad se la daremos con el bloque de “Movimiento” “mover … pasos”. Yo le voy a poner para que empiece con 4. Tendremos que meterla en un bloque “por siempre” o sólo se movería 4 pasos una vez y se pararía.

    bloque mover 4 pasos

    En esta misma función haremos que la pelota rebote al tocar los bordes del escenario utilizando el bloque de “Movimiento” “rebotar si está tocando un borde”.

    bloque rebotar borde s4a

    En una nueva función haremos que la pelota rebote si toca la barra. Los bloques que se utilizan para que interactúen los objetos en el escenario están en la categoría “Sensores”.

    Comenzaremos la función con el bloque de control de la bandera verde y el bloque “por siempre si …”.

    Como condición le pondremos el bloque de “Sensores” “¿tocando …?”, y en el menú desplegable seleccionaremos Barra, o el nombre que hayamos puesto al objeto de la barra.

    tocando barra pong

    Haremos que si pelota toca la barra rebote como si fuera una pared, pero le añadiremos un poco de aleatoriedad para evitar quedarnos atrapados en situaciones sin fin y añadirle un poco de dificultad al juego.

    Para calcular el rebote utilizaremos el bloque “dirección”, que es una variable que guarda el valor de la dirección de movimiento del objeto, en este caso la pelota.

    Para que actúe como una pared, la dirección al rebotar tiene que ser 180º (vertical hacia abajo) menos la dirección que llevaba antes.

    rebote barra pong

    Le añadiremos un poco de aleatoriedad sumándole un número al azar entre -30 y 30.

    bloque azar rebote pong

    Una vez haya cambiado de dirección, haremos  que se mueva 4 pasos una única vez, para evitar que detecte varios toques con la barra en vez de uno sólo.

    bloque mover rebote pong

    Ya tenemos programado el funcionamiento de los objetos, pero para convertirlo en un videojuego hay que darle un poco de emoción y sobre todo hacer que podamos perder.

    La manera más sencilla de detectar cuando la pelota nos ha sobrepasado es pintar en el fondo del escenario una ralla de cualquier color que no sea el de las barras ni la pelota, y hacer que si la pelota toca ese color se acabe el juego.

    escenario sa4 ralla perder

    Crearemos una nueva función para detectar si la pelota toca la línea, y si la toca, detener todos los programas.

    Utilizaremos una estructura parecida a la que detecta si toca la barra, pero usando el bloque de “Sensores” “¿tocando el color …?”.

    s4a tocando color

    Si hacemos click en el cuadrado con el color nos saldrá un icono de cuentagotas. Seleccionamos el color que queremos en el escenario, en este caso el rojo de la línea que hemos pintado y el color del cuadro del bloque cambiará.

    Dentro de la condición colocamos el bloque de “Control” “detener todo”.

    bloque detener todo s4a

     

    AÑADIENDO UN POCO DE DIFICULTAD

     

    Vamos a complicar un poco más tanto el programa como el videojuego en sí, haciendo que la velocidad de la pelota vaya subiendo a medida que pasa el tiempo y que cuando perdamos se nos muestre el tiempo que hemos conseguido aguantar.

    En vez de darle una velocidad fija a la pelota, le asignaremos el valor de una variable “velocidad” a la que fijaremos al inicio un valor de 4 (o el que queramos). Esto lo incluiremos en la función en la que fijábamos las condiciones iniciales.

    mover variable s4a

    Ahora vamos a añadirle otra función que haga que suba la velocidad dos pasos cada diez segundos. Utilizaremos el bloque de “Sensores” “cronómetro”, que es una variable que guarda el tiempo que ha pasado desde abrimos o creamos un proyecto.

  • Con el bloque “reiniciar cronómetro” lo pondremos a 0 cada vez que iniciemos el programa.
  • Creamos una variable “límite” a la que le asignaremos el valor 10.
  • También podríamos incluir estos bloques en la función en la que fijamos las condiciones iniciales.
  •  

    bloque reiniciar cronometro s4a

    Haremos que si el valor del “cronómetro” es mayor que “límite” le sume dos a la variable “velocidad”  y le sume 10 al valor del límite para que vuelva a subir la velocidad diez segundos después.

    función aumento velocidad

    Ya sólo nos queda programar que cuando perdamos se nos muestre en pantalla cuánto tiempo hemos aguantado.

    En la función en la que detenemos los programas, haremos que antes pare la pelota y nos muestre el valor del cronómetro.  Utilizaremos el bloque de “Apariencia” “decir por segundos“, le asignamos el valor del cronómetro y hacemos que lo muestre durante 5 segundos.

    funcion fin pong

    De esta forma la programación del objeto Bola nos quedaría así.

    funciones s4a pong 1j

    Aquí os dejo el programa completo por si lo queréis descargar: Pong1j

     

  • Podéis organizar los programas como mejor os parezca, no tiene por qué ser de esta misma manera. Si os resulta más sencillo, podéis construirlo en un único programa de esta forma.
  •  

    pong s4a sin funciones

     

  • Cuando vayáis a jugar, recordad que podéis ponerlo a pantalla completa, quitar la tabla de resumen de valores para que no os moleste y mostrar las variables que queráis, como por ejemplo la velocidad de la bola y el cronómetro, para ver qué tal va la partida.
  •  

    jugando pong 1 jugador

     

    RESUMEN DE LA SESIÓN

     

    En esta sesión hemos aprendido varias cosas importantes:

  • Es más fácil dividir los programas en varias funciones.
  • A crear objetos que se mueven de forma autónoma por el escenario.
  • Sabemos hacer que interactúen gráficamente unos objetos con otros.
  • Conocemos el nuevo tipo de bloques “Sensores”.
  •    

    Deja una respuesta