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

C言語で作る!キラキラ点滅するクリスマスツリー表示プログラム

今回は少しユニークなプログラミング課題を紹介します。C言語を使って、クリスマスツリーをランダムに表示する方法です。完成したツリーは、本物のクリスマスイルミネーションのようにキラキラと点滅して見えます。

クリスマスツリーの表示の仕組み

クリスマスツリーを描くには、大きさの異なる三角形(ピラミッド)をいくつも縦に積み重ねて出力します。装飾的な葉っぱの部分には、あらかじめ用意した文字リスト(.*+oO)の中からランダムに1文字を選んで表示します。

ツリーの高さやランダム性の度合いは、ソースコード冒頭のマクロ定数を書き換えるだけで自由に調整できます。

点滅が実現される仕組み

このプログラムのポイントは、ツリーを1回描画した直後に画面全体をクリアし、すぐに新しいツリーを再生成するところにあります。「描画 → 消去 → 再描画」というサイクルを高速で繰り返すことで、葉の模様が目まぐるしく変化し、まるで電飾が点滅しているかのような演出が生まれます。

サンプルコード

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#define REFRESH_RATE 40000
#define RANDOM_NESS 5 // 値が大きいほどランダム性は低くなる
void clear_screen() {
    system("@cls||clear");
}
void display_random_leaf() {
    char type_of_leaves[5] = { '.', '*', '+', 'o', 'O' }; // 葉の種類
    int temp = rand() % RANDOM_NESS;
    if (temp == 1)
        printf("%c ", type_of_leaves[rand() % 5]); // tempが1なら別の文字を使用
    else
        printf("%c ", type_of_leaves[1]); // それ以外は * を表示
}
void tree_triangle(int f, int n, int toth) {
    int i, j, k = 2 * toth - 2;
    for (i = 0; i < f - 1; i++)
        k--;
    for (i = f - 1; i < n; i++) { // iは行数を指す
        for (j = 0; j < k; j++) // 空白の挿入に使用
            printf(" ");
        k = k - 1;
        for (j = 0; j <= i; j++)
            display_random_leaf();
        printf("\n");
    }
}
void display_tree(int h) {
    int start = 1, end = 0, diff = 3;
    while (end < h + 1) {
        end = start + diff;
        tree_triangle(start, end, h);
        diff++;
        start = end - 2;
    }
}
void display_log(int n) { // ツリーの幹を表示
    int i, j, k = 2 * n - 4;
    for (i = 1; i <= 6; i++) {
        for (j = 0; j < k; j++)
            printf(" ");
        for (j = 1; j <= 6; j++)
            printf("#");
        printf("\n");
    }
}
main() {
    srand(time(NULL));
    int ht = 15;
    while (1) {
        clear_screen();
        display_tree(ht);
        display_log(ht);
        usleep(REFRESH_RATE); // 画面を入れ替える前に待機
    }
}

コードのポイント解説

  • REFRESH_RATE(40000): 画面を更新するまでの待機時間(マイクロ秒)。値を小さくすると点滅が速くなります。
  • RANDOM_NESS(5): ランダム性の度合い。値が大きいほどランダム性は低くなり、通常の*が多く表示されます。
  • clear_screen(): system("@cls||clear")により、Windowsではcls、LinuxやmacOSではclearコマンドが実行され、画面が消去されます。
  • display_random_leaf(): rand()関数で葉の文字を決定し、一定の確率で別の文字へ切り替えます。
  • tree_triangle(): 開始行fから終了行nまでの範囲で、空白と葉を並べて三角形を描画します。
  • display_tree(): 差分(diff)を増やしながら複数の三角形を呼び出し、下に行くほど広がるツリー本体を構成します。
  • display_log(): #文字を6個×6行で並べ、ツリーの幹を表現します。

なお、待機処理に使っているusleep()はPOSIX系の関数のため、LinuxやmacOSなどUnix系環境での動作を想定しています。

実行結果

プログラムをコンパイルして実行すると、以下のようにランダムな模様を持つクリスマスツリーが表示され、絶えず点滅し続けます。ターミナル上で手軽に楽しめる、季節感あふれるデモプログラムです。

C言語で作る!キラキラ点滅するクリスマスツリー表示プログラム

  1. 【初心者向け】平行四辺形の外周(周長)を計算するC言語プログラム

    本記事では、2つの辺の長さが与えられた平行四辺形の外周(周囲の長さ)を計算し、その結果を表示するC言語プログラムを紹介します。数式の考え方からアルゴリズム、実際のコードまで順を追って解説していきます。 平行四辺形とは? 平行四辺形とは、次のような性質を持つ四角形の一種です。 向かい合う2組の辺がそれぞれ平行である 向かい合う角の大きさが互いに等しい 2本の対角線が互いの中点で交わる 下の図では、「a」と「b」が平行四辺形の隣り合う2つの辺の長さを表しています。 平行四辺形の外周の求め方 平行四辺形の外周(周長)は、次の式で定義されます。 外周 = 2 × (a + b)   = 2 ×

  2. C言語でcos(x)級数の合計を計算するプログラム

    本記事では、角度 x と項数 n が与えられたときに、cos(x)級数の合計を求めるC言語プログラムを解説します。ここで、x は余弦(コサイン)を求める角度、n は cos(x) 級数に含める項の数を表します。cos(x)とはcos(x) は三角関数の一つで、角度 x に対する余弦の値を計算するために使用される関数です。単位円上では、角度 x における点の x座標が cos(x) の値に対応します。数式cos(x) は以下のように無限級数(マクローリン展開)で表すことができます。$$\cos (x) = \displaystyle\sum\limits_{k=0}^\infty \frac{(