2016-07-28 27 views
1

Ich schreibe ein einfaches Snake-Spiel als Konsolenanwendung in C++. Es basiert auf einer zweidimensionalen Anordnung von "Kachel" -Strukturen. Mein Problem ist: Wenn man die Taste drückt, um die Richtung der Schlange zu ändern, funktioniert sie nicht sofort, sondern wartet auf das nächste "Häkchen". Die Funktion, die Spiel schafft selbst sieht wie folgt aus:Steuerelemente reagieren nicht richtig in Schlange

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

display() ist ziemlich selbsterklärend, zeigt ganze Brett in Konsolenfenster.

delay() als gut, es ist Funktion, die Anzahl der Sekunden als Schwimmer bekommt und so viel Zeit wartet, bevor getInput() verläuft das wie folgt aussieht:

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() der Cursor auf 0,0 Koordinaten setzt jedes Mal so das Board schreibt sich selbst und nicht eins unter anderem

Und nun zum Spiel selbst: Klasse board enthält unter anderem Feld int direction. Die Kacheln selbst enthalten einen Zähler, der bei jeder Bewegung um 1 herunter zählt, und bei Erreichen von 0 wird die Kachel leer. Wenn der Zähler der Länge einer Schlange entspricht, gilt die Kachel als Kopf. Die Funktion tick() macht genau das: verringert alle Zähler um 1, merkt sich wo der Kopf war und erzeugt einen neuen Kopf in dem Feld neben dem vorherigen in der angegebenen Richtung. Es sieht wie folgt aus:

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; 

    } 
} 

Problem ist, wie bereits erwähnt, dass Spiel wartet ein „Tick“ vor Richtung zu ändern, wenn es nach dem Drücken zugeordnet Taste so sofort tun sollten, beispielsweise wenn man von OBEN nach LINKS wechselt, macht man noch eine Bewegung nach oben und erst danach bewegt man sich nach links.

Antwort

0

Gelöst.

Es stellte sich heraus, dass zu viele Dinge in den Puffer gelegt wurden, da das Programm verrückt wurde, wenn Sie die Steuerelemente während der Wartezeit zufällig gemischt haben. Ich löste es durch

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

mit

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

ersetzt Er prüft nun jedes Signal in dem Puffer und reagiert nur auf den letzten, so dass die Verzögerung eliminiert wird.

1

Es scheint mir, dass Sie einen zusätzlichen getInput() -Aufruf haben. Könnte es das Problem sein?

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

Ich habe vergessen, es auszuschneiden, zuvor hatte ich es an der falschen Stelle, die es um weitere 1 verschieben verzögert, dachte, es sollte nach der 'Verzögerung'-Funktion sein und fügte die zweite hinzu. Aber diese eine zusätzliche Eingabe scheint es überhaupt nicht zu beeinflussen, das Problem muss woanders liegen. – Pegaz