C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で作るマトリックス風・文字が降り注ぐエフェクトの実装方法

映画『マトリックス』などでおなじみの、緑色の文字が画面を流れ落ちるあの演出。実はC++の標準ライブラリだけでも、コンソール上に簡単に再現できます。この記事では、乱数・スレッド・スリープ処理を組み合わせて、マトリックス風の「文字が降り注ぐエフェクト」を実装する方法を解説します。

実装のポイント

この演出を実現するには、次の3つの要素を押さえておく必要があります。

  • マトリックスの幅を定義する … 1行に表示する最大桁数(画面幅)を決めます。
  • 文字の間隔をランダムにする … 隣り合う文字どうしの隙間は一定である必要はありません。ランダム性を持たせることで、自然でノイズ感のある演出になります。
  • 表示に遅延を入れる … 各行を表示するたびに短い待機時間を挟むことで、文字がゆっくり「落ちてくる」ような視覚効果を生み出します。

サンプルコード

#include<iostream>
#include<string>
#include<thread>
#include<cstdlib>
#include<ctime>
#include<chrono>

const int wd = 70;             // マトリックス画面の幅
const int flipsPerLine = 5;    // 1行ごとに反転するフラグの数
const int sleepTime = 50;      // 行間の待機時間(ミリ秒)

using namespace std;

int main() {
    int i = 0, x = 0;
    srand(time(NULL)); // 実行時にランダム値を得られるよう初期化

    bool alternate[wd] = {0}; // その位置に文字を表示するかどうかの判定に使用

    // 表示に使用する文字集合
    const string ch =
        "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+{}|?><`~";
    const int l = ch.size();

    while (true) {
        for (i = 0; i < wd; i += 2) {
            if (alternate[i]) // alternate が 1 のときだけ文字を表示
                cout << ch[rand() % l] << " ";
            else
                cout << " ";
        }
        for (i = 0; i != flipsPerLine; ++i) {
            // フラグをランダムな位置で反転させる
            x = rand() % wd;
            alternate[x] = !alternate[x];
        }
        cout << endl;
        this_thread::sleep_for(chrono::milliseconds(sleepTime)); // 演出のため少し待機
    }
}

コードのポイント解説

  • wd(幅)、flipsPerLine(1行あたりの反転回数)、sleepTime(待機時間)の3つの定数を変更するだけで、演出の密度や速度を自由に調整できます。
  • alternate 配列は「その位置に文字を表示するかどうか」を決めるフラグです。毎行、ランダムな位置を flipsPerLine 回だけ反転させることで、表示される場所が行ごとに入れ替わり、ちらつきながら流れ落ちる独特の雰囲気が生まれます。
  • this_thread::sleep_for() を使って50ミリ秒ごとに行を出力することで、落ちてくる速度をコントロールしています。値を小さくすると高速に、大きくするとゆっくりとした動きになります。

ビルドと実行方法

g++ でコンパイルする場合、スレッド機能を使用するため環境によっては -pthread オプションが必要です。

g++ -std=c++11 matrix.cpp -o matrix -pthread
./matrix

プログラムは無限ループで動き続けるため、停止するときは Ctrl + C を押してください。

応用:緑色の文字でさらに本格的に

ANSIエスケープシーケンスに対応したターミナルなら、main() の先頭で cout << "\033[1;32m"; と出力しておくことで文字を緑色にでき、より映画らしい演出になります。戻すときは \033[0m を出力します。

出力結果

実行すると、ランダムな英数字や記号がコンソール上を流れ落ち、映画さながらのマトリックス演出が楽しめます。

C++で作るマトリックス風・文字が降り注ぐエフェクトの実装方法

  1. 【C++入門】FizzBuzz問題の実装方法と解法をわかりやすく解説

    この記事では、FizzBuzz問題の実装方法とその種類について詳しく解説します。 FizzBuzzとは? FizzBuzzは、プログラミング学習の定番として知られるシンプルな問題です。1から100までの数字を出力する際に、3の倍数を「Fizz」に、5の倍数を「Buzz」に置き換えて表示します。 具体例 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, Buzz,.... 解法のアプローチ この問題を解く最もシンプルな方法は、1から100までのループ処理を行い、各

  2. C++で行列を走査する方法:行優先トラバーサルと列優先トラバーサルの徹底解説

    行列の走査には2つの方法がある2次元行列(マトリックス)の要素を訪問する方法は、大きく分けて2種類あります。行優先(Row-wise)トラバーサルでは、1行目から順に、各行の要素を先頭のインデックスから最後のインデックスまで左から右へと訪問していきます。すべての行を処理し終えるまで、これを繰り返します。一方、列優先(Column-wise)トラバーサルでは、1列目から最終列目へ向かって、各列の要素を上から下へと順番に訪問します。インデックスの基本的な考え方2次元行列 M[i][j] において、インデックス i は行、インデックス j は列を表します。行優先トラバーサルの場合は、次の順序でアクセ