Criando Chuva de Código no Terminal com C e Ncurses

CBeginner
Pratique Agora

Introdução

Neste projeto, você aprenderá como criar uma simples chuva de código usando a biblioteca ncurses na linguagem de programação C. Ncurses é uma biblioteca que facilita interfaces de usuário baseadas em texto no terminal. Este projeto irá guiá-lo através da configuração do projeto, inicialização dos componentes necessários e implementação da chuva de código.

👀 Pré-visualização

Code Rain

🎯 Tarefas

Neste projeto, você aprenderá:

  • Como instalar a biblioteca ncurses
  • Como definir constantes e estruturas para as gotas de chuva
  • Como inicializar cores para a animação
  • Como criar um loop de animação para exibir as gotas de chuva caindo
  • Como ler a entrada do usuário para sair da animação

🏆 Conquistas

Após concluir este projeto, você será capaz de:

  • Usar a biblioteca ncurses em C
  • Implementar estruturas em C
  • Criar animações no terminal

Criar os Arquivos do Projeto

Primeiramente, certifique-se de ter a biblioteca ncurses instalada em seu sistema. Caso não tenha, você pode usar o seguinte comando para instalá-la:

sudo apt update
sudo apt-get install libncurses5-dev

Em seguida, crie um novo arquivo chamado code_rain.c e abra-o em seu editor de código preferido.

cd ~/project
touch code_rain.c
✨ Verificar Solução e Praticar

Definir Constantes

Agora, crie os arquivos de cabeçalho necessários, incluindo Ncurses, biblioteca padrão e tempo. Defina o número máximo de gotas de chuva e crie uma estrutura para as gotas de chuva com suas propriedades.

#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;
✨ Verificar Solução e Praticar

Inicializando as Cores

Crie uma função para inicializar as cores que serão usadas na animação. Esta função configurará os pares de cores usando as funções start_color e init_pair fornecidas 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);
}

A função start_color() é a função que habilita a funcionalidade de cores do ncurses. Esta função precisa ser chamada antes que qualquer outra função de manipulação de cores seja usada.

A função init_pair(1, COLOR_GREEN, COLOR_BLACK) é então usada para alterar a definição do par de cores. Ela aceita três parâmetros: o número do par de cores, o número da cor do primeiro plano (foreground) e o número da cor do fundo (background). Aqui, a função init_pair é usada para definir quatro pares de cores com uma cor de primeiro plano verde, ciano, magenta e amarelo, e uma cor de fundo preta.

✨ Verificar Solução e Praticar

Implementando a Função Principal

Dentro da função main, configure o ambiente ncurses, incluindo desativar o buffer de linha e o eco. Habilite o teclado para teclas especiais e defina a entrada não bloqueante. Obtenha as dimensões máximas da tela e inicialize as cores usando a função 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));

    // ... (remaining code to be covered in subsequent steps)
}
✨ Verificar Solução e Praticar

Inicializando os Parâmetros da Gota de Chuva

Inicialize as propriedades para cada gota de chuva usando um loop. Defina suas posições iniciais, caracteres, cores e velocidades de queda.

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;
}
✨ Verificar Solução e Praticar

Implementando o Loop de Animação

Configure um loop para atualizar continuamente as posições das gotas de chuva e exibi-las na tela. Verifique a entrada do usuário para sair do loop de animação.

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);
}

Use a função getch() para obter os caracteres de entrada do usuário e armazená-los na variável inteira ch.

O loop for é usado para simular o efeito das gotas de chuva. Ele percorre um array chamado rain, que contém informações sobre múltiplas gotas de chuva. Cada gota de chuva consiste nas seguintes propriedades: cor, coordenadas de posição (x e y), velocidade de queda (speed) e caractere (ch).

Este loop continuará até que você pressione a tecla q, momento em que o programa executará break;. A instrução sai do loop, encerrando assim o programa.

Após o término do loop de animação, limpe o ambiente ncurses e saia do programa.

endwin();
return 0;
✨ Verificar Solução e Praticar

Compilação e Execução

O comando de compilação é ligeiramente diferente do habitual. Ele requer a adição da opção -l ao gcc para incluir a biblioteca ncurses:

cd ~/project
gcc -o code_rain code_rain.c -l ncurses
./code_rain
Code Rain
✨ Verificar Solução e Praticar

Resumo

Neste projeto, você aprendeu como criar uma animação simples de gotas de chuva usando a biblioteca ncurses na linguagem de programação C. Você configurou o projeto, inicializou os componentes necessários, implementou o loop de animação e tratou a entrada do usuário para sair do programa. Ncurses fornece um conjunto de ferramentas poderoso para criar interfaces de usuário baseadas em texto, e você pode usá-lo para criar vários tipos de aplicações baseadas em terminal.