C 와 Ncurses 를 사용한 터미널 코드 레인 만들기

CBeginner
지금 연습하기

소개

이 프로젝트에서는 C 프로그래밍 언어의 ncurses 라이브러리를 사용하여 간단한 코드 비를 만드는 방법을 배우게 됩니다. Ncurses 는 터미널에서 텍스트 기반 사용자 인터페이스를 용이하게 하는 라이브러리입니다. 이 프로젝트는 프로젝트 설정, 필요한 구성 요소 초기화, 코드 비 구현 과정을 안내합니다.

👀 미리보기

Code Rain

🎯 과제

이 프로젝트에서 다음을 배우게 됩니다:

  • ncurses 라이브러리 설치 방법
  • 빗방울에 대한 상수 및 구조체 정의 방법
  • 애니메이션에 대한 색상 초기화 방법
  • 빗방울이 떨어지는 것을 표시하는 애니메이션 루프 생성 방법
  • 애니메이션을 종료하기 위한 사용자 입력을 읽는 방법

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다:

  • C 에서 ncurses 라이브러리 사용
  • 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;
✨ 솔루션 확인 및 연습

색상 초기화

애니메이션에 사용될 색상을 초기화하는 함수를 생성합니다. 이 함수는 ncurses에서 제공하는 start_colorinit_pair 함수를 사용하여 색상 쌍을 설정합니다.

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

    // ... (remaining code to be covered in subsequent steps)
}
✨ 솔루션 확인 및 연습

빗방울 매개변수 초기화

루프를 사용하여 각 빗방울의 속성을 초기화합니다. 초기 위치, 문자, 색상 및 낙하 속도를 설정합니다.

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;
✨ 솔루션 확인 및 연습

컴파일 및 실행

컴파일 명령은 일반적인 것과 약간 다릅니다. ncurses 라이브러리를 포함하기 위해 gcc 에 -l 옵션을 추가해야 합니다.

cd ~/project
gcc -o code_rain code_rain.c -l ncurses
./code_rain
Code Rain
✨ 솔루션 확인 및 연습

요약

이 프로젝트에서는 C 프로그래밍 언어에서 ncurses 라이브러리를 사용하여 간단한 빗방울 애니메이션을 만드는 방법을 배웠습니다. 프로젝트를 설정하고, 필요한 구성 요소를 초기화하고, 애니메이션 루프를 구현하고, 프로그램을 종료하기 위한 사용자 입력을 처리했습니다. Ncurses 는 텍스트 기반 사용자 인터페이스를 생성하기 위한 강력한 도구 세트를 제공하며, 이를 사용하여 다양한 유형의 터미널 기반 애플리케이션을 만들 수 있습니다.