最近看到电视剧心形代码,于是想着我也自己弄一个,于是查找相关资料后,不断尝试,终于弄出来啦。让我们看看怎么实现心形!
心形代码
首先,我们需要一个心形形状,同时可以使用 ANSI 颜色代码来增强其外观。下面是一个示例心形代码:
char heart[] = "\033[31m ** **\n"
" ** ** ** **\n"
" ** ** **\n"
" ** **\n"
"** **\n"
"** 兮兮 **\n"
" ** **\n"
" ** **\n"
" ** **\n"
" ** **\n"
" ** **\n"
" **\n\033[0m";
这个代码使用了 ANSI 颜色代码来设置红色文本,并在心形上方添加了一行闪烁的星号。
那什么是ANSI呢?
ANSI 表示美国国家标准协会(American National Standards Institute),它是一个非营利组织,致力于制定各种标准,包括计算机和通信方面的标准。ANSI 转义序列是一种由 ANSI 标准委员会定义的字符序列,用于控制文本终端的显示效果。
在计算机中,文本终端是一种与计算机交互的界面,用户可以通过终端输入命令,计算机则输出相应的结果。ANSI 转义序列最初是为了在终端中控制文本的显示效果而设计的,例如改变文本的颜色、背景色、加粗、下划线等。后来,由于计算机的发展,ANSI 转义序列也被广泛应用于其他领域,例如在编程语言中输出彩色文本、在邮件中添加格式等。
当我们使用 printf()
函数输出文本时,可以使用 ANSI 转义序列来改变文本的颜色、背景色等。其中,\033
是转义序列的起始符号,后面跟着的 [
和参数组成了转义序列的格式。在 ANSI 转义序列中,数字参数用分号 ;
分隔,而字母参数则直接跟在数字参数后面。
下表列出了一些常用的 ANSI 转义序列,以及它们对应的颜色和效果:
序列 | 描述 |
---|---|
\033[30m | 黑色 |
\033[31m | 红色 |
\033[32m | 绿色 |
\033[33m | 黄色 |
\033[34m | 蓝色 |
\033[35m | 紫色 |
\033[36m | 青色 |
\033[37m | 白色 |
\033[40m | 黑色背景 |
\033[41m | 红色背景 |
\033[42m | 绿色背景 |
\033[43m | 黄色背景 |
\033[44m | 蓝色背景 |
\033[45m | 紫色背景 |
\033[46m | 青色背景 |
\033[47m | 白色背景 |
\033[0m | 恢复默认颜色 |
\033[1m | 加粗 |
\033[4m | 下划线 |
\033[5m | 闪烁 |
\033[7m | 反显 |
\033[8m | 隐藏 |
例如,printf("\033[31mHello, world!\033[0m");
将在控制台中输出红色的 “Hello, world!”,然后恢复默认颜色。
需要注意的是,不是所有的控制台都支持 ANSI 转义序列。在 Windows 的默认控制台中,只有一部分转义序列被支持。如果需要在 Windows 中使用更多的 ANSI 转义序列,可以考虑使用其他的终端模拟器,例如 cmder、ConEmu 等。
控制台输出
我们可以使用 printf()
函数在控制台中输出心形。以下是一个示例输出函数:
void printHeart(int x, int y) {
system("cls"); // 清屏
for (int i = 0; i < y; i++)
printf("\n"); // 输出y行空格
printf("%s", heart); // 输出心形
for (int i = 0; i < y; i++)
printf("\n"); // 输出y行空格
}
该函数将屏幕清空,然后在输出心形之前输出一些空行。这将使心形出现在屏幕中央,同时还会留出一些空白区域,使其更加突出。
跳动的效果
为了使心形能够跳动,我们可以使用一个无限循环,在每次循环中移动心形的位置,并重新输出它。以下是一个示例循环:
int x = 40; // 初始位置为屏幕中央
int y = 10;
while (1) // 无限循环
{
printHeart(x, y); // 输出心形
Sleep(200); // 延时0.2秒
x--; // 每次向左移动1个字符位置
if (x < -40)
x = 80; // 如果移出屏幕左侧,重置位置到屏幕右侧
}
该循环在每次迭代中调用 printHeart()
函数来输出心形,然后使用 Sleep()
函数来延迟0.2秒,以使心形看起来跳动起来。每次迭代都将心形向左移动一个字符位置,如果它移出屏幕左侧,则将其重置到屏幕右侧。
增加有趣的功能
我们可以增加一些有趣的功能来使这个程序更加有趣。例如,我们可以使用 GetAsyncKeyState()
函数检测用户是否按下了某个键,并在用户按下键时播放一个声音。以下是一个示例函数:
void playSound() {
Beep(523, 100); // 发出一个频率为523Hz的声音,持续100毫秒
}
该函数使用 Beep()
函数发出一个指定频率和持续时间的声音。我们可以将其与 GetAsyncKeyState()
函数一起使用,以便在用户按下某个键时播放声音。以下是一个示例循环:
while (1) // 无限循环
{
printHeart(x, y); // 输出心形
if (GetAsyncKeyState('A') & 0x8000)
playSound(); // 如果用户按下A键,则播放声音
Sleep(200); // 延时0.2秒
x--; // 每次向左移动1个字符位置
if (x < -40)
x = 80; // 如果移出屏幕左侧,重置位置到屏幕右侧
}
该循环在每次迭代中调用 printHeart()
函数来输出心形,并使用 GetAsyncKeyState()
函数检测用户是否按下了’A’键。如果用户按下了该键,则播放一个声音。然后,使用 Sleep()
函数延迟0.2秒,并将心形向左移动一个字符位置。如果心形移出屏幕左侧,则将其重置到屏幕右侧。
除了播放声音外,我们还可以增加其他有趣的功能,例如更改心形的颜色、在屏幕上添加文本等等。这些功能可以通过修改代码中的 ANSI 颜色代码和 printf()
函数来实现。
总结
在本篇博客中,我们展示了如何使用 C 语言在控制台中输出跳动的心形。我们还介绍了如何增加一些有趣的功能,例如播放声音、更改颜色和添加文本。希望这篇博客能够帮助大家了解如何在控制台中使用 C 语言创建有趣的程序。
效果运行图:
完整代码附上:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>
char heart[] = "\033[31m ** **\n"
" ** ** ** **\n"
" ** ** **\n"
" ** **\n"
"** **\n"
"** 兮兮 **\n"
" ** **\n"
" ** **\n"
" ** **\n"
" ** **\n"
" ** **\n"
" **\n\033[0m";
void printHeart(int x, int y) {
system("cls"); // 清屏
for (int i = 0; i < y; i++)
printf("\n"); // 输出y行空格
printf("%s", heart); // 输出心形
for (int i = 0; i < y; i++)
printf("\n"); // 输出y行空格
}
void playSound() {
Beep(523, 100); // 发出一个频率为523Hz的声音,持续100毫秒
}
int main()
{
int x = 40; // 初始位置为屏幕中央
int y = 10;
while (1) // 无限循环
{
printHeart(x, y); // 输出心形
if (GetAsyncKeyState('A') & 0x8000)
playSound(); // 如果用户按下A键,则播放声音
Sleep(200); // 延时0.2秒
x--; // 每次向左移动1个字符位置
if (x < -40)
x = 80; // 如果移出屏幕左侧,重置位置到屏幕右侧
}
return 0;
}
这是拓展的哦,可自拿
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
void printHeart(int x, int y, int color);
void playSound();
int main() {
int x = 40, y = 10, color = 12;
int dx = 1, dy = 1;
int heartsCount = 10;
int heartsX[10], heartsY[10], heartsDX[10], heartsDY[10], heartsColor[10];
// 初始化随机数生成器
srand(time(NULL));
// 初始化心形数组
for (int i = 0; i < heartsCount; i++) {
heartsX[i] = rand() % 80;
heartsY[i] = rand() % 20;
heartsDX[i] = rand() % 3 - 1;
heartsDY[i] = rand() % 3 - 1;
heartsColor[i] = rand() % 15 + 1;
}
while (1) {
// 输出心形
printHeart(x, y, color);
// 检测用户是否按下了空格键
if (GetAsyncKeyState(VK_SPACE) & 0x8000) {
playSound(); // 播放声音
color = rand() % 15 + 1; // 改变心形颜色
}
// 输出多个随机位置和颜色的心形
for (int i = 0; i < heartsCount; i++) {
printHeart(heartsX[i], heartsY[i], heartsColor[i]);
heartsX[i] += heartsDX[i];
heartsY[i] += heartsDY[i];
// 碰到边界则反弹
if (heartsX[i] < 0 || heartsX[i] > 79) {
heartsDX[i] = -heartsDX[i];
heartsColor[i] = rand() % 15 + 1;
}
if (heartsY[i] < 0 || heartsY[i] > 24) {
heartsDY[i] = -heartsDY[i];
heartsColor[i] = rand() % 15 + 1;
}
}
// 移动心形
x += dx;
y += dy;
// 碰到边界则反弹
if (x < 0 || x > 75) {
dx = -dx;
color = rand() % 15 + 1; // 改变心形颜色
}
if (y < 0 || y > 22) {
dy = -dy;
color = rand() % 15 + 1; // 改变心形颜色
}
// 清空屏幕
system("cls");
// 延时
Sleep(50);
}
return 0;
}
// 输出一个心形
void printHeart(int x, int y, int color) {
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle, color);
printf(" *** ***\n");
printf(" * * * *\n");
printf("* * *\n");
printf("* *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" ***\n");
SetConsoleTextAttribute(handle, 7);
COORD pos = { x, y };
SetConsoleCursorPosition(handle, pos);
}
// 播放声音
void playSound() {
Beep(523, 100);
}