💾 Memoria del Programa
Permiten que tu programa “recuerde” información importante como puntuaciones, vidas, o configuraciones.
Las variables son como cajas mágicas que pueden guardar información en tus proyectos de Scratch. Son fundamentales para crear juegos interactivos, llevar puntuaciones, recordar preferencias del usuario y mucho más. En esta guía aprenderás todo sobre variables, listas y cómo manejar datos de manera efectiva.
Una variable es un contenedor que puede almacenar diferentes tipos de información: números, texto, o valores verdadero/falso. Piensa en las variables como etiquetas que puedes pegar en cajas para recordar qué hay dentro.
💾 Memoria del Programa
Permiten que tu programa “recuerde” información importante como puntuaciones, vidas, o configuraciones.
🔄 Cambios Dinámicos
Hacen que tu programa sea interactivo al cambiar comportamientos basados en la información almacenada.
🎮 Mecánicas de Juego
Esenciales para sistemas de puntuación, niveles, inventarios, y progreso del jugador.
🧮 Cálculos Complejos
Permiten realizar operaciones matemáticas y lógicas sofisticadas.
📈 Seguimiento de Estado
Mantienen registro del estado actual del juego, personajes, o elementos.
🔗 Comunicación
Facilitan el intercambio de información entre diferentes sprites y scripts.
Variables como Contenedores:
Accede a la Categoría Variables
Crear Nueva Variable
Configurar la Variable
Confirmar Creación
Para todos los objetos
Características:
Cuándo Usar:
Ejemplo:
// Cualquier sprite puede modificar y leer estas variablesfijar [puntos] a (0) // Puntuación globalfijar [nivel] a (1) // Nivel actualfijar [tiempo-restante] a (60) // Tiempo del juego
Solo para este objeto
Características:
Cuándo Usar:
Ejemplo:
// Cada enemigo tiene sus propias variablesfijar [mi-vida] a (3) // Vida individualfijar [mi-velocidad] a (2) // Velocidad propiafijar [mi-estado] a [patrullando] // Estado personal
1. Asignar Valor (Fijar):
// Establecer un valor específicofijar [puntos] a (0) // Inicializar en cerofijar [nombre-jugador] a [Ana] // Asignar textofijar [juego-activo] a [verdadero] // Asignar estadofijar [velocidad] a (número al azar entre (3) y (7)) // Valor aleatorio
2. Modificar Valor (Cambiar):
// Aumentar o disminuir el valor actualcambiar [puntos] por (10) // Sumar 10 puntoscambiar [vidas] por (-1) // Restar 1 vidacambiar [velocidad] por (0.5) // Aumentar velocidadcambiar [temperatura] por (número al azar entre (-2) y (2)) // Cambio aleatorio
3. Mostrar y Ocultar:
// Controlar visibilidad en el escenariomostrar variable [puntos] // Hacer visibleesconder variable [codigo-secreto] // Ocultar información
4. Leer Valor:
// Usar el valor de la variabledecir (puntos) // Mostrar valorir a x: (posicion-x) y: (posicion-y) // Usar en coordenadassi <(vidas) > (0)> entonces // Usar en condiciones // continuar juegofin
Configuración Inicial:
// Al iniciar el juegoal presionar ⚑fijar [puntos] a (0)fijar [puntos-maximos] a (0)mostrar variable [puntos]
Ganar Puntos:
// Cuando el jugador recoge un objetoal tocar [Moneda]cambiar [puntos] por (10)tocar sonido [ding]
// Bonus por velocidadsi <(temporizador) < (tiempo-limite)> entonces cambiar [puntos] por (5) // Bonus por rapidezfin
// Actualizar récordsi <(puntos) > (puntos-maximos)> entonces fijar [puntos-maximos] a (puntos)fin
Sistema de Multiplicadores:
// Multiplicador de puntosfijar [multiplicador] a (1)
// Aumentar multiplicador con combossi <(combo-actual) > (5)> entonces fijar [multiplicador] a (2)si no si <(combo-actual) > (10)> entonces fijar [multiplicador] a (3) finfin
// Aplicar multiplicadorcambiar [puntos] por ((puntos-base) * (multiplicador))
Gestión de Vidas:
// Inicializaciónal presionar ⚑fijar [vidas] a (3)fijar [salud-maxima] a (100)fijar [salud-actual] a (salud-maxima)
Recibir Daño:
// Cuando el jugador es dañadoal recibir [jugador-dañado]cambiar [salud-actual] por (-20)
// Verificar si la salud llegó a cerosi <(salud-actual) < (1)> entonces cambiar [vidas] por (-1)
si <(vidas) > (0)> entonces // Reiniciar salud fijar [salud-actual] a (salud-maxima) enviar [respawn-jugador] si no // Game Over enviar [game-over] finfin
Regeneración de Salud:
// Regeneración gradualpor siempre si <<(salud-actual) < (salud-maxima)> y <(regeneracion-activa) = [verdadero]>> entonces esperar (2) segundos cambiar [salud-actual] por (5)
// No exceder el máximo si <(salud-actual) > (salud-maxima)> entonces fijar [salud-actual] a (salud-maxima) fin finfin
Atributos del Personaje:
// Estadísticas del jugadorfijar [velocidad-base] a (5)fijar [fuerza] a (10)fijar [defensa] a (8)fijar [experiencia] a (0)fijar [nivel] a (1)
Sistema de Experiencia y Niveles:
// Ganar experienciaal recibir [enemigo-derrotado]cambiar [experiencia] por (25)
// Verificar subida de nivelfijar [exp-necesaria] a ((nivel) * (100))si <(experiencia) > (exp-necesaria)> entonces cambiar [nivel] por (1) cambiar [experiencia] por (0 - (exp-necesaria))
// Mejorar estadísticas cambiar [velocidad-base] por (1) cambiar [fuerza] por (2) cambiar [defensa] por (1)
decir (unir [¡Nivel ] (unir (nivel) [!])) por (3) segundos tocar sonido [level-up]fin
Modificadores Temporales:
// Power-up de velocidadal recibir [powerup-velocidad]fijar [velocidad-actual] a ((velocidad-base) * (2))fijar [tiempo-powerup] a (10)
// Countdown del power-uppor siempre si <(tiempo-powerup) > (0)> entonces cambiar [tiempo-powerup] por (-0.1) esperar (0.1) segundos si no fijar [velocidad-actual] a (velocidad-base) finfin
Entrada de Datos:
// Obtener información del jugadorpreguntar [¿Cuál es tu nombre?] y esperarfijar [nombre-jugador] a (respuesta)
preguntar [¿Qué dificultad quieres? (1-3)] y esperarfijar [dificultad] a (respuesta)
// Validar entradasi <<(dificultad) < (1)> o <(dificultad) > (3)>> entonces fijar [dificultad] a (2) // Dificultad por defectofin
decir (unir [¡Hola ] (unir (nombre-jugador) [! Empecemos...])) por (3) segundos
Personalización:
// Configuraciones del jugadorpreguntar [¿Qué color prefieres? (rojo/azul/verde)] y esperarfijar [color-preferido] a (respuesta)
si <(color-preferido) = [rojo]> entonces fijar efecto [color] a (0)si no si <(color-preferido) = [azul]> entonces fijar efecto [color] a (200) si no si <(color-preferido) = [verde]> entonces fijar efecto [color] a (100) fin finfin
Dificultad Adaptativa:
// Ajustar dificultad según rendimientopor siempre si <(puntos) > ((nivel-dificultad) * (500))> entonces cambiar [nivel-dificultad] por (1) cambiar [velocidad-enemigos] por (0.5) cambiar [frecuencia-spawn] por (-0.2)
decir [¡Dificultad aumentada!] por (2) segundos fin
esperar (5) segundos // Verificar cada 5 segundosfin
Comportamiento Basado en Estado:
// Estados del juegofijar [estado-juego] a [menu]
por siempre si <(estado-juego) = [menu]> entonces // Lógica del menú si <tecla [espacio] presionada?> entonces fijar [estado-juego] a [jugando] fin
si no si <(estado-juego) = [jugando]> entonces // Lógica del juego si <(vidas) < (1)> entonces fijar [estado-juego] a [game-over] fin
si no si <(estado-juego) = [game-over]> entonces // Lógica de game over si <tecla [r] presionada?> entonces fijar [estado-juego] a [menu] // Reiniciar variables fijar [puntos] a (0) fijar [vidas] a (3) fin fin fin finfin
Las listas son variables especiales que pueden almacenar múltiples valores en orden. Son como estantes con múltiples compartimentos numerados.
Crear una Lista:
Operaciones Básicas con Listas:
// Agregar al final de la listaañadir [espada] a [inventario]añadir [100] a [puntuaciones-altas]añadir (nombre-jugador) a [jugadores]
// Insertar en posición específicainsertar [poción] en (1) de [inventario] // Al principioinsertar [boss] en (longitud de [enemigos]) de [enemigos] // Al final
// Obtener elemento por posiciónfijar [item-actual] a (elemento (1) de [inventario]) // Primer elementofijar [ultimo-item] a (elemento (longitud de [inventario]) de [inventario]) // Último
// Usar en condicionessi <(elemento (1) de [inventario]) = [llave]> entonces decir [¡Tienes la llave!]fin
// Mostrar elementodecir (elemento (número al azar entre (1) y (longitud de [frases])) de [frases])
// Reemplazar elementoreemplazar elemento (2) de [inventario] por [escudo-mejorado]
// Eliminar elementoborrar (1) de [inventario] // Eliminar primeroborrar (longitud de [inventario]) de [inventario] // Eliminar último
// Eliminar todosborrar todo de [inventario]
// Obtener longitudfijar [total-items] a (longitud de [inventario])
// Verificar si contiene elementosi <[inventario] contiene [llave]> entonces decir [¡Tienes la llave!]fin
// Encontrar posición de elementofijar [posicion-llave] a (# de [llave] en [inventario])
1. Sistema de Inventario:
// Inicializar inventarioal presionar ⚑borrar todo de [inventario]añadir [espada-básica] a [inventario]añadir [poción-salud] a [inventario]
// Recoger objetoal tocar [Objeto]si <(longitud de [inventario]) < (capacidad-maxima)> entonces añadir (nombre-objeto) a [inventario] decir (unir [Recogiste: ] (nombre-objeto)) por (2) segundossi no decir [¡Inventario lleno!] por (2) segundosfin
// Usar objetoal presionar tecla [i]si <(longitud de [inventario]) > (0)> entonces fijar [objeto-usado] a (elemento (1) de [inventario]) borrar (1) de [inventario]
si <(objeto-usado) = [poción-salud]> entonces cambiar [salud] por (50) decir [¡Salud restaurada!] por (2) segundos finfin
2. Tabla de Puntuaciones Altas:
// Agregar nueva puntuaciónal recibir [game-over]// Insertar puntuación en ordenfijar [posicion] a (1)repetir hasta que <<(posicion) > (longitud de [puntuaciones-altas])> o <(puntos) > (elemento (posicion) de [puntuaciones-altas])>> cambiar [posicion] por (1)fin
insertar (puntos) en (posicion) de [puntuaciones-altas]insertar (nombre-jugador) en (posicion) de [nombres-jugadores]
// Mantener solo top 10si <(longitud de [puntuaciones-altas]) > (10)> entonces borrar (11) de [puntuaciones-altas] borrar (11) de [nombres-jugadores]fin
3. Generación de Contenido Aleatorio:
// Listas de contenidoborrar todo de [nombres-enemigos]añadir [Goblin] a [nombres-enemigos]añadir [Orc] a [nombres-enemigos]añadir [Troll] a [nombres-enemigos]añadir [Dragón] a [nombres-enemigos]
borrar todo de [frases-npc]añadir [¡Hola, aventurero!] a [frases-npc]añadir [¿Necesitas ayuda?] a [frases-npc]añadir [Ten cuidado ahí fuera.] a [frases-npc]
// Usar contenido aleatoriofijar [enemigo-aleatorio] a (elemento (número al azar entre (1) y (longitud de [nombres-enemigos])) de [nombres-enemigos])fijar [frase-aleatoria] a (elemento (número al azar entre (1) y (longitud de [frases-npc])) de [frases-npc])
4. Sistema de Diálogos:
// Configurar diálogoborrar todo de [dialogo-actual]añadir [Hola, soy el guardián de este lugar.] a [dialogo-actual]añadir [He estado esperando a alguien como tú.] a [dialogo-actual]añadir [¿Estás listo para la aventura?] a [dialogo-actual]
// Mostrar diálogofijar [linea-actual] a (1)repetir (longitud de [dialogo-actual]) veces decir (elemento (linea-actual) de [dialogo-actual]) por (3) segundos cambiar [linea-actual] por (1)fin
Sistema de Mensajería:
// Sprite A: Envía informaciónfijar [mensaje-para-b] a [ataque-especial]fijar [datos-mensaje] a (poder-ataque)enviar [mensaje-enviado]
// Sprite B: Recibe y procesaal recibir [mensaje-enviado]si <(mensaje-para-b) = [ataque-especial]> entonces cambiar [mi-salud] por (0 - (datos-mensaje)) decir [¡Auch!] por (1) segundosfinfijar [mensaje-para-b] a [] // Limpiar mensaje
Estado Compartido:
// Variables globales para coordinar spritesfijar [fase-juego] a [preparacion]fijar [enemigos-restantes] a (10)fijar [boss-activo] a [falso]
// Sprite Enemigo: Actualiza estadoal recibir [enemigo-derrotado]cambiar [enemigos-restantes] por (-1)si <(enemigos-restantes) < (1)> entonces fijar [boss-activo] a [verdadero] enviar [spawn-boss]fin
// Sprite Boss: Responde al estadoal recibir [spawn-boss]si <(boss-activo) = [verdadero]> entonces ir a x: (0) y: (100) mostrar fijar [boss-salud] a (200)fin
Evitar Cálculos Repetitivos:
// MALO: Calcular cada vezpor siempre ir a x: ((sen de (temporizador * 90)) * 100) y: ((cos de (temporizador * 90)) * 100)fin
// BUENO: Calcular una vez, usar múltiples vecespor siempre fijar [angulo] a (temporizador * 90) fijar [x-calculada] a ((sen de (angulo)) * 100) fijar [y-calculada] a ((cos de (angulo)) * 100) ir a x: (x-calculada) y: (y-calculada)fin
Cache de Valores Costosos:
// Calcular solo cuando sea necesariofijar [distancia-calculada] a (-1) // Valor inválidofijar [ultima-posicion-x] a (posición x)fijar [ultima-posicion-y] a (posición y)
// Función para obtener distanciasi <<no <(posición x) = (ultima-posicion-x)>> o <no <(posición y) = (ultima-posicion-y)>>> entonces // Recalcular solo si la posición cambió fijar [distancia-calculada] a (([((posición x) - (objetivo-x)) * ((posición x) - (objetivo-x))] + [((posición y) - (objetivo-y)) * ((posición y) - (objetivo-y))]) ^ (0.5)) fijar [ultima-posicion-x] a (posición x) fijar [ultima-posicion-y] a (posición y)fin
// Usar valor cacheadosi <(distancia-calculada) < (50)> entonces // hacer algofin
Patrón de Estado:
// Estados del personajefijar [estado-jugador] a [idle]
por siempre si <(estado-jugador) = [idle]> entonces cambiar a disfraz [parado] si <tecla [flecha derecha] presionada?> entonces fijar [estado-jugador] a [caminando] fin si <tecla [espacio] presionada?> entonces fijar [estado-jugador] a [saltando] fin
si no si <(estado-jugador) = [caminando]> entonces cambiar a disfraz [caminando] cambiar x por (velocidad) si <no <tecla [flecha derecha] presionada?>> entonces fijar [estado-jugador] a [idle] fin
si no si <(estado-jugador) = [saltando]> entonces cambiar a disfraz [saltando] cambiar y por (velocidad-salto) cambiar [velocidad-salto] por (-1) // Gravedad si <tocando color [#00FF00]?> entonces // Suelo fijar [estado-jugador] a [idle] fijar [velocidad-salto] a (15) fin fin fin finfin
Patrón de Configuración:
// Configuraciones centralizadasfijar [config-velocidad-jugador] a (5)fijar [config-salud-maxima] a (100)fijar [config-dificultad] a (2)fijar [config-volumen-musica] a (80)fijar [config-efectos-visuales] a [verdadero]
// Aplicar configuracionesfijar [velocidad] a (config-velocidad-jugador)fijar [salud-maxima] a (config-salud-maxima)fijar [salud-actual] a (salud-maxima)fijar volumen a (config-volumen-musica) %
si <(config-efectos-visuales) = [verdadero]> entonces mostrar variable [puntos] mostrar variable [vidas]si no esconder variable [puntos] esconder variable [vidas]fin
Problema: La variable no cambia su valor
Causas Posibles:
Soluciones:
// Verificar que el script se ejecutadecir [Script ejecutándose] por (1) segundos
// Verificar valor actualdecir (unir [Valor actual: ] (mi-variable)) por (2) segundos
// Usar variable global si necesitas compartir// Crear como "Para todos los objetos"
// Simplificar condiciones para testingsi <verdadero> entonces // Siempre se ejecuta cambiar [mi-variable] por (1)fin
Problema: Las variables vuelven a valores anteriores
Causas Posibles:
Soluciones:
// Inicializar solo una veznal presionar ⚑si <(inicializado) = []> entonces // Solo si no está inicializado fijar [puntos] a (0) fijar [vidas] a (3) fijar [inicializado] a [verdadero]fin
// Usar bandera de controlfijar [permitir-reinicio] a [falso]
// Solo reiniciar cuando sea apropiadosi <(permitir-reinicio) = [verdadero]> entonces fijar [puntos] a (0) fijar [permitir-reinicio] a [falso]fin
Problema: Errores al trabajar con listas
Causas Posibles:
Soluciones:
// Verificar que la lista no esté vacíasi <(longitud de [mi-lista]) > (0)> entonces fijar [elemento] a (elemento (1) de [mi-lista])si no decir [¡Lista vacía!] por (2) segundosfin
// Verificar índice válidofijar [indice] a (número al azar entre (1) y (10))si <(indice) < ((longitud de [mi-lista]) + 1)> entonces fijar [elemento] a (elemento (indice) de [mi-lista])fin
// Usar índices segurosfijar [indice-seguro] a (((indice - 1) mod (longitud de [mi-lista])) + 1)
Problema: El programa se vuelve lento con muchas variables
Causas Posibles:
Soluciones:
// Ocultar variables no esencialesesconder variable [variable-debug]esconder variable [calculo-temporal]
// Limitar tamaño de listassi <(longitud de [historial]) > (100)> entonces borrar (1) de [historial] // Eliminar el más antiguofin
// Calcular solo cuando sea necesariosi <(frame-actual mod 10) = (0)> entonces // Cada 10 frames // cálculo costosofin
// Usar variables locales cuando sea posible// Son más rápidas que las globales
Técnicas de Depuración:
// 1. Mostrar valores en tiempo realdecir (unir [Puntos: ] (unir (puntos) (unir [ Vidas: ] (vidas)))) por (0.1) segundos
// 2. Log de cambiossi <no <(puntos) = (puntos-anterior)>> entonces decir (unir [Puntos cambiaron de ] (unir (puntos-anterior) (unir [ a ] (puntos)))) por (2) segundos fijar [puntos-anterior] a (puntos)fin
// 3. Verificar rangossi <<(velocidad) < (0)> o <(velocidad) > (20)>> entonces decir [¡Velocidad fuera de rango!] por (2) segundos fijar [velocidad] a (5) // Valor segurofin
// 4. Historial de valoresañadir (unir (temporizador) (unir [: ] (puntos))) a [historial-puntos]si <(longitud de [historial-puntos]) > (50)> entonces borrar (1) de [historial-puntos]fin
Nombres Descriptivos:
// MALO: Nombres confusosfijar [x] a (10)fijar [temp] a (5)fijar [var1] a [activo]
// BUENO: Nombres clarosfijar [velocidad-jugador] a (10)fijar [tiempo-powerup] a (5)fijar [estado-juego] a [activo]
Convenciones de Nombres:
puntos-maximos
salud-jugador
vs salud-enemigo
tiempo-segundos
config-volumen
, config-dificultad
Agrupación Lógica:
// Variables del jugadorfijar [jugador-x] a (0)fijar [jugador-y] a (0)fijar [jugador-salud] a (100)fijar [jugador-velocidad] a (5)
// Variables del juegofijar [juego-puntos] a (0)fijar [juego-nivel] a (1)fijar [juego-tiempo] a (60)fijar [juego-estado] a [menu]
// Variables de configuraciónfijar [config-dificultad] a (2)fijar [config-volumen] a (80)fijar [config-efectos] a [verdadero]
Inicialización Centralizada:
// Crear un script de inicializaciónal presionar ⚑// Llamar función de inicializacióninicializar-variables
// Definir función personalizadadefinir inicializar-variables// Jugadorfijar [jugador-salud] a (100)fijar [jugador-velocidad] a (5)fijar [jugador-puntos] a (0)
// Juegofijar [nivel-actual] a (1)fijar [enemigos-restantes] a (10)fijar [tiempo-restante] a (60)
// UImostrar variable [jugador-puntos]mostrar variable [jugador-salud]esconder variable [debug-info]
Verificar Rangos:
// Asegurar que los valores estén en rangos válidossi <(salud) > (salud-maxima)> entonces fijar [salud] a (salud-maxima)fin
si <(salud) < (0)> entonces fijar [salud] a (0)fin
// Función de validacióndefinir validar-saludsi <(salud) > (salud-maxima)> entonces fijar [salud] a (salud-maxima)finsi <(salud) < (0)> entonces fijar [salud] a (0)fin
Valores por Defecto:
// Asegurar valores válidossi <(velocidad) = []> entonces // Si está vacía fijar [velocidad] a (5) // Valor por defectofin
si <(dificultad) = []> entonces fijar [dificultad] a (2) // Dificultad mediafin
¡Felicitaciones! Ahora dominas el uso de variables y datos en Scratch. Has aprendido:
✅ Qué son las variables y por qué son importantes
✅ Cómo crear y usar variables globales y locales
✅ Operaciones básicas con variables
✅ Aplicaciones prácticas en juegos y proyectos
✅ Trabajo con listas para datos complejos
✅ Técnicas avanzadas de optimización
✅ Resolución de problemas comunes
✅ Mejores prácticas para código limpio
¿Listo para explorar más conceptos avanzados de Scratch? ¡Tu viaje de programación continúa! 🚀