圣诞节没什么礼物,来个爱心和彩色圣诞树代码(彩色动态圣诞树可以写喜欢的人名字哦)

通过整编,都可以直接在C语言的软件运行,不同的源文件会有()注释。 

简单圣诞树(.c)

通过简单的for循环嵌套,实现简易的圣诞树效果,代码处有注释,可以自行修改大小

#include <stdio.h>
 
int main(void)
{
    int i, j, x;
    int n = 0;
    // a是间隔填充物,这里用空白填充;b是雪花,这里用*表示;c是圣诞树的填充,用'0'表示 
    char a = ' ', b = '*', c = '0';
    // 第一部分,输出树叶
    for (x = 0; x < 3; x++) {
    	// 想让圣诞树变高可以将4这个值调高 
        for (i = 0; i < x + 4; i++) {
            for (j = 0; j < 80; j++) {
                if ((j <= 25 + n) && (j >= 25 - n)) {
                	printf("%c", c);
				} else if ((j % (n + 6) == n) && ( (j > 25 + n) || (j < 25 - n))) {
					printf("%c", b);
				} else {
					printf("%c", a);
				}  
            }
            printf("\n");
            n = n + 2;
        }
        n = n - 2 * (x + 2);
    }
    // 第二部分,输出树干,高度为5 
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 80; j++) {
            if (j >= 22 && j <= 28) {
            	printf("%c", c);
			} else if ((j % (n + 6) == n) && ((j > 25 + n) || (j < 25 - n))) {
            	printf("%c", b);
			} else {
            	printf("%c", a);
			}   
        }
        n = n + 2;
        printf("\n");
    }
    // 第三部分,输出地面,高度为3 
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 80; j++) {
            if (j % 2 == 0) {
            	printf("%c", b);
			} else {
            	printf("%c", a);
			}
            	
        }
        printf("\n");
    }
    return 0;
}

更加好看的圣诞树 (.c)

通过增加输出元素密度,实现更加细致的圣诞树效果,底层逻辑不变

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define PI 3.14159265359
float sx, sy;
float sdCircle(float px, float py, float r) {
    float dx = px - sx, dy = py - sy;
    return sqrtf(dx * dx + dy * dy) - r;
}

float opUnion(float d1, float d2) {
    return d1 < d2 ? d1 : d2;
}

#define T px + scale * r* cosf(theta), py + scale * r * sin(theta)
int ribbon() {
    float x = (fmodf(sy, 0.1f) / 0.1f - 0.5f) * 0.5f;
    return sx >= x - 0.05f && sx <= x + 0.05f;
}


float f(float px, float py, float theta, float scale, int n) {
    float d = 0.0f;
    for (float r = 0.0f; r < 0.8f; r += 0.02f)
        d = opUnion(d, sdCircle(T, 0.05f * scale * (0.95f - r)));
    if (n > 0)
        for (int t = -1; t <= 1; t += 2) {
            float tt = theta + t * 1.8f;
            float ss = scale * 0.9f;
            for (float r = 0.2f; r < 0.8f; r += 0.1f) {
                d = opUnion(d, f(T, tt, ss * 0.5f, n - 1));
                ss *= 0.8f;
            }
        }

    return d;
}

int main(int argc, char* argv[]) {
    int n = argc > 1 ? atoi(argv[1]) : 3;
    float zoom = argc > 2 ? atof(argv[2]) : 1.0f;
    for (sy = 0.8f; sy > 0.0f; sy -= 0.02f / zoom, putchar('\n'))
        for (sx = -0.35f; sx < 0.35f; sx += 0.01f / zoom) {
            if (f(0, 0, PI * 0.5f, 1.0f, n) < 0.0f) {
                if (sy < 0.1f)
                    putchar('.');
                else {
                    if (ribbon())
                        putchar('=');
                    else
                        putchar("...................................#j&o"[rand() % 32]);

                }
            }
            else
                putchar(' ');

        }
}

运行结果 

 

彩色圣诞树 (.cpp)

通过数组和光标实现漂亮的闪烁圣诞树,底层是通过光标的闪烁实现效果,可以自定义显示文字和大小,代码关键部位有注释,自行理解

#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;

int len;
struct Dot {
    int x;
    int y;
    char c;
}a[10000000];
int vis[10000000];
char c[5] = { 35, 36, 37, 38, 79 };
string s = "/\\";
int n;
string me = "Merry Christmas ^_^ !";//可以自己改名字
string fm = "From Yukisong";//可以自己改名字

void getcur(short int x, short int y)//移动光标函数 
{
    COORD pos = COORD{ x,y };//定义一个屏幕上的座标 
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(handle, pos);;
}

void goprint(int x, int y, char c) {
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), rand() % 16);
    getcur(x, y); printf("%c", c); //getcur(0,row);//消除光标影响 
}

void del(int x, int y)
{
    getcur(x, y); printf(" ");
}

int main() {
    cout << "请输入你喜欢的一个数字(10 - 17),并将窗口最大化:";
    cin >> n;
    cout << endl;
    int Layer = 2 * n - 1;
    int Space = 2 * n - 2;
    for (int i = 1; i <= Layer; ++i) {
        if (i & 1) {
            for (int j = 0; j < 2 * i; j += 2) {
                a[len].x = j + Space + 30, a[len].y = i + 5, a[len++].c = c[rand() % 5];
            }
            Space -= 2;
        }
        else {
            int r = 0;
            for (int j = 0; j < 2 * i; j += 2) {
                a[len].x = j + Space + 31, a[len].y = i + 5, a[len++].c = s[r];
                r = (r + 1) % 2;
            }
        }
    }
    for (int i = 0; i < Layer / 3 + 1; ++i) {
        a[len].x = Layer + 29, a[len].y = i + 6 + Layer, a[len++].c = '|';
        a[len].x = Layer + 30, a[len].y = i + 6 + Layer, a[len++].c = '|';
    }
    for (int i = 0; i < me.length(); ++i) {
        a[len].x = Layer - 1 + i + 30;
        a[len].y = Layer / 3 + 10 + Layer;
        a[len++].c = me[i];
    }
    for (int i = 0; i < fm.length(); ++i) {
        a[len].x = Layer - 1 + i + 30;
        a[len].y = Layer / 3 + 11 + Layer;
        a[len++].c = fm[i];
    }
    while (1) {
        int i = rand() % len;
        if ((a[i].c == '\\' || a[i].c == '/') && vis[i]) {
            continue;
        }
        goprint(a[i].x, a[i].y, a[i].c);
        vis[i] = 1;
    }
}

 

爱心 (.c)

分成三部分,利用for循环实现简单爱心效果,可以和闪烁的圣诞树结合,写一个闪烁的爱心,有兴趣的小伙伴,可以研究一下

int main(void)
{
    int i, j, k, l, m;
    char c = 3; // 黑色爱心符号 
    for (i = 1; i <= 5; i++) {
        printf("\n");
    }
    // 同圣诞树一样,爱心也可以拆成三部分输出
    // 第一部分是心冠部分两座小山堆 
    for (i = 1; i < 4; i++) {
        for (j = 1; j < 27 - i * 2; j++) {
            printf(" ");
        }
        for (k = 1; k <= i * 4 + 1; k++) {
            printf("%c", c);
        }
        for (l = 1; l <= 9 - 4 * (i - 1); l++) {
            printf(" ");
        }
        for (m = 1; m <= i * 4 + 1; m++) {
            printf("%c", c);
        }
        printf("\n");
    }
    // 第二部分是平平无奇的整行输出,撑起中间区域的长度 
    for (i = 1; i < 4; i++) {
        for (j = 1; j < 20; j++) {
            printf(" ");
        }
        for (k = 1; k <= 29; k++) {
            printf("%c", c);
        }
        printf("\n");
    }
    // 最后部分是个倒三角 
    for (i = 1; i < 8; i++) {
        for (j = 1; j < 20 + 2 * i; j++) {
            printf(" ");
        }
        for (k = 1; k <= 29 - 4 * i; k++) {
            printf("%c", c);
        }
        printf("\n");
    }

    return 0;
}

运行结果 

 

  • 26
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值