이번 글에서는 재미있는 프로그래밍 문제 하나를 살펴보겠습니다. 바로 C 언어를 이용해 크리스마스 트리를 무작위로 화면에 출력하는 방법입니다. 프로그램을 실행하면 마치 크리스마스 트리 전구처럼 트리가 계속 반짝이며 깜빡이는 효과를 확인할 수 있습니다.
크리스마스 트리 출력의 기본 원리
크리스마스 트리를 출력하려면 크기가 서로 다른 피라미드(삼각형) 모양을 여러 개 만들어 아래로 차곡차곡 겹쳐 그리면 됩니다. 트리를 장식하는 잎사귀는 미리 정해둔 문자 목록('.', '*', '+', 'o', 'O') 중에서 무작위로 하나를 골라 출력하는 방식으로 표현합니다. 트리의 높이와 무작위성(랜덤 정도)은 상수 값을 수정하여 자유롭게 조절할 수 있습니다.
여기서 핵심 아이디어는 다음과 같습니다. 트리를 한 번 생성한 후 화면 전체를 지우고(clear) 다시 새로 생성하는 과정을 무한히 반복합니다. 매번 잎 문자가 무작위로 바뀌기 때문에 화면에서는 트리가 실제 전구처럼 계속 깜빡거리는 것처럼 보이게 됩니다.
예제 코드
#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는 행(row) 수를 가리킴
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)마다 화면이 지워졌다가 새로 그려지면서 잎 문자들이 무작위로 바뀌는 것을 볼 수 있습니다. 결과적으로 트리가 마치 알록달록한 전구 장식처럼 반짝이는 듯한 시각적 효과를 얻게 됩니다.
트리의 높이는 main 함수의 ht 변수 값으로, 깜빡임 속도는 REFRESH_RATE 매크로 값으로, 잎의 무작위성은 RANDOM_NESS 매크로 값으로 각각 조절할 수 있으니 직접 값을 바꿔가며 실험해 보시기 바랍니다.