ncurses getch() 跳过每隔一个字符

3
我正在使用ncurses编写俄罗斯方块游戏,并通过getch()获取键盘输入。在完成的游戏中,nodelay()将处于活动状态,但出于测试目的,我已将其注释掉。由于某种原因,我的游戏循环调用的输入函数忽略了每隔一个字符。例如,输入'q'会关闭我的程序。如果我输入一系列的aqaqaqaqaq...,程序将永远不会关闭,因为q没有被注册。以下是初始化我的ncurses代码的函数,以及我的输入函数。

编辑:如果有影响的话,我正在Windows上运行虚拟机中的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;
}

2
你的主循环中有没有意外地调用了两次get_input()的可能性? - iagreen
哈,我感到有些傻。我仔细检查了我的代码,发现了一个我放置在那里用于测试目的的stray getch()。我确信已经将其删除了。 - Reid A
1个回答

2
原来我在程序的另一部分留下了一个多余的getch(),而且我忘记删除它了。这只是我的一个愚蠢错误。

你应该接受自己的答案,这样问题就会被标记为已有被接受的答案。(不过可能需要等待几个小时才能这样做;我忘了。) - R.. GitHub STOP HELPING ICE

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