#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;
}