我在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