我是否错误地使用了ncurses库中的getch()函数?

时间:2012-09-23 15:24:05

标签: c++ ncurses

我正在使用ncurses库在c ++中编写一个Pacman游戏,但我无法正确移动Pacman。我已经使用getch()向上,向下,向左和向右移动它,但它只是向右移动,当我按任何其他键时它不会移动到其他地方。

这是一个向上移动的代码片段。我编写了类似的代码,其中一些条件因左,右,下移动而相应改变。

int ch = getch(); 
if (ch == KEY_RIGHT)
{
  int i,row,column;
  //getting position of cursor by getyx function
  for (i=column; i<=last_column; i+=2)
  {
    //time interval of 1 sec

    mvprintw(row,b,"<");   //print < in given (b,row) coordinates

    //time interval of 1 sec

    mvprintw(row,(b+1),"O");  //print "O" next to "<"
    int h = getch();   //to give the option for pressing another key 
    if (h != KEY_RIGHT)  //break current loop if another key is pressed
    {
      break;
    }
  }
}
if (condition)
{
  //code to move left
}

我是否使用了getch()错误,或者我还有其他事情需要做什么?

2 个答案:

答案 0 :(得分:1)

键盘上的许多“特殊”键 - 上,下,左,右,主页,结束,功能键等实际上将两个扫描码从键盘控制器返回到CPU。 “标准”键都返回一个。因此,如果您想检查特殊键,则需要两次调用getch()。

例如,向上箭头首先是224,然后是72。

答案 1 :(得分:0)

261KEY_RIGHT一致(0405中的八进制curses.h)。这告诉我们至少keypad用于允许getch读取特殊键。

显示的片段并未提供有关如何将其合并到程序其余部分的线索。但是,在循环中使用getch可能会引起混淆,因为在退出循环时,该值将被丢弃。如果您希望执行不同的操作(来自KEY_RIGHT),则可以使用ungetch来保存循环中的(否则丢弃的)值,例如,

if (h != KEY_RIGHT)  //break current loop if another key is pressed
{
  ungetch(h);     //added
  break;
}

执行此操作将允许 next 调用getch以返回退出循环的键。