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

3
我正在使用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个回答

1
键盘上的许多“特殊”键 - 上、下、左、右、Home、End、功能键等实际上会返回两个扫描码从键盘控制器返回到CPU。而“标准”键只返回一个。因此,如果您想检查特殊键,您需要调用getch()两次。
例如,向上箭头首先是224,然后是72。

所以我需要存储这两个值并通过if语句检查它们是否等于上箭头。 - User14229754
你检查过getch()的返回值了吗? - meirrav
我做了这个 ch = getch(); ch1 = getch(); if (ch == KEY_RIGHT && ch1 == KEY_RIGHT) //与向左移动代码相同 - User14229754
但是ch和ch1的值是什么? - meirrav
实际上,真正的问题似乎是只有第一个if语句起作用,其他的都没有。 - User14229754

0

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

所示片段并未提供如何将其整合到程序的其他部分的线索。然而,在循环中使用getch可能是混淆的源头,因为在退出循环时该值被丢弃。如果您希望执行不同的操作(从KEY_RIGHT),则可以在循环内使用ungetch来保存(否则会被丢弃的)值,例如:

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

这样做将允许getch下一个调用返回退出循环的键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接