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

キーボードの「特別な」キーの多く (上、下、左、右、ホーム、終了、ファンクション キーなど) は、実際にはキーボード コントローラーから 2 つのスキャン コードを CPU に返します。「標準」キーはすべて 1 を返します。したがって、特殊キーをチェックしたい場合は、 getch() を 2 回呼び出す必要があります。

たとえば、上矢印は最初に 224、次に 72 です。

于 2012-09-23T15:30:49.333 に答える
0

261KEY_RIGHT(8 進数)と一致し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;
}

そうすることで、次の の呼び出しgetchで、ループを終了するキーを返すことができます。

于 2016-05-14T17:04:19.270 に答える