我在C++中编写了一个基本的蛇游戏作为控制台应用程序。它基于二维数组“瓦”结构。我的问题是:当按下按钮改变方向时,蛇正在运行,它不会灵活运行,而是等待下一个“滴答”。管理游戏本身的功能如下:控件在蛇中没有正确响应
void board::play()
{
display();
while(1)
{
getInput();
delay(0.5);
getInput();
resetCursor();
tick();
display();
}
}
display()
是不言自明,在控制台窗口中显示整个董事会。
delay()
为好,它的功能,得到的秒数为float和出发 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,记住头是哪里,并在指定的方向旁边的字段中产生一个新的头。它看起来像这样:
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时,它还有一个向上移动,只有在向左移动之后。
我忘了把它剪掉,以前我把它放在了错误的地方,导致它延迟了1步,认为它应该在'delay'函数之后并且添加第二个移动。但有了这个额外的投入似乎并没有影响它,问题必须放在其他地方。 – Pegaz