【问题标题】:Can I get character from keyboard without pausing a program我可以在不暂停程序的情况下从键盘获取字符吗
【发布时间】:2022-01-03 08:56:58
【问题描述】:

我正在做一个小项目来提高我的编码技能,但我遇到了一个问题。我正在做 Flappy Bird 的控制台版本。所以我有一张地图,它是一个二维字符数组,这张地图必须向左移动。我将数组的所有元素向左移动一个位置,然后清除控制台并显示移动的地图。这里有一个问题,地图必须不断移动,但玩家必须在地图移动时控制一只鸟。我想使用 _getch() 但它暂停了一个程序。一个问题是:我可以在不暂停程序的情况下读取键盘输入吗?我的意思是地图仍然会移动,当我在任何时候按下空格键时,鸟的位置都会改变。我正在使用 Windows 10

【问题讨论】:

  • 标准 C++(或其库)中没有非阻塞键盘输入。要么您必须使用特定于操作系统的功能,要么您必须在单独的线程中运行键盘输入(尽管后者仍然不能完全解决您的问题)。

标签: c++ windows


【解决方案1】:

即使初学者希望它是一个简单的操作,从键盘输入单个字符也不是,因为在当前的操作系统中,键盘默认是面向行的。

并且偷看键盘(不暂停程序)更加困难。在 Windows 控制台应用程序中,您可以尝试使用来自 user32 的函数,例如 GetAsyncKeyState,如果您只需要读取几个可能的键:您将知道该键当前是否被按下,以及自上次调用 @ 后是否被按下987654322@.

但请注意:这些是相当高级的系统调用,如果您想提高编码技能,我强烈建议您不要这样做。恕我直言,您最好先学习如何编写 Windows GUI 应用程序,因为您将获得一个事件循环,并且查看事件更为常见,并且可以在现实世界的应用程序中使用。虽然我从未见过 现实世界 控制台应用程序试图偷看键盘。警告购买者...

【讨论】:

    【解决方案2】:

    包括 conio.h 你可以使用这个方法:

    #define ARROW_UP     72
    #define ARROW_DOWN   80
    #define ARROW_LEFT   75
    #define ARROW_RIGHT  77
    
    int main(){
    
        int key;
    
        while( true ){
            if( _kbhit() ){     // If key is typed
                key = _getch(); // Key variable get the ASCII code from _getch()
       
                switch( key ){
    
                    case ARROW_UP:
                        //code her...
                        break;
                    case ARROW_DOWN:
                        //code her...
                        break;
                    case ARROW_LEFT:
                        //code her...
                        break;
                    case ARROW_RIGHT:
                        //code her...
                        break;
                    default:
                        //code her...
                        break;
    
                }
            }
        }
      
        return 0;
    }
    

    上面的代码是一个示例,您可以对键盘的任何键执行此操作。在此站点中,您可以找到密钥的 ASCII 码:

    如果对你有帮助,请告诉我!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 2011-11-20
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      相关资源
      最近更新 更多