C 言語と Ncurses を使って端末のコードレインを作成する

CCBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このプロジェクトでは、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、標準ライブラリ、および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_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)関数を使用して色ペアの定義を変更します。この関数は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
Code Rain
✨ 解答を確認して練習

まとめ

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