#include <stdio.h>
#include <windows.h>
#include <conio.h>  // 用于键盘检测

// 颜色常量
#define COLOR_RED    12  // 红色
#define COLOR_PINK   13  // 粉色
#define COLOR_YELLOW 14  // 黄色
#define COLOR_DEFAULT 7  // 默认颜色

// 全局变量:爱心位置和颜色
int heartX = 10;   // 爱心横坐标(初始值)
int heartY = 5;    // 爱心纵坐标(初始值)
int heartColor = COLOR_RED;  // 初始颜色

// 设置控制台字体颜色
void setColor(int color) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, color);
}

// 清屏(避免画面闪烁)
void clearScreen() {
    // 方式1:快速清屏(推荐)
    COORD coord = {0, 0};
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    DWORD count = csbi.dwSize.X * csbi.dwSize.Y;
    DWORD written;
    FillConsoleOutputCharacter(hConsole, ' ', count, coord, &written);
    FillConsoleOutputAttribute(hConsole, csbi.wAttributes, count, coord, &written);
    SetConsoleCursorPosition(hConsole, coord);
}

// 设置光标位置(用于定位绘制爱心)
void setCursorPos(int x, int y) {
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

// 绘制小型爱心(固定大小,方便移动)
void drawSmallHeart() {
    setColor(heartColor);
    // 爱心的字符排版(5行)
    printf("  ■■■  ");
    setCursorPos(heartX, heartY + 1);
    printf(" ■■■■■ ");
    setCursorPos(heartX, heartY + 2);
    printf("■■■■■■■");
    setCursorPos(heartX, heartY + 3);
    printf(" ■■■■■ ");
    setCursorPos(heartX, heartY + 4);
    printf("  ■■■  ");
    // 恢复默认颜色
    setColor(COLOR_DEFAULT);
}

// 显示操作提示
void showTips() {
    setCursorPos(0, 0);  // 提示放在左上角
    printf("===== 键盘互动爱心 =====\n");
    printf("方向键:控制爱心移动\n");
    printf("空格键:切换爱心颜色\n");
    printf("ESC键:退出程序\n");
    printf("当前位置:X=%d, Y=%d\n", heartX, heartY);
}

int main() {
    // 设置控制台窗口大小(避免显示不全)
    system("mode con cols=80 lines=30");
    SetConsoleTitle("键盘互动爱心程序");

    // 主循环(持续检测键盘+刷新画面)
    while (1) {
        // 1. 清屏
        clearScreen();

        // 2. 显示操作提示
        showTips();

        // 3. 绘制爱心(在当前坐标)
        setCursorPos(heartX, heartY);
        drawSmallHeart();

        // 4. 检测键盘按键(非阻塞式,无需回车)
        // 检测方向键
        if (GetAsyncKeyState(VK_LEFT) & 0x8000) {  // 左方向键
            if (heartX > 0) heartX--;  // 限制左边界
            Sleep(20);  // 延迟,避免移动过快
        }
        if (GetAsyncKeyState(VK_RIGHT) & 0x8000) {  // 右方向键
            if (heartX < 60) heartX++;  // 限制右边界
            Sleep(20);
        }
        if (GetAsyncKeyState(VK_UP) & 0x8000) {  // 上方向键
            if (heartY > 8) heartY--;  // 限制上边界(避开提示文字)
            Sleep(20);
        }
        if (GetAsyncKeyState(VK_DOWN) & 0x8000) {  // 下方向键
            if (heartY < 20) heartY++;  // 限制下边界
            Sleep(20);
        }

        // 检测空格键(切换颜色)
        if (GetAsyncKeyState(VK_SPACE) & 0x8000) {
            if (heartColor == COLOR_RED) {
                heartColor = COLOR_PINK;
            } else if (heartColor == COLOR_PINK) {
                heartColor = COLOR_YELLOW;
            } else {
                heartColor = COLOR_RED;
            }
            Sleep(200);  // 防止快速切换
        }

        // 检测ESC键(退出程序)
        if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) {
            clearScreen();
            printf("程序已退出!\n");
            break;
        }

        // 轻微延迟,降低CPU占用
        Sleep(10);
    }

    return 0;
}