在你的代码中,问题的关键在于如何使用 _getch() 来获取键盘输入,以及如何在图形窗口中处理和显示更新。下面是一些调整和改进,确保程序可以正常获取键盘输入并在图形窗口中进行更新。
问题分析与改进
初始化图形窗口后获取键盘输入:
_getch() 是一个阻塞函数,它会等待用户输入。- 你需要在图形窗口中实时捕获和处理键盘输入。
不断刷新图形窗口:
- 你需要一个循环来不断刷新图形窗口,以反映对象的位置变化。
清除和重绘图形:
- 在每次移动之后,清除之前的绘图,然后重新绘制对象。
改进后的代码
以下是改进后的代码,它在图形窗口中捕获键盘输入并实时更新对象的位置。
#include <graphics.h>
#include <conio.h>
#include <iostream>
using namespace std;
class People {
int x;
int y;
public:
People(int a, int b) : x(a), y(b) {}
int changex(int a) {
x += a;
return x;
}
int changey(int b) {
y += b;
return y;
}
int getx() { return x; }
int gety() { return y; }
void move(int dx, int dy) {
x += dx;
y += dy;
}
~People() {}
};
int main() {
People p1(50, 50);
initgraph(600, 800);
setbkmode(TRANSPARENT);
while (true) {
// Clear the screen
cleardevice();
// Draw the people
circle(p1.getx(), p1.gety(), 10); // Increased the radius for better visibility
setfillcolor(RED);
floodfill(p1.getx(), p1.gety(), WHITE); // Fill the circle with color
// Check for keyboard input
if (_kbhit()) {
int a = _getch();
switch (a) {
case 75: // Left arrow key
p1.changex(-10);
break;
case 77: // Right arrow key
p1.changex(10);
break;
case 72: // Up arrow key
p1.changey(-10);
break;
case 80: // Down arrow key
p1.changey(10);
break;
case 27: // Esc key
closegraph();
return 0;
}
}
// Delay to control the speed of the loop
Sleep(50);
}
closegraph();
return 0;
}
代码解释
类 People:
- 增加了
changey 方法来改变 y 坐标。 - 增加了
move 方法来同时改变 x 和 y 坐标。
主循环:
- 使用
while (true) 创建一个无限循环,不断刷新图形窗口。 - 在每次循环中,使用
cleardevice() 清除屏幕,然后使用 circle 和 floodfill 重新绘制图形。 - 使用
_kbhit() 检查是否有键盘输入。 - 使用
_getch() 获取键盘输入,并通过 switch 语句处理不同的方向键和 Esc 键。 - 使用
Sleep(50) 控制循环速度,以免更新速度过快。
键盘输入:
75, 77, 72, 80 分别代表左箭头、右箭头、上箭头和下箭头的 ASCII 码。27 代表 Esc 键的 ASCII 码,用于退出程序。
通过这些修改,你的程序应该能够正确地在图形窗口中捕获键盘输入,并实时更新对象的位置。