Merry Christmas!一起用C语言绘制一个动态的圣诞树吧
C语言 一个 动态 绘制 一起 圣诞树
2023-09-14 09:13:09 时间
一起用C语言绘制一个动态的圣诞树吧
下面就是演示效果
动态圣诞树视频
一、实现步骤
我们利用ANSI Escape Sequences实现文字和背景颜色的绘制,之后使用系统命令定时刷新窗口并重新绘制圣诞树,以实现动态效果。相关函数如下所示:
- clrscr():用于清理窗口;
- printRandLeaf():随机化树叶的形状;
- triangle():绘制圣诞树的每一层;
- printTree():调用triangle()完成整个树冠的绘制;
- printLog():完成整个树杆的绘制;
几个关键宏含义如下:
- RefRate:圣诞树的刷新频率,越小刷新越快;
- randomness:控制树叶中‘ * ’的密度,越大密度越高;
- WIDTH_FACTOR:控制圣诞树在窗口中的位置,最小值为2。值越大越往右边偏移;
二、编码实现
// 此C程序用于生成一棵圣诞树
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#define RefRate 40000
#define randomness 5 // 越高树叶越少
#define WIDTH_FACTOR 4
void clrscr()
{
system("@cls||clear");
}
void printRandLeaf()
{
char leaftypes[5] = { '.', '*', '+', 'o', 'O' };
int temp = rand() % randomness;
// Giving preference to *
if (temp == 1){
int other = rand() % 5;
if(other == 3)
printf("\x1b[38;5;160m%c \x1b[0m", leaftypes[other]);
else if(other == 2)
printf("\x1b[38;5;226m%c \x1b[0m", leaftypes[other]);
else
printf("%c ", leaftypes[other]);
}else
printf("\x1b[32m%c \x1b[0m", leaftypes[1]);
}
void triangle(int f, int n, int toth)
{
int i, j, k = WIDTH_FACTOR * toth - 2;
for (i = 0; i < f - 1; i++)
k--;
// number of rows
for (i = f - 1; i < n; i++) {
// space handler
for (j = 0; j < k; j++)
printf(" ");
// decrementing k after each loop
k = k - 1;
// number of columns, printing stars
for (j = 0; j <= i; j++)
printRandLeaf();
printf("\n");
}
}
// Prints multiple triangles
void printTree(int h)
{
int start = 1, stop = 0, diff = 3;
while (stop < h + 1) {
stop = start + diff;
triangle(start, stop, h);
diff++;
start = stop - 2;
}
}
// Prints bottom part.
void printLog(int n)
{
int i, j, k = WIDTH_FACTOR * n - 4;
for (i = 1; i <= 6; i++) {
// space handler
for (j = 0; j < k; j++)
printf(" ");
for (j = 1; j <= 6; j++)
printf("\x1b[38;5;58m#\x1b[0m");
printf("\n");
}
}
// Driver code
int main()
{
srand(time(NULL));
int ht = 9;
printf("\n*********MERRY CHRISTMAS*********\n\n");
// refresh loop
while (1) {
clrscr();
printf("\n\n\n");
printTree(ht);
printLog(ht);
usleep(RefRate);
}
return 0;
}
相关文章
- C语言:如何给全局变量起一个别名?
- 浙大版《C语言程序设计(第3版)》题目集 71~80
- C语言 一个字符常量占几个字节
- C语言中volatile关键字的使用
- C语言 | 编写一个简单的定时关机程序「建议收藏」
- C语言之一个有趣的关机程序「建议收藏」
- ACM 省赛E题 最长的递增子序列(动态规划+最长递增子序列)--------C语言—菜鸟级
- C语言编写一个程序,输入10个整数,统计并输出其中正数,负数和零的个数。
- 八路抢答器一个数码管C语言,八路抢答器设计 – 八路抢答器电路设计方案汇总(五款模拟电路设计原理及工作原理详细)…「建议收藏」
- C语言 爱心代码_用c语言编辑一个爱心
- 俄罗斯方块c语言源代码_俄罗斯方块C语言
- 一个c语言程序能实现几种算法_C语言实现算法
- 【C语言进阶】使用memcpy你需要注意的一个问题
- [C语言]字符串函数与内存函数
- C语言水仙花数(详解版)
- C语言isalpha()函数:判断一个字符是否是字母
- Linux与C语言:一个强大的组合(linux与c语言)
- MySQL数据表行数快速查询的C语言实现(c mysql数据表行数)
- C语言与MySQL轻松无痛免安装(c mysql 免安装)
- 使用C语言连接Oracle数据库一个实践案例(c语言对接oracle)
- 浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别