Создание дождя из кода в терминале с использованием C и Ncurses

CCBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом проекте вы научитесь создавать простой дождь из символов с помощью библиотеки ncurses в языке программирования C. Ncurses - это библиотека, которая облегчает создание текстовых интерфейсов пользователя в терминале. В этом проекте вас проведут по настройке проекта, инициализации необходимых компонентов и реализации дождя из символов.

👀 Предварительный просмотр

Дождь из символов

🎯 Задачи

В этом проекте вы научитесь:

  • Как установить библиотеку ncurses
  • Как определить константы и структуры для капель дождя
  • Как инициализировать цвета для анимации
  • Как создать анимационный цикл для отображения падения капель дождя
  • Как считывать ввод пользователя для выхода из анимации

🏆 Достижения

После завершения этого проекта вы сможете:

  • Использовать библиотеку ncurses в C
  • Реализовать структуры в C
  • Создавать анимации в терминале

Создайте файлы проекта

Во - первых, убедитесь, что на вашей системе установлена библиотека ncurses. Если нет, вы можете использовать следующую команду для установки:

sudo apt update
sudo apt-get install libncurses5-dev

Далее, создайте новый файл с именем code_rain.c и откройте его в предпочитаемом редакторе кода.

cd ~/project
touch code_rain.c
✨ Проверить решение и практиковаться

Определите константы

Теперь создайте необходимые заголовочные файлы, включая Ncurses, стандартную библиотеку и время. Определите максимальное количество капель дождя и создайте структуру для капель дождя с их свойствами.

#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;
✨ Проверить решение и практиковаться

Инициализация цветов

Создайте функцию для инициализации цветов, которые будут использоваться в анимации. Эта функция будет настраивать пары цветов с использованием функций start_color и init_pair, предоставляемых библиотекой 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);
}

Функция start_color() - это функция, которая включает цветовую функцию ncurses. Эта функция должна быть вызвана перед использованием любой другой функции по манипуляции с цветами.

Затем функция init_pair(1, COLOR_GREEN, COLOR_BLACK) используется для изменения определения пары цветов. Она принимает три параметра: номер пары цветов, номер цвета переднего плана и номер цвета фонового плана. Здесь функция init_pair используется для определения четырех пар цветов с цветом переднего плана зеленым, голубым, пурпурным и желтым, а цветом фонового плана черным.

✨ Проверить решение и практиковаться

Реализация главной функции

Внутри функции main настройте среду ncurses, включая отключение буферизации строк и отображение вводимых символов. Включите цифровую клавиатуру для специальных клавиш и установите неблокирующий ввод. Получите максимальные размеры экрана и инициализируйте цвета с использованием ранее определенной функции.

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

    //... (оставшаяся часть кода, которая будет рассмотрена в последующих шагах)
}
✨ Проверить решение и практиковаться

Инициализация параметров капель дождя

Инициализируйте свойства каждой капли дождя с использованием цикла. Установите их начальную позицию, символ, цвет и скорость падения.

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;
}
✨ Проверить решение и практиковаться

Реализация анимационного цикла

Установите цикл для непрерывного обновления позиций капель дождя и отображения их на экране. Проверяйте ввод пользователя для выхода из анимационного цикла.

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

Используйте функцию getch() для получения введенных пользователем символов и сохраните их в целочисленную переменную ch.

for-цикл используется для имитации эффекта капель дождя. Он обходит массив под названием rain, который содержит информацию о нескольких каплях дождя. Каждая капля дождя состоит из следующих свойств: цвет, координаты позиции (x и y), скорость падения (speed) и символ (ch).

Этот цикл будет продолжаться до тех пор, пока вы не нажмете клавишу q, при этом программа будет выполнять break; Строка выходит из цикла, тем самым завершая программу.

После завершения анимационного цикла очистите среду ncurses и выйдите из программы.

endwin();
return 0;
✨ Проверить решение и практиковаться

Компиляция и запуск

Команда компиляции немного отличается от обычной. Она требует добавления опции -l к gcc для включения библиотеки ncurses:

cd ~/project
gcc -o code_rain code_rain.c -l ncurses
./code_rain
Code Rain
✨ Проверить решение и практиковаться

Резюме

В этом проекте вы узнали, как создать простую анимацию капель дождя с использованием библиотеки ncurses в языке программирования C. Вы настроили проект, инициализировали необходимые компоненты, реализовали анимационный цикл и обработали ввод пользователя для выхода из программы. Ncurses предоставляет мощный набор инструментов для создания текстовых пользовательских интерфейсов, и вы можете использовать его для создания различных типов приложений для терминала.