Programación por bloques
Ximena quiere hacer un juego donde un gatito esquive balones, pero no sabe escribir código. En un programa por bloques no hace falta: se encajan piezas, como en un rompecabezas, para decirle a la computadora qué hacer, en qué orden, cuándo repetir algo y cuándo decidir entre dos caminos. Al final de la página verás cómo resolver los fallos más comunes de ese tipo de juegos.
Las tres estructuras básicas
Explica con tus palabras qué hacen las tres estructuras básicas de un programa —secuencia, bucle y condicional— y pon un ejemplo de la vida diaria de cada una que no…
Explica con tus palabras qué hacen las tres estructuras básicas de un programa —secuencia, bucle y condicional— y pon un ejemplo de la vida diaria de cada una que no tenga que ver con computadoras.
Un programa tiene estos bloques sueltos: «decir ¡Adiós!», «al pulsar la bandera», «esperar un momento», «decir ¡Hola!». Ordénalos en la pila correcta y describe qué…
Un programa tiene estos bloques sueltos: «decir ¡Adiós!», «al pulsar la bandera», «esperar un momento», «decir ¡Hola!». Ordénalos en la pila correcta y describe qué ocurrirá exactamente al ejecutar el programa.
Estos bloques de apariencia están sueltos: «cambiar al disfraz de pirata», «decir ¡Hola, me llamo Marco! durante 2 segundos», «al pulsar la bandera», «esperar 1…
Estos bloques de apariencia están sueltos: «cambiar al disfraz de pirata», «decir ¡Hola, me llamo Marco! durante 2 segundos», «al pulsar la bandera», «esperar 1 segundo». Ordénalos para presentar a un personaje que primero saluda y luego se disfraza, y describe lo que verá el espectador.
Un programa tiene esta pila: «al pulsar la bandera», «decir 3», «esperar un momento», «decir 2», «esperar un momento», «decir 1», «decir ¡Ya!». Describe con detalle qué…
Un programa tiene esta pila: «al pulsar la bandera», «decir 3», «esperar un momento», «decir 2», «esperar un momento», «decir 1», «decir ¡Ya!». Describe con detalle qué verá y qué escuchará el usuario desde que pulsa la bandera hasta el final, y explica qué utilidad tienen las esperas.
Eventos, apariencia, sonido y escenario
Apariencia y sonido
Los bloques de apariencia cambian lo que se ve: «decir ¡Hola! durante 2 segundos», «cambiar al disfraz de pirata», «siguiente disfraz», «mostrarse», «esconderse». Los bloques de sonido cambian lo que se oye: «tocar sonido miau» y «tocar sonido miau hasta que termine».
Un bloque de sonido es una instrucción más de la pila: suena en el momento en que le toca ejecutarse. Si lo pones justo después de «al pulsar la bandera», sonará al arrancar; si lo pones dentro de un «si», solo sonará cuando la condición sea verdadera. Para que el sonido ocurra cuando un personaje alcanza a otro, se mete dentro de «si
Mover, tocar el borde y rebotar
El bloque «mover 10 pasos» desplaza al personaje 10 unidades en la dirección en que está mirando. Solo se ejecuta una vez, así que para que avance de forma continua hay que meterlo en un bucle «por siempre».
El bloque «si
Lo normal es combinarlos así: «por siempre: mover 10 pasos; rebotar si toca un borde». Cada vuelta avanza un poco y revisa si llegó al borde. Scratch calcula el contacto con el disfraz completo, no solo con su centro: si el disfraz no está centrado, parte de él puede seguir tocando el borde después de rebotar, y en la vuelta siguiente la comprobación vuelve a cumplirse. El personaje queda «temblando» pegado a la orilla.
Los bloques de evento deciden cuándo empieza a funcionar una pila de bloques. Explica qué hace arrancar cada uno de estos tres eventos: «al pulsar la bandera», «al…
Los bloques de evento deciden cuándo empieza a funcionar una pila de bloques. Explica qué hace arrancar cada uno de estos tres eventos: «al pulsar la bandera», «al pulsar la tecla espacio» y «al hacer clic en el personaje», y describe qué pasaría si un proyecto tiene dos pilas distintas con dos eventos distintos.
El programa de la figura, formado por bloques encajados, debería hacer que un personaje recorra el cuadrado punteado y avise al terminar, pero dentro del bucle falta un…
El programa de la figura, formado por bloques encajados, debería hacer que un personaje recorra el cuadrado punteado y avise al terminar, pero dentro del bucle falta un bloque.
Indica qué bloque falta dentro del bucle para que el personaje complete el recorrido del cuadrado y explica qué hace cada parte del programa.
En un juego, un gato corre por el escenario y un perro lo persigue. Explica dónde colocarías el bloque «tocar sonido miau» para que suene exactamente cuando el perro…
En un juego, un gato corre por el escenario y un perro lo persigue. Explica dónde colocarías el bloque «tocar sonido miau» para que suene exactamente cuando el perro alcanza al gato, qué bloque de comprobación lo acompaña y qué pasaría si el sonido estuviera fuera de esa comprobación.
El escenario de un programa por bloques funciona como un mapa de coordenadas: la «x» indica la posición horizontal y la «y» la vertical, y el centro es el punto…
El escenario de un programa por bloques funciona como un mapa de coordenadas: la «x» indica la posición horizontal y la «y» la vertical, y el centro es el punto $(0, 0)$. Explica dónde aparecerá el personaje con el bloque «ir a x: 0, y: 0» y hacia dónde se moverá si la «x» aumenta o si la «y» disminuye.
Variables, constantes y bucles controlados
Los operadores son de tres clases: aritméticos (+, −, ×, ÷), relacionales (<, >, =, que comparan y dan verdadero o falso) y lógicos (y, o, no).
Un cronómetro con «esperar 1 s» se atrasa
Un cronómetro típico es «por siempre: esperar 1 s; cambiar Segundos por 1». Parece exacto, pero cada vuelta dura un poco más de 1 segundo: el bloque «esperar» solo garantiza un tiempo aproximado, y además el programa tarda un instante en ejecutar los demás bloques y en atender a los otros personajes. Ese pequeño retraso se acumula vuelta tras vuelta.
Por ejemplo, si cada vuelta se atrasa 0.04 s, después de 600 vueltas (10 minutos) el desfase es $600 \times 0.04 = 24$ s: el cronómetro marca menos tiempo del real. Cuantos más personajes y movimientos haya, mayor es el retraso. La solución es no contar vueltas, sino leer un reloj real: el sensor «cronómetro» (o «tiempo actual») y restar el valor inicial, de modo que el resultado no dependa de la velocidad del bucle.
Un programa quiere contar del uno al diez con estos bloques: «repetir 10 veces: decir el número; sumar 1 al número». Al ejecutarlo, la cuenta no empieza en uno y, cada…
Un programa quiere contar del uno al diez con estos bloques: «repetir 10 veces: decir el número; sumar 1 al número». Al ejecutarlo, la cuenta no empieza en uno y, cada vez que se vuelve a ejecutar, empieza en un número distinto. Explica qué bloque falta y dónde debería colocarse, y en qué posición de la pila hay que poner el valor inicial del número.
La figura muestra un programa con una variable llamada «puntos» que controla un bucle. Haz la traza del programa: indica cuántas veces se ejecuta el bucle y cuántos…
La figura muestra un programa con una variable llamada «puntos» que controla un bucle.
Haz la traza del programa: indica cuántas veces se ejecuta el bucle y cuántos pasos da el personaje en total. Después razona qué ocurriría si el bloque «poner puntos a 0» estuviera dentro del bucle en lugar de antes.
Para animar un personaje se usa «repetir 4 veces: siguiente disfraz; esperar medio segundo». Explica qué consigue ese bucle y calcula cuánto dura la animación completa…
Para animar un personaje se usa «repetir 4 veces: siguiente disfraz; esperar medio segundo». Explica qué consigue ese bucle y calcula cuánto dura la animación completa si cada espera es de $0.5\ \text{s}$ y el cambio de disfraz es instantáneo.
La figura muestra dos programas que mueven a un personaje con dos tipos de bucle distintos. Explica qué diferencia hay entre los dos bucles, pon una situación en la que…
La figura muestra dos programas que mueven a un personaje con dos tipos de bucle distintos.
Explica qué diferencia hay entre los dos bucles, pon una situación en la que convenga usar cada uno y razona qué puede ocurrir con el bucle de la derecha si la meta no existiera.
En un juego de contrarreloj se quiere registrar el récord del menor tiempo empleado en completar un circuito. Un alumno escribe este código al llegar a la meta: «si…
En un juego de contrarreloj se quiere registrar el récord del menor tiempo empleado en completar un circuito. Un alumno escribe este código al llegar a la meta:
«si <Tiempo_Partida < Récord> entonces [fijar Récord a Tiempo_Partida]»
Sin embargo, al jugar por primera vez tras crear la variable Récord (que Scratch inicializa por defecto en 0), el récord nunca se actualiza, sin importar lo rápido que vaya el coche.
- a) Justifica por qué falla esta comprobación y explica la diferencia de inicialización entre buscar un récord de máxima puntuación y uno de tiempo mínimo.
- b) Diseña la estructura de bloques que resuelva este problema para la primera partida y las siguientes sin tener que escribir manualmente un valor inicial ficticio antes de pulsar la bandera verde.
Para medir la duración de una partida, se crea este cronómetro: «al presionar bandera verde: fijar Segundos a 0 por siempre: esperar 1 s cambiar Segundos por 1» Al…
Para medir la duración de una partida, se crea este cronómetro:
«al presionar bandera verde:
fijar Segundos a 0
por siempre:
esperar 1 s
cambiar Segundos por 1»
Al comparar este contador con un reloj real tras 10 minutos de juego intenso, el cronómetro de Scratch marca solo 9 minutos y 35 segundos (un desfase de 25 segundos).
- a) Justifica por qué un bucle con el bloque «esperar 1 s» acumula retraso cuando el juego procesa muchos personajes y movimientos simultáneos.
- b) Diseña un cronómetro alternativo en bloques utilizando el sensor «cronómetro» y variables que no dependa de la velocidad de refresco del juego y muestre el tiempo transcurrido en segundos con un decimal (por ejemplo: 14.2 s).
- c) Justifica por qué tu propuesta mantiene la precisión exacta aunque haya ralentizaciones en la pantalla.
Condicionales anidados y operadores lógicos
Terminar la partida: «detener todos»
El bloque de control «detener todos» para todos los scripts del proyecto: nada se mueve ni se ejecuta después. También existe «detener este script» (solo para la pila donde está) y «detener otros scripts del objeto». Para terminar un juego cuando se acaban las vidas se usa un condicional: «si
Como cualquier «si», solo comprueba en el momento en que le toca. Si lo pones una sola vez al inicio, justo después de «fijar Vidas a 3», se revisa cuando Vidas vale 3 y nunca más: el juego jamás termina. Debe ir dentro del «por siempre», junto con lo que cambia las vidas.
Otro detalle: si una trampa resta 2 vidas y te quedan 1, Vidas pasa a −1 y la condición «Vidas = 0» nunca se cumple. Usa una condición que cubra los casos de más: «Vidas < 1» (o «Vidas = 0 o Vidas < 0»).
Describe con tus palabras los bloques de un programa que pregunta la edad del usuario y responde «puedes pasar» si tiene 14 años o más, y «lo siento» en caso contrario.…
Describe con tus palabras los bloques de un programa que pregunta la edad del usuario y responde «puedes pasar» si tiene 14 años o más, y «lo siento» en caso contrario. Indica qué tipo de bloque de decisión usarías y qué comprobación haría exactamente.
Una cafetería de la colonia regala un café solo a los socios y solo antes de las 10 de la mañana. Describe los bloques de decisión anidados del programa que lo comprueba…
Una cafetería de la colonia regala un café solo a los socios y solo antes de las 10 de la mañana. Describe los bloques de decisión anidados del programa que lo comprueba y explica la diferencia entre poner dos «si» uno dentro de otro y poner dos «si» seguidos, usando este ejemplo.
Los bloques de operadores «y», «o» y «no» combinan comprobaciones. Explica qué hace cada uno y describe las condiciones completas de estos dos sistemas: una puerta que…
Los bloques de operadores «y», «o» y «no» combinan comprobaciones. Explica qué hace cada uno y describe las condiciones completas de estos dos sistemas: una puerta que se abre si la tarjeta es válida y además la huella coincide, y una alarma que suena si se abre la ventana o se rompe el cristal.
Un estudiante programa el movimiento de una pelota con este código: «por siempre: mover 10 pasos si toca el borde, rebotar» Al ejecutar el programa con una pelota cuyo…
Un estudiante programa el movimiento de una pelota con este código:
«por siempre:
mover 10 pasos
si toca el borde, rebotar»
Al ejecutar el programa con una pelota cuyo disfraz no está perfectamente centrado, observa que en ciertos ángulos la pelota se queda temblando y atascada en el borde de la pantalla sin poder salir.
- a) Explica paso a paso por qué se produce este bloqueo según cómo Scratch calcula la colisión con el borde y la posición del centro del disfraz.
- b) ¿Se solucionaría el problema simplemente invirtiendo el orden de los dos bloques dentro del bucle? Justifica tu respuesta prediciendo qué ocurriría en cada iteración.
- c) Diseña una modificación en los bloques que garantice que la pelota se despegue del borde y continúe su trayectoria con normalidad.
Un juego de plataformas tiene este script en el personaje: «al presionar bandera verde: fijar Vidas a 3 si <Vidas = 0> entonces [detener todos] por siempre: si <tocando…
Un juego de plataformas tiene este script en el personaje:
«al presionar bandera verde:
fijar Vidas a 3
si entonces [detener todos]
por siempre:
si <tocando Trampa?> entonces:
cambiar Vidas por -2
esperar 0.5 s»
El juego presenta dos fallos: la partida nunca termina aunque el jugador toque la trampa repetidamente, y si un jugador cae en la trampa teniendo 1 vida, el marcador pasa a -1 vidas sin detener el juego.
- a) Justifica por qué la comprobación de fin de partida tal como está colocada no detiene el juego en ningún momento.
- b) Explica por qué utilizar la condición estricta es un error de diseño cuando el daño resta más de 1 vida.
- c) Diseña la solución reubicando y modificando los bloques condicionales para asegurar que la partida finalice exactamente cuando las vidas se agoten o queden por debajo de cero.
Comunicación entre personajes
Vuelve al principio: el juego de Ximena necesita que el gatito toque un balón y pierda una sola vida, no veinte. Una condición dentro de «por siempre» se revisa muchas veces por segundo, así que después de restar la vida hay que esperar un momento o mandar un mensaje que reinicie el balón. Y cuando las vidas lleguen a cero, un «detener todos» dentro del mismo bucle cierra la partida.
En un proyecto hay dos personajes: un botón y un mago. Al hacer clic en el botón, el mago debe aparecer. Explica para qué sirven los bloques de «enviar mensaje» y «al…
En un proyecto hay dos personajes: un botón y un mago. Al hacer clic en el botón, el mago debe aparecer. Explica para qué sirven los bloques de «enviar mensaje» y «al recibir mensaje», describe las pilas de bloques que llevaría cada personaje y razona por qué no basta con poner los bloques del mago dentro del botón.
En un videojuego, se ha incluido este bloque dentro del bucle «por siempre» del personaje principal: «si <tocando Moneda?> entonces [cambiar Puntos por 1]» «si <tocando…
En un videojuego, se ha incluido este bloque dentro del bucle «por siempre» del personaje principal:
-
«si entonces [cambiar Puntos por 1]»
-
«si entonces [cambiar Vidas por -1]»
-
«si entonces [detener todos]»
Al probarlo, se detectan dos fallos graves: al tocar una única moneda el contador sube de golpe entre 15 y 20 puntos, y al rozar a un enemigo las 3 vidas se pierden de forma instantánea.
- a) Justifica técnicamente por qué ocurre esto teniendo en cuenta la velocidad de ejecución de los bucles por segundo.
- b) Diseña la modificación necesaria en los bloques de la moneda y del personaje para corregir ambos comportamientos sin pausar el movimiento general del juego (considera ocultar/destruir objetos y periodos de invulnerabilidad).
En un juego espacial, el objeto 'Asteroide' tiene programadas estas tres pilas: Pila 1: «al presionar bandera verde: por siempre [esperar 2 s; crear clon de mí mismo]»…
En un juego espacial, el objeto 'Asteroide' tiene programadas estas tres pilas:
Pila 1: «al presionar bandera verde: por siempre [esperar 2 s; crear clon de mí mismo]»
Pila 2: «al recibir Alerta_Meteoritos: crear clon de mí mismo»
Pila 3: «al comenzar como clon: mostrar; por siempre [cambiar y por -5; si <posición y < -170> entonces [esconder]]»
Tras jugar un par de minutos, el juego sufre ralentizaciones graves, dejan de crearse asteroides y cada vez que llega el mensaje Alerta_Meteoritos el número de clones se multiplica de forma incontrolada.
- a) Justifica por qué el bloque «esconder» causa que el juego deje de responder y alcance el límite de clones de Scratch.
- b) Explica el fallo de la Pila 2: ¿por qué los propios clones existentes duplican la cantidad de asteroides al recibir un mensaje?
- c) Diseña la solución correcta con bloques para la creación, movimiento y eliminación definitiva de los clones.
Un compañero ha programado el ciclo de un semáforo para coches (verde: 10 s; ámbar: 3 s; rojo: 12 s) y un semáforo de peatones sincronizado. Para ello, ha creado dos…
Un compañero ha programado el ciclo de un semáforo para coches (verde: 10 s; ámbar: 3 s; rojo: 12 s) y un semáforo de peatones sincronizado. Para ello, ha creado dos programas independientes con «al presionar bandera verde» y bucles «por siempre» con bloques de espera en cada objeto. Tras un minuto de simulación, los coches y los peatones tienen luz verde al mismo tiempo.
- a) Justifica por qué se produce esta desincronización peligrosa al usar bucles con tiempos de espera independientes.
- b) Diseña una solución con bloques que garantice que nunca coincidan en verde, explicando si utilizas variables de estado o mensajes («enviar mensaje y esperar») y detallando el orden exacto de los cambios de luz.
En un juego de Pong para dos jugadores (palas izquierda y derecha), se detectan estos errores de interacción: 1. Al sobrepasar la pala, la pelota rebota en el borde…
En un juego de Pong para dos jugadores (palas izquierda y derecha), se detectan estos errores de interacción:
-
Al sobrepasar la pala, la pelota rebota en el borde trasero y suma varios puntos consecutivos antes de que se reinicie el punto.
-
Mientras la pelota vuelve al centro tras un tanto, los jugadores pueden seguir golpeándola sumando puntos falsos.
-
Si la pelota roza la parte trasera de la pala cuando esta sube rápidamente, la pelota sale disparada hacia dentro de la portería propia.
- a) Diseña la estructura de bloques de la pelota para gestionar el tanto: detección del gol, parada momentánea del juego y comunicación con los marcadores mediante mensajes.
- b) Diseña la condición de rebote de la pala para que solo devuelva la pelota hacia el campo contrario si el impacto ocurre en su cara frontal, es decir, cuando la pelota se dirige hacia la pala.
- c) Explica cómo deben reaccionar las palas y la pelota al mensaje de 'nuevo punto' para reanudar el juego de forma justa y sincronizada.