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() 错误,还是我需要做其他事情?

4

2 回答 2

1

键盘上的许多“特殊”键——上、下、左、右、Home、End、Function 键等实际上将两个扫描码从键盘控制器返回给 CPU。“标准”键都返回一个。所以如果你想检查特殊键,你需要调用 getch() 两次。

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

于 2012-09-23T15:30:49.333 回答
0

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

显示的片段没有提供有关它如何被纳入程序其余部分的线索。但是,getch在循环中使用 of 可能会造成混淆,因为在退出循环时该值将被丢弃。如果您希望做一些不同的事情(从KEY_RIGHT),您可以使用ungetch在循环中保存(否则丢弃)值,例如,

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

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

于 2016-05-14T17:04:19.270 回答