欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言实现一个闪烁的圣诞树

程序员文章站 2022-06-19 13:29:15
圣诞节来啦!看到很多小伙伴用各种语言画出了圣诞树,于是就想用 c 语言来画一颗圣诞树,有点粗糙,下面先来看一下效果图吧!图1 圣诞树下面来看下源码,如下所示:#include

圣诞节来啦!看到很多小伙伴用各种语言画出了圣诞树,于是就想用 c 语言来画一颗圣诞树,有点粗糙,下面先来看一下效果图吧!

C语言实现一个闪烁的圣诞树

图1 圣诞树

下面来看下源码,如下所示:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <stdbool.h>
 
#define n 15
char str[] = {'*', ' ', '@', ' ', '#', ' ', '\'',  ' ', '$', ' ', '%', ' ', '&', ' ', '!'};
 
void color(int a)
{
    setconsoletextattribute(getstdhandle(std_output_handle), a);
}
 
void getcoord(double y, double x)
{
    coord pos = { x,y };
    setconsolecursorposition(getstdhandle(std_output_handle), pos);
}
 
void hidecursor()
{
    console_cursor_info cursor= { 1, 0 };
    setconsolecursorinfo(getstdhandle(std_output_handle), &cursor);
}
 
void layer(int x, int y, int num, int col) {
    color(col);
    getcoord(x, y);
    int idx = rand()%n;
    printf("%c", str[idx]);
    for(int k = 1; k <= num; ++k) {
        idx = rand()%n;
        getcoord(x + k - 1, y);
        printf("%c", str[idx]);
        for(int i = 1; i <= (k*2-1)/2; i++) {
            getcoord(x + k - 1, y - i);
            idx = rand()%n;
            printf("%c", str[idx]);
            getcoord(x + k - 1, y + i);
            idx = rand()%n;
            printf("%c", str[idx]);
        }
    }
 
}
 
void triangle(int x, int y, int num, int col) {
    getcoord(x, y);
    color(col);
    printf("*");
 
    for(int i = 1; i <= num; ++i) {
            int x1 = x + i;
            int y1 = y - i;
        for(int j = 0; j < i * 2 + 1; ++j) {
            getcoord(x1, y1 + j);
            printf("*"); 
        }
    }
}
 
void triangleright(double x, double y, double num, double col) {
    getcoord(x, y*2);
    color(col);
    printf("*");
 
    for(int i = 1; i <= num; ++i) {
            double x1 = x - i;
            double y1 = y - i;
        for(int j = 0; j < i * 2 + 1; ++j) {
            getcoord(x1 + j, y1 * 2);
            printf("*"); 
        }
    }
}
 
void triangleleft(double x, double y, double num, double col) {
    getcoord(x, y*2);
    color(col);
    printf("*");
    for(int i = 1; i <= num; ++i) {
            double x1 = x - i;
            double y1 = y + i;
        for(int j = 0; j < i * 2 + 1; ++j) {
            getcoord(x1 + j, y1 * 2);
            printf("*"); 
        }
    }
}
 
void rectangle(int x, int y, int h, int w, int col1, int col2) {
    color(col1);
    for(int i = 0; i <= h; ++i) {
        for(int j = 0; j <= w/2; ++j) {
            getcoord(x + i, y - j);
            if(i % 3 || j % 2)
                printf("*");
            else {
                color(col2);
                printf("!");
                color(col1);
            }
                
            getcoord(x + i, y + j);
            if(i % 3 || j % 2)
                printf("*");
            else {
                color(col2);
                printf("!");
                color(col1);
            }
            
        }
    }
}
 
int main() {
    hidecursor();
    int coltop = 4;
    int colmid = 4;
    int colend = 13;
    while(true) {
        coltop = coltop == 4 ? 9 : 4;
        triangleleft(5, 27.8, 2, coltop);
        triangleright(5, 27.8, 2, coltop);
        sleep(100);
        layer(5, 55, 10, 2);
        layer(9, 55, 16, 2);
        layer(14, 55, 26, 2);
        colmid = colmid == 4 ? 5 : 4;
        triangle(11, 55, 3, colmid);
        triangle(19, 60, 3, colmid);
        triangle(29, 42, 3, colmid);
        triangle(31, 57, 3, colmid);
        colend = colend == 13 ? 1 : 13;
        rectangle(40, 55, 15, 18, 6, colend);
        sleep(200);
    }
    return 0;
}

上面便是圣诞树的简单实现,下面来说下原理:

函数 layer 画出树的层次,根据坐标来输出位置;

void layer(int x, int y, int num, int col) 

函数 triangle 画出小三角形,作为点缀;

void triangle(int x, int y, int num, int col)

函数 triangleright 和 triangleleft 画出圣诞树顶部的蝴蝶结;

void triangleright(double x, double y, double num, double col);
void triangleleft(double x, double y, double num, double col);

函数 hidecursor 负责隐藏光标;

void hidecursor()

函数 getcoord 负责确定输出字符的位置;

void getcoord(double y, double x)

函数 color 负责设置输出的颜色;

void color(int a)

主函数的原理如下:

void color(int a)

主函数通过一个 while 循环,不断刷新圣诞树和圣诞树点缀的颜色。