Haz videojuegos en español

Lince es un lenguaje para hacer videojuegos. Ventana, dibujo, sprites, teclado, ratón, mando y sonido incluidos; C puro sin dependencias para compilarlo; mensajes de error claros y ejecutables autónomos.

↓  Instalar Tu primer juego Ver en GitHub
versión 0.10 tests 31/31 licencia MIT C puro, sin deps Linux · Windows

Todo lo que necesitas, en español

Una ventana y un bucle de juego en diez líneas; y debajo, un lenguaje completo: clases, herencia, interfaces, generadores, closures y manejo de errores.

sprites.lince
importar "juego"

juego.abrir("Sprites", 640, 480)

# Un sprite dibujado con texto: cada letra es un color
sea lince = juego.sprite([
    "n....n",
    "nnnnnn",
    "nbnnbn",
    "nnnnnn"
], {"n": "#e8892b", "b": "#ffffff"})

sea fondo = juego.imagen("fondo.png")    # PNG, JPG o BMP
sea salto = juego.sonido("salto.wav")
juego.musica("tema.ogg")                   # en bucle, leída poco a poco

sea x = 320
mientras juego.abierto() {
    x = x + juego.eje("izq_x") * 200 * juego.dt()   # mando
    si juego.tecla_pulsada("espacio") { juego.reproducir(salto) }

    juego.dibujar(fondo, 0, 0)
    juego.dibujar(lince, x, 300, {"escala": 6, "espejo": x < 320})
    juego.presentar()
}
hola.lince
# Variables y tipos
sea  nombre = "Ana"
fijo PI     = 3.14159
sea lista notas = [9, 7, 10]

# Función con valor por defecto
funcion saludar(val texto nombre, val texto saludo = "Hola"): texto {
    devolver saludo + ", " + nombre
}

escribir(saludar("Mundo"))           # Hola, Mundo
escribir(saludar("Lince", "Bienvenido")) # Bienvenido, Lince

# Bucles
para cada numero n en rango(5) {
    escribir(n)
}

# Closures
funcion multiplicador(val numero factor): funcion {
    devolver funcion(val numero x): numero { devolver x * factor }
}
sea doble = multiplicador(2)
escribir(doble(5))   # 10
formas.lince
interfaz Forma {
    funcion area(): numero
    funcion describir(): texto
}

clase Rectangulo implementa Forma {
    funcion crear(val numero ancho, val numero alto): nulo {
        mi.ancho = ancho
        mi.alto  = alto
    }
    funcion area(): numero  { devolver mi.ancho * mi.alto }
    funcion describir(): texto {
        devolver "Rectángulo " + mi.ancho + "x" + mi.alto
    }
}

clase Cuadrado extiende Rectangulo {
    funcion crear(val numero lado): nulo {
        padre(lado, lado)   # llama al constructor del padre
    }
}

sea c = Cuadrado(5)
escribir(c.area())        # 25
escribir(c.describir())   # Rectángulo 5x5
generadores.lince
# Generadores — secuencias perezosas
generador pares(val numero hasta): numero {
    para cada numero n en rango(hasta) {
        si n % 2 == 0 { producir n }
    }
}

para cada numero n en pares(10) {
    escribir(n)   # 0, 2, 4, 6, 8
}

# Fibonacci infinito (evaluación perezosa)
generador fibonacci(): numero {
    sea a = 0
    sea b = 1
    mientras verdadero {
        producir a
        sea tmp = a + b
        a = b
        b = tmp
    }
}

sea gen = fibonacci()
para cada numero _ en rango(8) {
    escribir(gen.siguiente())   # 0 1 1 2 3 5 8 13
}
errores.lince
# Manejo de errores estructurado
intentar {
    sea datos = json.parsear(archivos.leer("config.json"))
    escribir(datos["version"])
} capturar (ErrorRango e) {
    escribir("Clave no encontrada: " + e.mensaje)
} capturar (ErrorIO e) {
    escribir("No se pudo leer el archivo: " + e.mensaje)
} capturar (error e) {
    escribir("Error inesperado: " + e.mensaje)
} finalmente {
    escribir("Fin del proceso")
}

# Tipos de error nativos:
# error, ErrorTipo, ErrorRango, ErrorIO
# ErrorDivision, ErrorValor
mi_juego.lince
importar "juego"
importar "matematica"

juego.abrir("Mi primer juego", 800, 600)
sea x = 100

mientras juego.abierto() {
    si juego.tecla("derecha") { x = x + 300 * juego.dt() }
    si juego.tecla("izquierda") { x = x - 300 * juego.dt() }

    juego.limpiar([20, 20, 30])
    juego.circulo(x, 300, 20, "#ffc850")
    juego.texto("Flechas para mover", 10, 10, 3)
    juego.presentar()      # muestra y espera a 60 fps
}

Trece minijuegos para leer y modificar

Pong, serpiente, rompeladrillos, pájaro saltarín, esquiva, memoria, tres en raya, un plataformas con cámara y sprites, una mazmorra de tiles con fantasmas que te persiguen, un paseo con animaciones generadas a partir de un solo dibujo, uno para el móvil, una aventura con menús y diálogos y uno de física. Cada uno es un solo archivo en examples/.

Plataformas
08_plataformas.lince
Mazmorra
09_mazmorra.lince
Paseo
10_paseo.lince
Rompeladrillos
03_rompeladrillos.lince
Pong
01_pong.lince
Serpiente
02_serpiente.lince

La Piedra del Lince

Una aventura entera hecha con Lince: un pueblo, un bosque y una fortaleza dibujados en Tiled, diálogos, una tienda, cofres, enemigos, un jefe, partida guardada y créditos. Se juega con teclado, con mando o con el dedo en el móvil. Los gráficos, la música y los sonidos son de terceros con licencias libres (Kenney y OpenGameArt). Está en juegos/la_piedra_del_lince.

La Piedra del Lince: la portada, la sabia Ura, el cofre de la llave y Grum

Diseñado para ser directo

Sin magia, sin frameworks gigantes, sin configuraciones misteriosas.

🇪🇸

100% en español

Palabras clave, mensajes de error y documentación en español. Programar no debería requerir saber inglés.

🔥

Recarga en caliente

Guarda el archivo con el juego en marcha y se actualiza al momento, sin cerrar la ventana y con el jugador donde estaba. Si te equivocas, el error sale en la propia ventana.

⚡

Ejecutables autónomos

lince compilar empaqueta tu programa y los archivos que importa en un único ejecutable. Se copia a otra máquina y funciona: sin instalar Lince, sin JVM.

📦

Sin dependencias

Un solo binario compilado con gcc y make, en Linux y en Windows. Para abrir ventanas usa SDL2, que se carga al ejecutar: no hace falta para compilar.

🔍

Errores claros

Mensajes en español con número de línea exacto. Sin stack traces crípticos. El error dice exactamente qué falló.

🧩

Módulos incluidos

Ventana, dibujo 2D, imágenes y sprites, mapas de tiles, animaciones, partículas, escenas, teclado, ratón, mando, sonido, cámara y colisiones; más matemáticas, texto, archivos y JSON para tus partidas guardadas.

📦

Librerías en Lince

Reparte tu código en archivos y dale un espacio de nombres con importar "./x" como x. Las rutas se resuelven junto al archivo que importa, así que una librería funciona desde cualquier sitio.

🔁

REPL interactivo

Ejecuta lince sin argumentos para entrar al REPL con historial persistente. Ideal para explorar y probar.


Módulos incluidos

Importa lo que necesitas. Sin instalación adicional.

juego — ventana, sprites, mapas de tiles, partículas, escenas, teclas, ratón, mando, sonido, cámara…
matematica — aleatorio, semilla, distancia, angulo, vectores…
texto — mayusculas, dividir, reemplazar…
archivos — leer, escribir, existe, listar…
json — parsear, texto, validar
tiempo — ahora, formato, esperar
sistema — entorno, argumentos
pruebas — probar tu lógica de juego
bytes — leer y escribir archivos binarios
bits — operaciones bit a bit, hex y binario

Un script o un ejecutable

Ejecuta tus programas directamente mientras desarrollas. Cuando quieras repartirlos, empaquétalos en un solo ejecutable: el compilador es parte del mismo binario, sin herramientas extra.

lince prog.lince
Ejecutar directamente
lince compilar prog.lince
Crear un ejecutable autónomo
Tiempo de ejecución (medido con make bench)
Fibonacci(30)
~0,3 s
Bucle de 5 millones
~0,5 s
Diccionario de 50.000 claves
~0,04 s

Tu primer juego, paso a paso

De una ventana vacía a Lluvia de estrellas, un juego completo con portada, puntos, vidas y récord, en seis pasos. Cada paso es el programa entero, con lo nuevo marcado, y se ejecuta al generar la página: lo que copias funciona.

Empezar el tutorial

Manual con ejemplos que no mienten

Los ejemplos del manual no están escritos a mano: son archivos .lince del repositorio que se ejecutan al generar la página, y lo que se publica debajo de cada uno es su salida real. Si el lenguaje cambia de comportamiento, la integración continua lo detecta, así que la página no puede quedarse obsoleta en silencio.

Abrir el manual

Todo para hacer juegos, con capturas reales

El módulo juego tiene su propia página: la ventana, el dibujo, los sprites y sus animaciones, los mandos y la pantalla táctil, el sonido, los mapas (también los de Tiled), la física, los menús y diálogos, las partidas guardadas... Cada ejemplo se ejecuta al generar la página y la imagen es lo que dibuja de verdad.

Ver el módulo juego

Empieza en dos comandos

Lo más fácil es descargarlo ya compilado para Linux o Windows: se descomprime y se usa. Para compilarlo tú solo necesitas gcc y make. Para jugar, SDL2.

🐧 Linux
$ git clone https://github.com/arreina/lince.git
$ cd lince && make
$ ./lince examples/01_pong.lince

# Para abrir ventanas
$ sudo apt install libsdl2-2.0-0

# Opcional: instalar globalmente
$ sudo make install
🪟 Windows (MSYS2, terminal UCRT64)
$ pacman -S mingw-w64-ucrt-x86_64-gcc make mingw-w64-ucrt-x86_64-SDL2
$ git clone https://github.com/arreina/lince.git
$ cd lince && make
$ ./lince examples/01_pong.lince

# Para compartir un juego: carpeta y .zip con todo
$ ./lince repartir mi_juego.lince
lince programa.lince
Ejecutar un programa
lince compilar prog.lince
Crear un ejecutable autónomo
lince
REPL interactivo
lince ayuda
Ver ayuda completa
✅ 31/31 tests del intérprete
✅ 15/15 tests de los ejecutables
✅ 10/10 minijuegos jugados solos en la CI

¿Listo para hacer tu primer juego?

Clona el repositorio, ejecuta make y abre uno de los minijuegos para empezar a cambiarlo.

Ver en GitHub Leer la especificación