圣诞节来啦!看到很多小伙伴用各种语言画出了圣诞树,于是就想用 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 循环,不断刷新圣诞树和圣诞树点缀的颜色。
需要了解更多c/c++开发分享C语言实现一个闪烁的圣诞树,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/996280.html