📄 Documento para el Profesor

Soluciones completas
Misión Primavera 🌸

Guía bloque a bloque de cada nivel. Incluye el código completo, explicaciones del porqué de cada decisión y los errores típicos del alumnado.

🔑 Versión Docente — No compartir con el alumnado
🌱

Solución — Nivel Semilla

La Flor que Crece. Personaje único, 3 bloques WHEN independientes. Tiempo estimado: 12–15 min.

📦 Variables necesarias en este nivel

En este nivel no hace falta crear ninguna variable. Todo se controla con bloques de acción directa sobre el personaje.

Este nivel es deliberadamente sin variables para que los alumnos se concentren en entender la estructura evento → acción antes de añadir complejidad.

🎭 Personaje: FLOR

🌸 Personaje 1 — "Flor"

Un solo personaje en el centro de la pantalla. En la biblioteca de Hopscotch buscar "flower" o usar cualquier personaje redondo renombrado como "Flor".

Bloque WHEN nº 1 — Configuración inicial
// Flor → Bloque 1 de 3
WHEN Game Starts Set Size 40 ← porcentaje, no píxeles Set Color Green Set Position X: 512 Y: 384 ← centro exacto del iPad
⚠️ Error típico: los alumnos ponen Set Size 40% dentro del bloque de "When Tapped" en lugar de en "When Game Starts". Resultado: la flor siempre empieza grande porque el Set Size 40 sólo se ejecuta cuando la tocan, no al inicio.
Bloque WHEN nº 2 — Reacción al toque
// Flor → Bloque 2 de 3
WHEN Character is Tapped Change Size by 20 ← suma 20 al tamaño actual Play Sound Happy ← cualquier sonido de la biblioteca Set Color Random Color ← Hopscotch genera un color aleatorio
Bloque WHEN nº 3 — Animación continua
// Flor → Bloque 3 de 3
WHEN Game Starts Repeat Forever Turn 2 degrees ← giro pequeño para suavidad
🧠 ¿Por qué dos bloques "When Game Starts"? Hopscotch ejecuta TODOS los bloques "When Game Starts" de un personaje simultáneamente, como si fueran hilos paralelos. El primero configura los valores iniciales y termina. El segundo entra inmediatamente en el Repeat Forever y gira para siempre. No interferirán entre sí porque el primero ya terminó su trabajo en los primeros fotogramas. Es un concepto clave de la programación concurrente simplificada.
💡 ¿Por qué Turn 2 y no Turn 10? Con 2 grados por fotograma y ~30 fps el personaje gira 60 grados por segundo: visible y suave. Con 10 grados daría vértigo. Con 0.5 apenas se percibiría. Puede ajustarse al gusto.

✅ Resultado final del Nivel Semilla

  • Al iniciar: tamaño pequeño, verde, centrada.
  • Cada toque: crece +20, suena, cambia de color.
  • Continuamente: gira despacio en bucle.
🌿

Solución — Nivel Brote

La Mariposa + contador de polinizaciones. Se trabaja sobre el proyecto anterior añadiendo un segundo personaje y las primeras variables.

📦 Variables a crear antes de empezar

NombreValor inicialTipoPara qué sirve
polinizaciones0NúmeroCuenta cuántas veces la mariposa toca la flor
⚠️ Crear la variable antes de programar. Menú ➜ Variables ➜ (+) Nueva variable ➜ nombre: polinizaciones ➜ valor inicial: 0. Si se crea dentro del código sin inicializarla, Hopscotch la trata como 0, pero es mejor práctica inicializarla explícitamente.

🎭 Personaje 1: FLOR (ya programado en Semilla)

No hay que modificar nada de la Flor. Los 3 bloques del Nivel Semilla se conservan. La detección de colisión se programa desde la Mariposa, no desde la Flor.

En Hopscotch las colisiones se detectan siempre desde el personaje que "choca", no desde el que "recibe". Por eso añadiremos el evento When bumps Flor en la Mariposa, no al revés.

🎭 Personaje 2: MARIPOSA (nuevo)

🦋 Personaje 2 — "Mariposa"

Añadir desde la biblioteca. Colocarla en cualquier posición de la pantalla.

Bloque WHEN nº 1 — Movimiento por dedo (versión básica)
// Mariposa → Bloque 1 (versión básica, para alumnos con dificultades)
WHEN Game Starts Repeat Forever Set Position X: Last Touch X Y: Last Touch Y
Bloque WHEN nº 1 — Movimiento por dedo (versión suavizada, para alumnos medios/avanzados)
// Mariposa → Bloque 1 (versión suave — interpolación)
WHEN Game Starts Repeat Forever Set X (Self X) + ((Last Touch X - Self X) / 6) Set Y (Self Y) + ((Last Touch Y - Self Y) / 6)
🧮
Explicación de la fórmula de interpolación (importante para el profesor):

Imagina que la mariposa está en X=100 y el dedo en X=700. La distancia que le queda es 600.
Con el divisor /6: mueve 600/6 = 100 píxeles este fotograma. Queda en X=200.
Siguiente fotograma: distancia restante 500 → mueve 500/6 ≈ 83px. Queda en X=283.
Y así sucesivamente: cada fotograma recorre 1/6 del camino restante.

El efecto visual es una aceleración inicial grande que va frenando suavemente al llegar. Se llama ease-out en animación. El divisor controla la velocidad: /3 va muy rápido, /10 va muy lento, /6 es el equilibrio natural.
Bloque WHEN nº 2 — Detección de colisión con la Flor
// Mariposa → Bloque 2 de 3
WHEN Mariposa bumps Flor Change polinizaciones by 1 Play Sound Boing
⚠️ Error frecuente: el evento "bumps" se dispara en cada fotograma mientras los sprites se solapan, no una sola vez al contacto. Si la mariposa permanece encima de la flor 1 segundo (≈30 fotogramas), el contador subirá 30. Para corregirlo: añadir un Wait 0.5 seconds dentro del bloque bump, justo después del Change polinizaciones by 1.
Bloque WHEN nº 3 — Condición de victoria
// Mariposa → Bloque 3 de 3
WHEN Game Starts Repeat Forever Check Once If polinizaciones5 Play Sound Win
🧠 "Check Once If" vs "If": el bloque If normal se evalúa cada fotograma dentro del bucle, lo que haría que el sonido de victoria sonase continuamente mientras la condición sea verdadera. Check Once If sólo dispara su contenido la primera vez que la condición se cumple, aunque el bucle siga corriendo. Perfecto para eventos de "victoria" o "game over".

🎭 Personaje 3: TEXTO (contador visible)

📝 Personaje 3 — "Contador"

Añadir un personaje de tipo Text desde la biblioteca. Colocarlo en la esquina superior izquierda (ej. X:100, Y:700).

// Texto Contador → Bloque único
WHEN Game Starts Repeat Forever Set Text "🌸 " + polinizaciones

✅ Resultado final del Nivel Brote

  • La mariposa sigue el dedo por la pantalla (con suavidad opcional).
  • El contador sube cada vez que toca la flor.
  • El texto en pantalla muestra el valor actualizado en tiempo real.
  • Al llegar a 5, suena el sonido de victoria (una sola vez).
🌳

Solución — Nivel Roble

El Jardín Vivo. Flores que aparecen solas (clones), temporizador regresivo de 30 s y sistema de puntuación completo.

📦 Variables a crear antes de empezar

NombreValor inicialPara qué sirve
puntos0Puntuación acumulada del jugador
tiempo30Segundos que quedan de partida
jugando1Bandera: 1 = partida en curso, 0 = fin
💡 La variable "jugando" es un patrón clásico de diseño de juegos: una bandera booleana (0 o 1) que controla si el resto del código debe ejecutarse. Sin ella, la flor madre seguiría generando clones incluso cuando el tiempo llegue a 0.

🎭 Personaje 1: FLOR MADRE (invisible, generador de clones)

🌸 Personaje 1 — "FlorMadre"

Crear un personaje cualquiera. Colocarlo fuera de la pantalla visible (X: -100, Y: -100). Opcionalmente hacerlo transparente con Set Opacity 0. Su única función es fabricar clones.

Bloque WHEN nº 1 — Motor de generación de clones
// FlorMadre → Bloque 1: generador
WHEN Game Starts Repeat Forever Check Once If jugando = 1 Wait 1.5 seconds Create a Clone at X: Random(80, 950) Y: Random(80, 680)
Bloque WHEN nº 2 — Comportamiento del clon al nacer
// FlorMadre → Bloque 2: el clon recién creado
WHEN Clone Created Set Color Random Color Set Size 10 ← empieza muy pequeño Repeat 18 times Change Size by 8 ← crece hasta 10+(18×8)=154 Wait 0.04 seconds
🧠 El evento "When Clone Created" se ejecuta automáticamente en el clon, no en la FlorMadre. Cada vez que se crea un clon, ese clon ejecuta este bloque de forma independiente. Es decir: si hay 8 clones en pantalla, hay 8 instancias de este código corriendo en paralelo, cada una con su propio estado de tamaño y color.
Bloque WHEN nº 3 — El clon reacciona al toque del jugador
// FlorMadre → Bloque 3: destruir clon y sumar puntos
WHEN Clone is Tapped Change puntos by 10 Play Sound Pop Repeat 5 times Change Size by 15 ← pequeña animación de "explosión" Wait 0.02 seconds Destroy Self ← elimina este clon de la pantalla

🎭 Personaje 2: TEMPORIZADOR (objeto de texto)

⏱️ Personaje 2 — "Tiempo"
// Tiempo → Bloque 1: cuenta regresiva
WHEN Game Starts Set Position X: 850 Y: 720 ← esquina superior derecha Repeat 30 times Wait 1 second Change tiempo by -1 — tras el bucle: fin de partida — Set jugando to 0 ← detiene la generación de clones Set Text "FIN " + puntos + " pts 🏆" Set Position X: 512 Y: 384 ← centrar el mensaje final Set Size 150 Play Sound Win
// Tiempo → Bloque 2: mostrar el tiempo en pantalla en tiempo real
WHEN Game Starts Repeat Forever Set Text "⏱️ " + tiempo
⚠️ ¿Por qué dos bloques en el mismo personaje? El Bloque 1 gestiona la lógica (restar tiempo, detectar el fin). El Bloque 2 gestiona el display (mostrar el texto). Si los metemos en uno solo con un único Repeat 30, el texto sólo se actualizaría cada segundo (al ritmo del Wait). Con el segundo bloque en bucle eterno, el texto se actualiza cada fotograma.

🎭 Personaje 3: PUNTUACIÓN (objeto de texto)

🏆 Personaje 3 — "Puntos"
// Puntos → Bloque único
WHEN Game Starts Set Position X: 100 Y: 720 ← esquina superior izquierda Repeat Forever Set Text "⭐ " + puntos

✅ Resultado final del Nivel Roble

  • FlorMadre genera un clon cada 1.5 s en posición aleatoria.
  • Cada clon crece al aparecer y tiene color aleatorio.
  • Al tocar un clon: +10 puntos, mini-explosión, desaparece.
  • Temporizador visible cuenta de 30 a 0.
  • Al llegar a 0: se detiene la generación, aparece puntuación final.

Solución — Mejoras opcionales

Las tareas de ampliación de los niveles Semilla y Brote, con solución completa bloque a bloque.

🌱 Mejoras del Nivel Semilla

Mejora 1 — Segunda flor idéntica en otro lugar

Simplemente duplicar el personaje Flor (botón de copia en Hopscotch) y cambiar la posición en el bloque When Game Starts → Set Position. Todo el código se copia automáticamente. Colocarla por ejemplo en X:200, Y:200.

Mejora 2 — Flor que encoge al llegar a tamaño máximo
// Flor → añadir dentro del bloque "When Tapped"
WHEN Character is Tapped Change Size by 20 Play Sound Happy Set Color Random Color If Self Size > 280 Set Size 40 ← reinicia al tamaño inicial Set Color Green ← vuelve al color inicial
💡 El If Self Size > 280 comprueba el tamaño después de sumarlo (porque el Change Size by 20 va antes). El tamaño máximo antes del reset es 280: 40 inicial + 14 toques × 20 = 320, pero como la comprobación es >280, se resetea al decimocuarto toque cuando llega a 300. Se puede ajustar el umbral a gusto.
Mejora 3 — Texto "¡Tócame!" que desaparece
// Nuevo objeto Text — "TextoToca"
WHEN Game Starts Set Text "¡Tócame!" Set Position X: 512 Y: 250 Repeat Forever If Flor Size > 120 Set Opacity 0 ← invisible Else Set Opacity 100 ← visible

🌿 Mejoras del Nivel Brote

Mejora 1 — Variable "vidas" que baja con el tiempo

Crear variable vidas con valor inicial 3. Añadir un nuevo bloque en la Mariposa:

// Mariposa → nuevo bloque: temporizador de vida
WHEN Game Starts Repeat Forever Wait 15 seconds If polinizaciones = 0 ← no polinizó en 15s Change vidas by -1 Check Once If vidas0 Set Text "💀 Game Over" ← en el objeto de texto
⚠️ Este mecanismo tiene un problema conceptual que puede dejarse como debate: el Wait 15 espera 15 segundos desde el inicio, pero no "resetea" si el alumno poliza en el segundo 14. Para una solución más rigurosa habría que resetear una variable tiempoSinPolinar a 0 cada vez que haya colisión. Perfecto para alumnos muy avanzados que quieran profundizar.
Mejora 2 — Mariposa que gira hacia donde se mueve
// Mariposa → añadir dentro del Repeat Forever de movimiento
WHEN Game Starts Repeat Forever Set X (Self X) + ((Last Touch X - Self X) / 6) Set Y (Self Y) + ((Last Touch Y - Self Y) / 6) Set Rotation to Angle Angle to Last Touch ← nuevo

Angle to Last Touch es un valor especial del sistema disponible en el menú de rotación. Devuelve el ángulo en grados entre la posición actual del personaje y el último punto tocado.

Solución — Bonus (desafíos experto)

Solución completa de los 6 desafíos bonus. Recuerda: en el enunciado del alumno no aparecen estas instrucciones.

🌈 Bonus 1 — Estela Arcoíris (★★)

// Mariposa → bloque de estela (añadir junto al de movimiento)
WHEN Game Starts Repeat Forever Leave a Trail Color: Self Rotation ← el ángulo de giro como valor de color Width: 8 Set X (Self X) + ((Last Touch X - Self X) / 6) Set Y (Self Y) + ((Last Touch Y - Self Y) / 6) Set Rotation to Angle Angle to Last Touch
🧠 ¿Por qué usar Self Rotation como color? En Hopscotch, el color se especifica como un número de 0 a 360 (rueda de color HSB). El ángulo de rotación también va de 0 a 360. Al usarlo como valor de color, la estela cambia de tono a medida que la mariposa gira al seguir el dedo, creando un efecto arcoíris natural y suave.

🌧️ Bonus 2 — Lluvia de Pétalos (★★★)

// Pétalo (personaje invisible, fuera de pantalla) → Bloque 1: generador
WHEN Game Starts Set Position X: -100 Y: -100 ← fuera de pantalla Repeat Forever Wait 0.3 seconds Create a Clone at X: Random(0, 1024) Y: 800
// Pétalo → Bloque 2: comportamiento del clon
WHEN Clone Created Set Color Random Color Set Size Random(20, 60) ← tamaños variados Repeat Forever Change Y by -4 ← caída Turn 3 degrees Change X by Random(-1, 1) ← oscilación lateral If Self Y < -20 ← salió por abajo Destroy Self
💡 La condición Self Y < -20 detecta que el clon salió por la parte inferior de la pantalla (Y=0 es el borde inferior en Hopscotch). El margen de -20 evita que se destruya justo en el borde visible.

📱 Bonus 3 — Efecto Agitar (★★★)

// FlorMadre → nuevo bloque: sensor de agitación
WHEN iPad is Shaken Change puntos by 50 ← puntos extra por agitar Play Sound Explosion
// FlorMadre → modificar el bloque "When Clone is Tapped" para el agitado
// En el bloque "When Clone Created", añadir un nuevo evento al clon: WHEN Clone Created ... (código existente de crecimiento) ... — Luego, añadir un bloque "When iPad is Shaken" para el clon: — WHEN iPad is Shaken ← segundo bloque del clon Repeat 4 times Change Size by 30 ← infla rápido Wait 0.04 seconds Repeat 6 times Change Size by -30 ← desinfla hasta desaparecer Wait 0.04 seconds Destroy Self
🧠 Punto importante: los eventos como When iPad is Shaken se pueden añadir tanto al personaje madre como a los clones. Si se añade al clon dentro del bloque "When Clone Created", cada clon reaccionará al agitar. Si sólo se añade a la FlorMadre, sólo ella reacciona. Para este bonus queremos que todos los clones exploten, así que hay que añadirlo al clon.

🎵 Bonus 4 — DJ Primaveral (★★★★)

Crear 4 objetos de texto, uno en cada esquina. Cada uno tiene una nota asignada.

// Botón DO (esquina inferior izquierda) — repetir para RE, MI, FA con distintas notas
WHEN Game Starts Set Text "DO" Set Position X: 80 Y: 60 Set Size 80 WHEN Character is Tapped Play Note C4 0.5 beats ← Do central, medio tiempo Set Color Yellow Change Size by 10 Wait 0.1 seconds Change Size by -10 ← efecto rebote visual

Las notas para los 4 botones: C4 (Do), D4 (Re), E4 (Mi), F4 (Fa). En Hopscotch el bloque Play Note acepta la nota en notación americana (C=Do, D=Re, E=Mi, F=Fa, G=Sol, A=La, B=Si) seguida del octavo (4 = octava central).

⏱️ Bonus 5 — Modo Supervivencia (★★★★)

Modificación del temporizador del Nivel Roble. La clave es que el tiempo ya no se resta en un bucle fijo, sino que se decrementa en un bucle continuo y se recarga al tocar flores.

// Tiempo → reemplazar el Bloque 1 por esta versión supervivencia
WHEN Game Starts Set tiempo to 10 ← empieza en 10, no 30 Repeat Forever Wait 1 second Change tiempo by -1 Check Once If tiempo0 Set jugando to 0 Set Text "FIN: " + puntos
// FlorMadre → modificar "When Clone is Tapped" para añadir recarga de tiempo
WHEN Clone is Tapped Change puntos by 10 Change tiempo by 2 ← ¡recarga 2 segundos! Play Sound Pop Destroy Self
Para añadir dificultad progresiva: cada 10 flores tocadas, reducir el intervalo de generación de clones cambiando la variable del Wait en el generador (si se hace con una variable en lugar de un número fijo).

🤖 Bonus 6 — Enemigo con IA (★★★★★)

// Oruga → personaje nuevo, 3 bloques
// Bloque 1: persecución con velocidad creciente WHEN Game Starts Set Position X: 100 Y: 100 Repeat Forever Set X (Self X) + ((Mariposa X - Self X) / velocidad) Set Y (Self Y) + ((Mariposa Y - Self Y) / velocidad) // Bloque 2: velocidad que aumenta con el tiempo WHEN Game Starts Set velocidad to 20 ← empieza muy lenta Repeat 10 times Wait 3 seconds Change velocidad by -2 ← divisor menor = más rápido // Bloque 3: colisión con la mariposa WHEN Oruga bumps Mariposa Change vidas by -1 Play Sound Sad Set Position X: 100 Y: 100 ← la aleja tras el impacto Wait 1 second ← inmunidad temporal
🧠 La "velocidad" como divisor: en la fórmula de interpolación, el divisor controla la velocidad. Un divisor grande (20) hace que la oruga avance sólo 1/20 del camino cada fotograma: muy lenta. Al reducir el divisor a 4 (después de 24 s de juego), avanza 1/4 del camino: mucho más rápida y difícil de esquivar. Crear una variable velocidad con valor inicial 20 y restarle 2 cada 3 segundos (hasta un mínimo de 4) produce esta escalada de dificultad.
⚠️

Errores típicos del alumnado

Los 10 problemas más frecuentes en el aula, con diagnóstico y solución rápida para el docente.

Error 1 — "La flor no empieza pequeña"

Diagnóstico: el Set Size 40 está dentro del bloque "When Tapped" en lugar de "When Game Starts".
Por qué ocurre: el alumno añadió el bloque Set Size mientras tenía abierto el bloque de "When Tapped".
Solución: mover el bloque Set Size al bloque "When Game Starts". Arrastrar el bloque fuera y soltarlo en el evento correcto.

Error 2 — "El contador sube demasiado rápido cuando la mariposa toca la flor"

Diagnóstico: el evento "bumps" se dispara en cada fotograma (~30/s) mientras los sprites se solapan.
Por qué ocurre: comportamiento normal de Hopscotch; el alumno pensaba que "bumps" = "primer contacto".
Solución: añadir Wait 0.5 seconds dentro del bloque "When bumps Flor", justo después del Change polinizaciones by 1.

Error 3 — "La mariposa no sigue mi dedo, se queda quieta"

Diagnóstico: falta el Repeat Forever. El Set Position se ejecuta una vez y termina.
Solución: envolver el bloque Set Position dentro de un Repeat Forever.

Error 4 — "Las flores aparecen todas en el mismo sitio"

Diagnóstico: el alumno usó coordenadas fijas en Create a Clone at X: 200 Y: 300 en lugar de Random().
Solución: cambiar los valores a Random(80, 950) para X y Random(80, 680) para Y.

Error 5 — "El temporizador funciona pero el juego no se para"

Diagnóstico: el alumno cambió la variable tiempo a 0 pero olvidó cambiar jugando a 0. La FlorMadre sigue generando clones.
Solución: añadir Set jugando to 0 en el código de fin de partida del temporizador.

Error 6 — "Destroy Self elimina la FlorMadre, no el clon"

Diagnóstico: el alumno puso Destroy Self en el bloque "When Game Starts" de la FlorMadre en lugar de en el bloque "When Clone is Tapped".
Solución: mover el Destroy Self al bloque correcto. Recordar: Destroy Self dentro de "When Clone Created" o "When Clone is Tapped" afecta al clon. En el bloque madre, eliminaría la madre.

Error 7 — "El mensaje de victoria aparece continuamente parpadeando"

Diagnóstico: se usó If normal en lugar de Check Once If. El bloque se evalúa cada fotograma y dispara el sonido/texto 30 veces por segundo.
Solución: cambiar el bloque If por Check Once If.

Error 8 — "No encuentro el bloque Last Touch X"

Diagnóstico: el alumno busca "Last Touch X" en el buscador de bloques pero no lo encuentra como bloque independiente.
Solución: Last Touch X no es un bloque por sí solo, sino un valor especial que aparece como opción en el desplegable de los campos X/Y de los bloques de posición (Set X, Set Position). Hay que arrastrar primero el bloque Set X y luego tocar el campo de valor para ver las opciones.

Error 9 — "El clon no crece, aparece y desaparece inmediatamente"

Diagnóstico: el alumno puso el Destroy Self dentro del bloque "When Clone Created" en lugar de en "When Clone is Tapped".
Solución: verificar en qué bloque está el Destroy Self. El clon debe vivir hasta que el jugador lo toque, así que el Destroy Self sólo puede estar en "When Clone is Tapped".

Error 10 — "La app va muy lenta cuando hay muchos clones"

Diagnóstico: el intervalo de generación de clones es demasiado pequeño (p.ej. Wait 0.1 s) o los clones no se destruyen cuando salen de pantalla.
Por qué ocurre: cada clon activo consume recursos de procesamiento. Con 50+ clones simultáneos, incluso un iPad potente se ralentiza.
Solución: (1) Aumentar el intervalo de Wait a mínimo 1 segundo. (2) Añadir en cada clon una condición de auto-destrucción: Repeat Forever → If Self Size > 200 → Destroy Self (para que los clones que nadie toca desaparezcan solos al hacerse demasiado grandes).
🏫 Consejo para la gestión del aula: los errores 1, 3, 5 y 7 son los más frecuentes y suelen resolverse en menos de 2 minutos con una inspección rápida del código del alumno. Enseñarles a leer su propio código en voz alta, bloque a bloque, es la estrategia más efectiva para que lo detecten solos antes de pedir ayuda.