Creando lluvia de código en el terminal con C y Ncurses

CCBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este proyecto, aprenderás a crear una lluvia de código simple utilizando la biblioteca ncurses en el lenguaje de programación C. Ncurses es una biblioteca que facilita la creación de interfaces de usuario basadas en texto en la terminal. Este proyecto te guiará a través de la configuración del proyecto, la inicialización de los componentes necesarios y la implementación de la lluvia de código.

👀 Vista previa

Lluvia de código

🎯 Tareas

En este proyecto, aprenderás:

  • Cómo instalar la biblioteca ncurses
  • Cómo definir constantes y estructuras para las gotas de lluvia
  • Cómo inicializar los colores para la animación
  • Cómo crear un bucle de animación para mostrar las gotas de lluvia cayendo
  • Cómo leer la entrada del usuario para salir de la animación

🏆 Logros

Después de completar este proyecto, podrás:

  • Utilizar la biblioteca ncurses en C
  • Implementar estructuras en C
  • Crear animaciones en la terminal

Crear los archivos del proyecto

Primero, asegúrate de tener instalada la biblioteca ncurses en tu sistema. Si no la tienes, puedes usar el siguiente comando para instalarla:

sudo apt update
sudo apt-get install libncurses5-dev

A continuación, crea un nuevo archivo llamado code_rain.c y úbrelo en tu editor de código preferido.

cd ~/project
touch code_rain.c
✨ Revisar Solución y Practicar

Definir constantes

Ahora, crea los archivos de encabezado necesarios, incluyendo Ncurses, la biblioteca estándar y la hora. Define el número máximo de gotas de lluvia y crea una estructura para las gotas de lluvia con sus propiedades.

#include <ncurses.h>
#include <stdlib.h>
#include <time.h>

#define MAX_RAIN 200

typedef struct {
    int x, y;
    char ch;
    int color;
    int speed;
} Raindrop;
✨ Revisar Solución y Practicar

Inicializar los colores

Crea una función para inicializar los colores que se utilizarán en la animación. Esta función configurará los pares de colores utilizando las funciones start_color e init_pair proporcionadas por ncurses.

void init_colors() {
    start_color();
    init_pair(1, COLOR_GREEN, COLOR_BLACK);
    init_pair(2, COLOR_CYAN, COLOR_BLACK);
    init_pair(3, COLOR_MAGENTA, COLOR_BLACK);
    init_pair(4, COLOR_YELLOW, COLOR_BLACK);
}

La función start_color() es la función que habilita la función de color de ncurses. Esta función debe ser llamada antes de utilizar cualquier otra función de manipulación de colores.

La función init_pair(1, COLOR_GREEN, COLOR_BLACK) se utiliza luego para cambiar la definición del par de colores. Acepta tres parámetros: el número del par de colores, el número del color de primer plano y el número del color de fondo. Aquí, la función init_pair se utiliza para definir cuatro pares de colores con un color de primer plano de verde, cian, magenta y amarillo, y un color de fondo de negro.

✨ Revisar Solución y Practicar

Implementar la función principal

Dentro de la función main, configura el entorno de ncurses, incluyendo desactivar el buffer de línea y la repetición de teclas. Habilita el teclado numérico para las teclas especiales y establece la entrada no bloqueante. Obtén las dimensiones máximas de la pantalla e inicializa los colores utilizando la función definida anteriormente.

int main() {
    initscr();
    cbreak();
    noecho();
    curs_set(0);
    keypad(stdscr, TRUE);
    nodelay(stdscr, TRUE);

    int max_x, max_y;
    getmaxyx(stdscr, max_y, max_x);
    init_colors();

    Raindrop rain[MAX_RAIN];

    srand(time(NULL));

    //... (el código restante se abordará en pasos subsiguientes)
}
✨ Revisar Solución y Practicar

Inicializar los parámetros de las gotas de lluvia

Inicializa las propiedades de cada gota de lluvia utilizando un bucle. Establece sus posiciones iniciales, caracteres, colores y velocidades de caída.

for (int i = 0; i < MAX_RAIN; i++) {
    rain[i].x = rand() % max_x;
    rain[i].y = rand() % max_y;
    rain[i].ch = rand() % 94 + 33;
    rain[i].color = rand() % 4 + 1;
    rain[i].speed = rand() % 3 + 1;
}
✨ Revisar Solución y Practicar

Implementar el bucle de animación

Configura un bucle para actualizar continuamente las posiciones de las gotas de lluvia y mostrarlas en la pantalla. Verifica la entrada del usuario para salir del bucle de animación.

while (1) {
    int ch = getch();

    if (ch == 'q') {
        break;
    }

    for (int i = 0; i < MAX_RAIN; i++) {
        attron(COLOR_PAIR(rain[i].color));
        mvaddch(rain[i].y, rain[i].x,'');
        rain[i].y += rain[i].speed;
        if (rain[i].y >= max_y) {
            rain[i].y = 0;
            rain[i].x = rand() % max_x;
        }
        mvaddch(rain[i].y, rain[i].x, rain[i].ch);
        attroff(COLOR_PAIR(rain[i].color));
    }

    refresh();
    napms(50);
}

Utiliza la función getch() para obtener los caracteres de entrada del usuario y almacenarlos en la variable entera ch.

El bucle for se utiliza para simular el efecto de las gotas de lluvia. Recorre una matriz llamada rain, que contiene información sobre múltiples gotas de lluvia. Cada gota de lluvia consta de las siguientes propiedades: color, coordenadas de posición (x e y), velocidad de caída (speed) y carácter (ch).

Este bucle continuará hasta que presiones la tecla q, momento en el que el programa pasará la instrucción break; y saldrá del bucle, por lo tanto, finalizando el programa.

Después de que termine el bucle de animación, limpia el entorno de ncurses y sale del programa.

endwin();
return 0;
✨ Revisar Solución y Practicar

Compilación y ejecución

El comando de compilación es un poco diferente al habitual. Requiere agregar la opción -l a gcc para incluir la biblioteca ncurses:

cd ~/project
gcc -o code_rain code_rain.c -l ncurses
./code_rain
Code Rain
✨ Revisar Solución y Practicar

Resumen

En este proyecto, aprendiste cómo crear una animación simple de gotas de lluvia utilizando la biblioteca ncurses en el lenguaje de programación C. Configuraste el proyecto, inicializaste los componentes necesarios, implementaste el bucle de animación y manejaste la entrada del usuario para salir del programa. Ncurses proporciona una herramienta poderosa para crear interfaces de usuario basadas en texto, y puedes utilizarla para crear varios tipos de aplicaciones basadas en terminal.