Entwicklung eines eigenen Spiels
Um die Snake zu steuern, müssen wir in unserer Hauptschleife den Zustand der Taster abfragen. Diese Abfrage soll
kontinuierlich passieren, also müssen wir sie außerhalb der if game_step:-Anweisung platzieren. Ist der
rechte Taster betätigt, wird die direction-Variable um 1 erhöht, beim linken Taster um 1 verringert. Dabei wird
zusätzlich sichergestellt, dass das Intervall von 0 bis 3 nicht verlassen wird.
if pgb.button_left():
direction = (direction + 1) % 4
elif pgb.button_right():
direction = (direction + (4-1)) % 4
Beim Testen fällt auf, dass die Steuerung so sehr schwierig zu bedienen ist. Da die Abfrage sehr schnell immer wieder durchgeführt wird, ist es fast unmöglich, die Taster nur für einen Durchlauf zu betätigen. So wechselt die Snake bei jedem Tastendruck mehrfach die Richtung. Wir wollen also erreichen, dass die Richtung einmal bei Betätigung des Tasters geändert wird und dann erst wieder, wenn der Taster zwischendurch losgelassen wird. Dazu definieren wir zwei neue Variablen, in denen der Zustand der Taster im letzten Durchlauf gespeichert wird. Nur wenn der Taster betätigt ist und in der letzten Durchlauf nicht betätigt war, wird die Richtung geändert.
button_right = pgb.button_right()
button_left = pgb.button_left()
if button_right and not button_right_previous:
direction = (direction + 1) % 4 # Rollover über Modulo
button_right_previous = button_right
if button_left and not button_left_previous:
# statt einmal nach links wird dreimal nach rechts abgebogen → Rollover mit Modulo funktioniert auch hier
direction = (direction + (4 - 1)) % 4
button_left_previous = button_left
Durch diese Änderung wird die Snake sehr viel einfacher zu steuern. Bei schnellem Betätigen der Taster ist es allerdings noch möglich, mehrfach pro Spieliteration die Richtung zu ändern, sodass die Snake auf der Stelle umkehrt und so direkt mit sich selbst kollidiert. Um dies zu verhindern, wird noch eine Abfragevariable eingebaut, in der gespeichert wird, ob während der aktuellen Iteration schon die Richtung geändert wurde. Diese Abfragevariable wird in jeder Spieliteration einmal wieder zurückgesetzt.
if not button_pressed: # nur ein Richtungswechsel pro Iteration ist möglich
button_right = pgb.button_right()
button_left = pgb.button_left()
if button_right and not button_right_previous:
direction = (direction + 1) % 4 # Rollover über Modulo
button_pressed = True
button_right_previous = button_right
if button_left and not button_left_previous:
# statt einmal nach links wird dreimal nach rechts abgebogen → Rollover mit Modulo funktioniert auch hier
direction = (direction + (4 - 1)) % 4
button_pressed = True
button_left_previous = button_left
Nun muss noch die Interaktion der Snake mit sich selbst und dem Futter implementiert werden.