泫溯 2024-06-19 16:41 采纳率: 94.7%
浏览 1
已结题

关于#c++#的问题:为什么没办法键盘输入


//#include<easyx.h>
#include <iostream>
#include<graphics.h>
#include<conio.h>
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 getx() { return x; }
    int gety() { return y; }
    void move()
    {
        x++;
        y++;
    }
    ~People(){}
};
int main()
{
    People p1(50,50);
    initgraph(600, 800);
    setbkmode(TRANSPARENT);
    int a = _getch();
    
        p1.changex(-1);
        circle(p1.getx(), p1.gety(), 1);
        setfillcolor(RED);
        
    
        closegraph();
    return 0;
}

用easyx画图,这个代码哪里出现问题了,为什么没办法键盘输入,无法显示图形

  • 写回答

2条回答 默认 最新

  • 邓瑞军说HelloWorld 智能终端待机状态检测方法及装置专利发明者 2024-06-19 16:44
    关注

    在你的代码中,问题的关键在于如何使用 _getch() 来获取键盘输入,以及如何在图形窗口中处理和显示更新。下面是一些调整和改进,确保程序可以正常获取键盘输入并在图形窗口中进行更新。

    问题分析与改进

    1. 初始化图形窗口后获取键盘输入

      • _getch() 是一个阻塞函数,它会等待用户输入。
      • 你需要在图形窗口中实时捕获和处理键盘输入。
    2. 不断刷新图形窗口

      • 你需要一个循环来不断刷新图形窗口,以反映对象的位置变化。
    3. 清除和重绘图形

      • 在每次移动之后,清除之前的绘图,然后重新绘制对象。

    改进后的代码

    以下是改进后的代码,它在图形窗口中捕获键盘输入并实时更新对象的位置。

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

    代码解释

    1. People:

      • 增加了 changey 方法来改变 y 坐标。
      • 增加了 move 方法来同时改变 x 和 y 坐标。
    2. 主循环:

      • 使用 while (true) 创建一个无限循环,不断刷新图形窗口。
      • 在每次循环中,使用 cleardevice() 清除屏幕,然后使用 circlefloodfill 重新绘制图形。
      • 使用 _kbhit() 检查是否有键盘输入。
      • 使用 _getch() 获取键盘输入,并通过 switch 语句处理不同的方向键和 Esc 键。
      • 使用 Sleep(50) 控制循环速度,以免更新速度过快。
    3. 键盘输入:

      • 75, 77, 72, 80 分别代表左箭头、右箭头、上箭头和下箭头的 ASCII 码。
      • 27 代表 Esc 键的 ASCII 码,用于退出程序。

    通过这些修改,你的程序应该能够正确地在图形窗口中捕获键盘输入,并实时更新对象的位置。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月28日
  • 已采纳回答 6月20日
  • 创建了问题 6月19日