用1000多行C++代码写给2021元旦的祝福-C++像素字实现方法
Made by Mike_Zhang
首先祝各位2021新年快乐, 身体健康, 万事如意.
我在2021元旦发布了一条我制作的给2021元旦的祝福短片, 用C++输出了一些像素字, 内容是 ”元旦快乐 HAPPY NEW YEAR! 2021“
接下来我会简单介绍一下实现的方法, 并且开源我的代码供大家参考.
实现方法
总的来说, 是通过创建二维字符数组, 并修改其中每个字符的显示内容来构成不同的像素字.
二维字符数组:1
char aone[NYR][NYC];
1. 量化字符
首先确定好输出的字符, 其次确定输出背景的大小, 也就是二维字符数组的行数和列数. 需要注意的是, 二维字符数组的每一个字符在输出后的形状是一个长方形, 因此当我们需要一个正方形的背景时, 行数和列数是不一样的. 因此, 我是用的数据是:1
2#define NYR 24 // ROW 行数
#define NYC 47 // COLUMN 列数
接下来, 先输出一个都是下划线(_)的空背景, 并且添加竖线, 划分出每一个像素. 然后写上需要的字, 并且找出被覆盖的格子, 并记下坐标.
例如:
2. 代码实现
使用循环遍历二维字符数组, 通过if判断是否遍历到目标行, 然后可以通过循环遍历同一行中连续被覆盖的列, 并修改它们的字符内容.
以“元”字的3、4行的10-37列举例:1
2
3
4
5
6
7for (i=0;i<NYR;i++){
if (i == 3 || i == 4){
for (m=10; m<=37;m++){
aone[i][m] = 'X';
}
}
}
这样就完成列“元”字的一笔, 其余笔画与字同理.
3. 输出速度控制
为了能够达到一行一行输出的效果, 我在每一行输出时添加了一定的延时(delay). 实现的方法也很简单, 也有一点蠢, 就是通过大循环来延时.
如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#define SPEED 10000
// roll speed control
void deLay(int d){
float p, q;
for (p = 0; p < d; p = p + 0.001){
q = q + 0.01;
}
}
// output part
for (i=0;i<NYR;i++){
for (j=0;j<NYC;j++){
cout << aone[i][j];
}
void deLay(int);
deLay(SPEED);
cout << endl;
}
4. 小结
以上是主要方法, 在具体实现过程中还有很多细节需要注意.
总体来说, 实现的方法并不困难, 但是过程比较复杂, 重复性工作较多, 只是一直在不断的循环. 但不管怎样, 输出效果还是比较好的, 也很有趣. 欢迎大家尝试, 交流以及分享你的方法.
代码分享
请点击以下链接下载
https://github.com/wyuzh/happy_new_year
写在最后
本文介绍了如何用C++代码来写像素字, 之后会继续更新.
最后,再次祝大家新年快乐, 希望大家一起交流,分享,指出问题,谢谢!
原创文章,转载请标明出处
Made by Mike_Zhang

