Pixel-Wall-E es una aplicación interactiva desarrollada en C# como proyecto académico para la materia de Ciencias de la Computación.
¡Ayuda a Wall-E, el simpático robot, a crear arte pixelado (pixel-art) siguiendo comandos de un lenguaje de programación personalizado! Los comandos permiten controlar a Wall-E para pintar píxeles sobre un canvas cuadrado, ejecutando instrucciones de dibujo y lógica.
📝 La aplicación cuenta con un editor de texto donde puedes escribir código en el lenguaje de Wall-E y ejecutar los comandos para ver el resultado visualmente en el canvas.
📂 Puedes importar archivos con extensión .pw o exportar el código actual del editor a un archivo para compartir tus creaciones.
-
Descarga y ejecuta
- ⬇️ Clona este repositorio.
- 📦 Descomprime el archivo
.zipque contiene el ejecutable (PixelWallE.exe). - 🖱️ ¡Haz doble clic en
PixelWallE.exey comienza a crear tu arte!
-
Interfaz de usuario
▶️ Run: Para compilar el código y que Wall-E pinte en el canvas según tus instrucciones, escribe el código en el editor y presiona el botón Run.- 💾 Save: Para guardar tus códigos y creaciones, utiliza el botón Save. Esto exportará tu código a un archivo
.pw. - 📂 Load: Para cargar archivos existentes en formato
.pw, utiliza el botón Load y selecciona tu archivo. - 🧹 Reset: Para limpiar y reiniciar el canvas, presiona el botón Reset.
- ⬇️ Download: Para guardar la imagen generada en el canvas como un archivo de imagen, haz clic en este botón.
- 📏 Dimensión del canvas: Puedes cambiar la dimensión del canvas desde 1 hasta 256 para adaptar el espacio de dibujo.
El lenguaje consiste en instrucciones, asignaciones, funciones, etiquetas y saltos condicionales.
Cada instrucción o comando debe ir en una línea separada. Aquí tienes un resumen:
-
🟢 Spawn(int x, int y)
Inicializa a Wall-E en la posición(x, y)del canvas.
Obligatorio como primer comando y solo puede aparecer una vez.Ejemplos:
Spawn(0, 0)→ 🟩 Esquina superior izquierda.Spawn(50, 50)→ 🔲 Centro de un canvas 100x100.Spawn(255, 0)→ 🟥 Esquina superior derecha en un canvas 256x256.
-
🎨 Color(string color)
Cambia el color del pincel.
Colores soportados:
"Red","Blue","Green","Yellow","Orange","Purple","Black","White","Transparent"- Por defecto:
"Transparent"(no pinta). "White"funciona como borrador.- El canvas inicia blanco.
- Por defecto:
-
🖌️ Size(int k)
Cambia el grosor del pincel (en píxeles).
Debe ser impar; si es par, se reduce al impar anterior. Por defecto es 1. -
➖ DrawLine(int dirX, int dirY, int distance)
Dibuja una línea desde la posición actual en la dirección(dirX, dirY)y avanzadistancepíxeles.
Wall-E termina en el último píxel dibujado.Direcciones posibles:
↖️ (-1,-1)| ⬅️(-1,0)|↙️ (-1,1)| ⬇️(0,1)↘️ (1,1)| ➡️(1,0)|↗️ (1,-1)| ⬆️(0,-1)
-
🟠 DrawCircle(int dirX, int dirY, int radius)
Dibuja una circunferencia de radioradiusen la dirección dada.
Wall-E se posiciona en el centro al finalizar. -
🟦 DrawRectangle(int dirX, int dirY, int distance, int width, int height)
Dibuja un rectángulo centrado en la posición a la que Wall-E llega tras moversedistanceen la dirección(dirX, dirY). -
🪣 Fill()
Rellena con el color actual todos los píxeles adyacentes del mismo color que el píxel actual (similar a la "cubeta" en programas de dibujo).
Permite asignar valores numéricos o booleanos a variables:
nombre_variable <- Expresión
- Variables pueden contener letras, números y espacios, pero no iniciar con número ni espacio.
- Las expresiones pueden ser aritméticas o booleanas.
-
➕ Aritméticas:
Números enteros, variables numéricas, operaciones:+,-,*,/,**,%
Ejemplo:k <- 3 + 3 * 10 -
🔃 Booleanas:
Operadores:&&(and),||(or), comparaciones:==,>=,<=,>,<
Ejemplo:flag <- (n > 0) && (k == 2)
GetActualX()/GetActualY()→ Posición actual de Wall-E.GetCanvasSize()→ Tamaño del canvas.GetColorCount(color, x1, y1, x2, y2)→ Cuenta píxeles de un color en una región.IsBrushColor(color)→ Devuelve 1 si el color de la brocha coincide.IsBrushSize(size)→ Devuelve 1 si el tamaño de la brocha coincide.IsCanvasColor(color, vertical, horizontal)→ Devuelve 1 si el píxel relativo a Wall-E es del color dado.
Las etiquetas marcan posiciones en el código y los saltos condicionales permiten ciclos y bifurcaciones:
- 🏷️ Etiqueta:
nombre_etiqueta - 🔁 Salto condicional:
GoTo [nombre_etiqueta] (condición)
Si la condición es verdadera, la ejecución salta a la etiqueta. Si la etiqueta no existe, es error de compilación.
Spawn(0, 0)
Color(Black)
n <- 5
k <- 3 + 3 * 10
n <- k * 2
actual_x <- GetActualX()
i <- 0
loop1
DrawLine(1, 0, 1)
i <- i + 1
is_brush_color_blue <- IsBrushColor("Blue")
GoTo [loop_ends_here] (is_brush_color_blue == 1)
GoTo [loop1] (i < 10)
Color("Blue")
GoTo [loop1] (1 == 1)
loop_ends_here
Explicación:
1️⃣ Wall-E inicia en la esquina superior izquierda.
2️⃣ El pincel es negro.
3️⃣ Se hacen asignaciones y operaciones aritméticas.
4️⃣ Se declara una etiqueta para un ciclo (loop1).
5️⃣ Se dibuja a la derecha y se incrementa un contador.
6️⃣ Se verifica si la brocha es azul; si es así, se termina el ciclo, si no, continúa.
7️⃣ Cuando termina el ciclo, se cambia el color a azul y se repite el ciclo.
8️⃣ Cuando la brocha es azul, se salta a la etiqueta loop_ends_here y termina.
El compilador de Pixel-Wall-E sigue las siguientes fases:
- 🧩 Lexer: Tokeniza el código fuente.
- 🏗️ Parser: Analiza la estructura de los comandos.
- 🖼️ Evaluador: Interpreta y ejecuta las instrucciones sobre el canvas.
- 🛑 Gestión de errores: Si alguna fase detecta errores, se muestran y la ejecución se detiene.
El código fuente principal del compilador está en el archivo
Godot/Scripts/Main.cs, acompañado por las clases auxiliares Lexer, Parser y Evaluate.
Proyecto realizado por Lianet Tamarit Tejas
👩💻 tamarit06
para la asignatura de Ciencias de la Computación.