如何以实时方式接受键盘输入?

时间:2010-12-08 03:05:01

标签: c++ linux ascii interactive

我目前正在用c ++编写一个程序,它与经典的“蛇”程序非常相似,但有一些变化。我正在编写它以便它将基于ctime每秒更新屏幕五次,如果可以处理则可能更多。我想做的一件事就是让程序在.h文件中有一个变量“currkeypressed”。该变量将保持用户当前按住的键,蛇头将朝那个方向移动。蛇中的每个节点都是一个单独的对象,因此currkeypressed只会影响头部。定向和位置数据将在每次更新时从节点传递到节点。

我的问题是:如何让程序保持这些数据不变,而不是仅在按下按键时或以某个间隔更新cin?我知道我可以在某种for循环中接受箭头键的ascii值,但是如果按住键并且如果循环很长则它可能会错过按下,这似乎不起作用。有人知道怎么做吗?

编辑:我使用的是Linux操作系统,Ubuntu更精确

4 个答案:

答案 0 :(得分:1)

一旦您超越简单的面向行或字符导向输入,您将了解用户输入设备的详细信息。每个操作系统都有一个特定的机制,用于通知程序keydown和keyup等事件。

要获得答案,请为您所在的编程环境添加标签:MSWindows,Linux,Android,MacOS等。

答案 1 :(得分:1)

最简单的方法是使用ncurse库。

然而,如果你更喜欢“原始”linux编程,你可以使用selectgetchar

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
      fd_set readfs;
      struct timeval timeout;
      int res, key;

      while (1) {
         /* .. do something else .. */

         FD_SET(0, &readfs);  /* 0 is STDIN */
         timeout.tv_usec = 10;  /* milliseconds */
         timeout.tv_sec  = 0;  /* seconds */
         res = select(maxfd, &readfs, NULL, NULL, &timeout);
         if (res) {
            /* key pressed */
            key = getchar();
            if (key == 'A')  { /* blar */ }
         }
      }
}

答案 2 :(得分:0)

您可以使用库conio.h,并且可以在循环中使用函数_getch()来获取实时输入而不受任何限制。

#include<conio.h>
#include<iostream>
using namespace std;
int main()
{
    char n='a';//Just for initialization 
    while(n!='e') 
    {
        n=_getch();
    }
    return 0;
}

答案 3 :(得分:-1)

最简单的(虽然真的不那么简单)方法是有一个线程来捕获用户输入,然后要么有某种事件驱动的系统可以提醒蛇的头部或蛇可以轮询当前键。