C画心形,跳动不停息;黑白字间,情意相随。


最近看到电视剧心形代码,于是想着我也自己弄一个,于是查找相关资料后,不断尝试,终于弄出来啦。让我们看看怎么实现心形!

心形代码

首先,我们需要一个心形形状,同时可以使用 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值