控件在蛇中没有正确响应

时间:2016-07-28 16:17:31

标签: c++ oop console-application

我正在用c ++编写一个基本的蛇游戏作为控制台应用程序。它基于二维“瓦片”结构阵列。我的问题是:当按下按钮改变蛇的方向它不会立即工作,而是等待下一个“滴答”。管理游戏本身的功能如下:

void board::play()
{
    display();
    while(1)
    {
        getInput();
        delay(0.5);
        getInput();
        resetCursor();
        tick();
        display();
    }
}

display()非常明显,在控制台窗口中显示整个板。

delay(),它的功能是以浮点数的形式获得秒数并在继续之前等待这么长时间 getInput()看起来像这样:

void board::getInput()
{
int input;
if(kbhit())
    {
        input=getch();
        if(input==KEY_LEFT)
            turnLeft();
        if(input==KEY_RIGHT)
            turnRight();
        if(input==KEY_UP)
            turnUp();
        if(input==KEY_DOWN)
            turnDown();
    }
}

resetCursor()将光标设置为0,0坐标,因此每次电路板将自行写入而不是另一个电路板

现在对于游戏本身:类board包含字段int direction。瓷砖本身包含一个计数器,每次移动时计数器减1,当达到0时,瓷砖变空。如果计数器等于蛇的长度,则该块被认为是头部。 tick()函数就是这样:将所有计数器减1,记住head的位置,并在指定方向的前一个字段旁边生成一个新头。它看起来像这样:

void board::tick()
{
int posx, posy;
for(int i=0; i<boardSize; i++)
{
    for(int j=0; j<boardSize; j++)
    {
        if(tab[i][j].getCounter()==lenght)
        {
            posx=i;
            posy=j;
        }
        tab[i][j].tick();
    }
}
switch(direction)
{
    case UP:    tab[posx-1][posy].addSnake(lenght);
                break;
    case DOWN:  tab[posx+1][posy].addSnake(lenght);
                break;
    case LEFT:  tab[posx][posy-1].addSnake(lenght);
                break;
    case RIGHT: tab[posx][posy+1].addSnake(lenght);
                break;

    }
}

如前所述,问题是,在按下相关按钮后,游戏在改变方向之前等待一个“滴答”。当从UP转到LEFT时,它会向上移动一次,然后才向左移动。

2 个答案:

答案 0 :(得分:1)

在我看来,你有一个额外的getInput()调用。这可能是问题吗?

  while(1)
    {
        getInput(); // <--
        delay(0.5);
        getInput(); // <--
        resetCursor();
        tick();
        display();
    }

答案 1 :(得分:0)

解决。

事实证明,放入缓冲区的内容太多了,因为如果你在等待时间内随机控制控件,程序就会开始变得疯狂。我通过替换

解决了这个问题
if(kbhit())
{
    input=getch();
    //reactions
}

while(kbhit())
{
    input=getch();
}
//reactions

它现在检查缓冲区中的每个信号并仅对最后一个信号作出反应,因此消除了延迟。