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.
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