3

ncursesがgetch()でキーボード入力を取得するテトリスゲームを書いています。完成したゲームではnodelay()がアクティブになりますが、テスト目的でコメントアウトしています。何らかの理由で、私のゲームループによって呼び出された入力関数は、1つおきの文字を無視しています。たとえば、「q」を入力すると、プログラムが閉じます。aqaqaqaqaqのシーケンスを入力すると、qが登録されないため、プログラムが閉じることはありません。以下は私のncursesコードである関数であり、その下は私の入力関数です。

編集:重要な場合は、Windowsのvirtualboxで実行されているUbuntuでコードをテストしています。

****INIT FUNCTION****
void init_ui()
{
initscr();
cbreak();
raw();
keypad(stdscr, TRUE);
noecho();
//nodelay(stdscr, TRUE);

start_color();
init_pair(9, COLOR_BLACK, COLOR_RED);
init_pair(2, COLOR_BLACK, COLOR_WHITE);
init_pair(3, COLOR_BLACK, COLOR_CYAN);
init_pair(4, COLOR_BLACK, COLOR_YELLOW);
init_pair(5, COLOR_BLACK, COLOR_MAGENTA);
init_pair(6, COLOR_BLACK, COLOR_BLUE);
init_pair(7, COLOR_BLACK, COLOR_GREEN);
init_pair(8, COLOR_BLACK, COLOR_BLACK);
attron(COLOR_PAIR(6));
for(int i=0; i<HEIGHT; i++)
{
    mvprintw(i, 0, "#%*c", WIDTH*2+1, '#');
}
for(int i=0; i<=WIDTH; i++)
{
    mvprintw(HEIGHT, i*2, "##");
}
attroff(COLOR_PAIR(6));
}

****INPUT FUNCTION****
int get_input()
{
int ch = getch();
int result;
switch(ch)
{
    case KEY_LEFT:
        result = LEFT;
        break;
    case KEY_RIGHT:
        result = RIGHT;
        break;
    case KEY_DOWN:
        result = DOWN;
        break;
    case 'q':
        result = 'q';
        break;
    default:
        result = DOWN;
        break;
}
return result;
}
4

1 に答える 1

2

プログラムの別の部分に getch() を置き忘れていて、それを削除するのを忘れていたことが判明しました。私の愚かな間違いです。

于 2012-12-23T02:38:47.947 に答える