2016-07-28 10 views
1

私はC++でコンソールアプリケーションとして基本的なスネークゲームを書いています。これは、2次元の「タイル」構造の配列に基づいています。私の問題は、蛇が行く方向を変えるためにボタンを押すとすぐには機能しませんが、代わりに次の "ティック"を待つことです。ゲーム自体を管理機能は、次のようになります。コントロールがスネークで正常に応答しない

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減らし、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に向かうときにはもう一度上に移動し、その後は左に移動します。

答えて

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回移動すると遅れてしまいました。しかし、この1つの追加入力を持つことはまったく影響を与えないように見えますが、問題は別の場所に置かなければなりません。 – Pegaz

関連する問題