C言語で作る!キラキラ点滅するクリスマスツリー表示プログラム
今回は少しユニークなプログラミング課題を紹介します。C言語を使って、クリスマスツリーをランダムに表示する方法です。完成したツリーは、本物のクリスマスイルミネーションのようにキラキラと点滅して見えます。
クリスマスツリーの表示の仕組み
クリスマスツリーを描くには、大きさの異なる三角形(ピラミッド)をいくつも縦に積み重ねて出力します。装飾的な葉っぱの部分には、あらかじめ用意した文字リスト(.・*・+・o・O)の中からランダムに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言語プログラム
本記事では、2つの辺の長さが与えられた平行四辺形の外周(周囲の長さ)を計算し、その結果を表示するC言語プログラムを紹介します。数式の考え方からアルゴリズム、実際のコードまで順を追って解説していきます。 平行四辺形とは? 平行四辺形とは、次のような性質を持つ四角形の一種です。 向かい合う2組の辺がそれぞれ平行である 向かい合う角の大きさが互いに等しい 2本の対角線が互いの中点で交わる 下の図では、「a」と「b」が平行四辺形の隣り合う2つの辺の長さを表しています。 平行四辺形の外周の求め方 平行四辺形の外周(周長)は、次の式で定義されます。 外周 = 2 × (a + b) = 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{(