2016-07-28 42 views
1

我在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時,它還有一個向上移動,只有在向左移動之後。

回答

0

已解決。

原來有太多東西放入緩衝區,因爲如果在等待時間內隨機調整控件,程序開始瘋狂。我解決了它與

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

現在檢查每一個信號在緩衝區中,反應只有最後一個替換

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

,所以延遲被消除。

1

在我看來,你有一個額外的getInput()調用。這可能是問題嗎?

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

我忘了把它剪掉,以前我把它放在了錯誤的地方,導致它延遲了1步,認爲它應該在'delay'函數之後並且添加第二個移動。但有了這個額外的投入似乎並沒有影響它,問題必須放在其他地方。 – Pegaz