C/C++爱心①

写在前面
C语言绘制爱心图形与文字艺术的完整代码。
系列文章
| 序号 | 直达链接 |
|---|---|
| 1 | C/C++李峋同款跳动的爱心 |
| 2 | C/C++跳动的爱心 |
| 3 | C/C++经典爱心 |
| 4 | C/C++满屏飘字 |
| 5 | C/C++大雪纷飞 |
| 6 | C/C++黑客帝国字母雨 |
| 7 | C/C++樱花树 |
| 8 | C/C++奥特曼 |
| 9 | C/C++精美圣诞树 |
| 10 | C/C++俄罗斯方块小游戏 |
| 11 | C/C++贪吃蛇小游戏 |
| 12 | C/C++孤单又灿烂的神 |
| 13 | C/C++闪烁的爱心 |
| 14 | C/C++哆啦A梦 |
| 15 | C/C++简单圣诞树 |
| 16 | C/C++小宇宙 |
| 17 | C/C++冰墩墩 |
| 18 | C/C++七彩花朵 |
| 19 | C/C++玫瑰花 |
| 20 | C/C++小猪佩奇 |
| 21 | C/C++简易爱心 |
| 22 | C/C++流星雨① |
| 23 | C/C++2048小游戏 |
| 24 | C/C++爱心圣诞树 |
| 25 | C/C++文字跑马灯 |
| 26 | C/C++教师工作量管理系统 |
| 27 | C/C++满天繁星 |
| 28 | C/C++漂浮爱心 |
| 29 | C/C++五子棋小游戏 |
| 30 | C/C++球球大作战小游戏 |
| 31 | C/C++走迷宫小游戏 |
| 32 | C/C++粉色爱心 |
| 33 | C/C++棕色小熊 |
| 34 | C/C++粉色动态爱心 |
| 35 | C/C++炫酷烟花① |
| 36 | C/C++炫酷烟花② |
| 37 | C/C++炫酷烟花③ |
| 38 | C/C++炫酷烟花④ |
| 39 | C/C++星空漩涡 |
| 40 | C/C++流星雨② |
| 敬请期待…… | |
技术需求
- 控制台图形绘制核心功能
- 坐标定位:通过
gotoxy函数精确控制字符在控制台的输出位置,实现二维图形的空间布局,突破传统文本输出的线性限制。 - 颜色控制:调用
SetColor函数设置控制台文本颜色,利用system("color 0c")预设背景与前景色,增强视觉表现力。 - 窗口居中:获取屏幕与控制台窗口尺寸,计算并调用
SetWindowPos将程序窗口居中显示,提升用户体验。
- 图形算法与数学建模
- 爱心函数绘制:基于隐函数
a*a*a-x1*x1*y1*y1*y1<0构建心形曲线,通过双重循环遍历坐标点,以星号*拼接出平滑的爱心轮廓。 - 字符画映射:预先定义二维字符数组
love,将0/1编码转换为空格与星号,通过循环逐行输出,形成固定图案文字。
- 系统级API调用
- 句柄操作:使用
GetStdHandle获取控制台输出句柄,结合SetConsoleTextAttribute实现颜色动态切换。 - 窗口控制:调用
GetConsoleWindow获取窗口句柄,配合GetSystemMetrics与GetWindowRect实现分辨率适配与窗口定位。
- 流程控制与延时机制
- 动态绘制:在爱心函数循环中嵌入
Sleep(150),逐行停顿输出,模拟动态绘制过程,增强视觉冲击力。 - 分步展示:通过分离的循环结构,依次绘制函数图形与字符画,实现内容的层次化呈现。
- 字符编码与输出优化
- 条件输出:利用三元运算符判断数学条件,智能选择输出字符,保证图形边缘的平滑过渡。
- 格式控制:通过多次输出换行符
\n,调整画面留白,使最终画面居中且美观。
- 数据结构设计
- 二维数组映射:将预设图案编码为0/1二维数组,每个元素对应控制台一个字符位置,实现图形到代码的精准转换。
- 变量作用域管理:合理规划循环变量与坐标参数的作用域,避免内存冲突,确保程序稳定运行。
主要代码
创作不易,订阅后可查看完整代码
- 《Python趣味编程》
- 《C/C++趣味编程》
- 《HTML趣味编程》
- 《Java趣味编程》
#include<stdio.h>
#include<Windows.h>//写字
char love[20][43] = {"111111111111111111111111111111111111111111","111111111111110000111111100001000111111111","110000000000000000011111100011000111111111","110000111001110001111111000110001111111111","111100010000110000111111100011000000000011","111100001000100011111110000100011111100011","100000000000000000001110000100011111000111","100000000000000000011100000000110001000111","100011100011111000110000000000110001111111","111011100011111100111111000111110001111111","111000000000000000111111000110000000001111","111111000111111111111111000110000000000111","111110001111111111111111000100010001000111","111000000000000001111111000000010001100011","111000000011000011111111000000110001100001","110001110000000111111111000001110001110111","100011111000011111111111000111110001111111","111110000000000000011111000111000001111111","111000000111110000011111000111000011111111","111111111111111111111111111111111111111111"
};
……
创作流程
我设计这段代码时,心中怀着一种浪漫的冲动,想在枯燥的控制台里开出一朵花来。我希望用最原始的字符,构建出最温柔的形状——一颗跳动的心。整个创作过程,像是一场与数学和艺术的对话,我试图在有限的屏幕空间里,表达无限的情感。
一开始,我选择用数学函数来绘制爱心。这个隐函数a*a*a-x1*x1*y1*y1*y1<0是我在网上找到的经典心形方程,它能用最简洁的表达勾勒出爱的轮廓。我决定用星号*来填充满足条件的点,而用空格填充其余区域。为了增强视觉效果,我在每一行输出后加入Sleep(150)延时,让爱心像是慢慢浮现出来,带着一种仪式感。
接下来,我想要在爱心下方添加一句情话。单纯的函数图形虽然美,但缺少人文温度。我构思了一句诗:“与君初相识,犹如故人归。天涯明月新,朝暮最相思”,希望用文字为图形注入灵魂。为了让文字居中且美观,我特意计算了控制台窗口的位置,将其居中显示在屏幕中央,这需要调用Windows API获取屏幕分辨率与窗口尺寸。
最难的部分是设计那句“I LOVE YOU”的字符画。我将每个字母拆解为像素点,用二维数组love将图案编码为0/1矩阵。1代表背景空格,0代表要显示的星号。这个过程极其考验耐心,我需要在纸上画出每个字母,再逐点转换为数字。为了让字符画与爱心图形风格统一,我选择了相同的星号作为显示字符,并用红色高亮显示,与控制台背景形成鲜明对比。
在颜色设计上,我选用了深红作为前景色,这与爱心的主题完美契合。通过system("color 0c")设置整体配色方案,再用自定义的SetColor函数在特定位置切换颜色,使文字部分更加突出。为了让整个画面协调,我在最后添加了多个换行符,确保图案居中显示,不会紧贴控制台边缘。
整个程序的执行流程被我精心编排:先是开场诗句,然后是动态绘制的爱心,最后是静态的“I LOVE YOU”字符画。这种层次递进的展示方式,像是讲述一个故事,从文字的铺垫,到图形的惊艳,再到情感的升华。我希望每一个看到这段代码运行结果的人,都能感受到其中蕴含的温度,哪怕它只是由最简单的字符组成。
这不仅仅是一段代码,更是一封用程序语言写就的情书。在这个数字化的世界里,我用最朴素的方式,表达了最真挚的情感。
写在后面
我是一只有趣的兔子,感谢你的喜欢!
