通过整编,都可以直接在C语言的软件运行,不同的源文件会有()注释。
简单圣诞树(.c)
通过简单的for循环嵌套,实现简易的圣诞树效果,代码处有注释,可以自行修改大小
#include
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
#include
#include
#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
#include
#include
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;
}
运行结果