はじめに
このプロジェクトでは、C 言語を使ってncursesライブラリを使って簡単なコードレインを作成する方法を学びます。Ncurses は、端末でのテキストベースのユーザーインターフェイスを容易にするライブラリです。このプロジェクトでは、プロジェクトのセットアップ、必要なコンポーネントの初期化、コードレインの実装まで案内します。
👀 プレビュー

🎯 タスク
このプロジェクトでは、以下を学びます。
- ncurses ライブラリのインストール方法
- 雨滴用の定数と構造体を定義する方法
- アニメーション用の色を初期化する方法
- 雨滴が降りる様子を表示するアニメーションループを作成する方法
- アニメーションを終了するためのユーザー入力を読み取る方法
🏆 成果
このプロジェクトを完了すると、以下ができるようになります。
- C 言語で ncurses ライブラリを使用する
- C 言語で構造体を実装する
- 端末でアニメーションを作成する
プロジェクトファイルを作成する
まず、システムにncursesライブラリがインストールされていることを確認します。インストールされていない場合は、以下のコマンドを使用してインストールできます。
sudo apt update
sudo apt-get install libncurses5-dev
次に、code_rain.cという名前の新しいファイルを作成し、好きなコードエディタで開きます。
cd ~/project
touch code_rain.c
定数を定義する
次に、Ncurses、標準ライブラリ、および time を含む必要なヘッダーファイルを作成します。最大雨滴数を定義し、雨滴のプロパティを持つ構造体を作成します。
#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_colorとinit_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)関数を使用して色ペアの定義を変更します。この関数は 3 つのパラメータを受け取ります。色ペアの番号、前景色の番号、背景色の番号です。ここでは、init_pair関数を使用して、前景色が緑、シアン、マゼンタ、黄色で、背景色が黒の 4 つの色ペアを定義しています。
メイン関数の実装
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;
getch()関数を使ってユーザーの入力文字を取得し、整数変数chに格納する。
forループは、複数の雨滴に関する情報が格納されたrain配列をループ処理し、雨滴の落下をシミュレートする。各雨滴は、色、位置座標(x と y)、落下速度(speed)、文字(ch)の 4 つのプロパティで構成される。
このループは、qキーが押されるまで継続し、そのときbreak;文が実行され、ループを抜け、プログラムが終了する。
アニメーションループが終了した後、ncurses環境をクリーンアップし、プログラムを終了する。
endwin();
return 0;
コンパイルと実行
コンパイルコマンドは通常のものと若干異なります。gcc に-lオプションを追加してncursesライブラリを含める必要があります。
cd ~/project
gcc -o code_rain code_rain.c -l ncurses
./code_rain

まとめ
このプロジェクトでは、C 言語を使ってncursesライブラリを用いて簡単な雨滴アニメーションを作成する方法を学びました。プロジェクトをセットアップし、必要なコンポーネントを初期化し、アニメーションループを実装し、プログラムを終了するためのユーザー入力を処理しました。Ncurses は、テキストベースのユーザーインターフェイスを作成するための強力なツールセットを提供しており、これを使って様々なタイプの端末ベースのアプリケーションを作成することができます。



