Steg 6: game over
Foreløpig krasjer spillet dersom slangen går utenfor brettet. Slangen er også i stand til å krysse seg selv. Vi vil at begge disse hendelsene fører oss inn i en game over -tilstand.
-
Opprett en variabel
app.state
i modellen, og initialiser variabelen til strengen"active"
. Inkluder variabelen i debug-utskriften i redraw_all. -
Opprett en funksjon
is_legal_move(pos, board)
som returnererTrue
dersom både posisjonenpos
er innenfor brettets rammer og det også er lovlig for slangehodet å flytte seg til denne posisjonen uten at den krasjer med seg selv (det er ikke nødvendig å sjekke at posisjonen faktisk er ved siden av slangehodet). En posisjon er en tuple med to verdier (rad og kolonne).
print("Tester is_legal_move...", end="")
board = [
[0, 3, 4],
[0, 2, 5],
[0, 1, 0],
[-1, 0, 0],
]
assert(is_legal_move((2, 2), board))
assert(not is_legal_move((1, 3), board)) # Utenfor brettet
assert(not is_legal_move((1, 1), board)) # Krasjer med seg selv
assert(not is_legal_move((0, 2), board)) # Krasjer med seg selv
assert(is_legal_move((0, 0), board))
assert(is_legal_move((3, 0), board)) # Eplets posisjon er lovlig
assert(is_legal_move((3, 2), board))
assert(not is_legal_move((-1, 0), board)) # Utenfor brettet
assert(not is_legal_move((0, -1), board)) # Utenfor brettet
assert(not is_legal_move((3, -1), board)) # Utenfor brettet
assert(not is_legal_move((3, 3), board)) # Utenfor brettet
assert(not is_legal_move((4, 2), board)) # Utenfor brettet
print("OK")
- Endre
move_snake
-funksjonen. Umiddelbart etter at slangehodets nye posisjon er regnet ut men før brettet oppdateres eller slangen vokser, sjekk om slangehodets nye posisjon er lovlig ved å gjøre et kall til is_legal_move.- Hvis den nye posisjonen ikke er lovlig (returverdien fra funksjonskallet er false), endre
app.state
til"gameover"
. Ikke gjør noe mer i move_snake-funksjonen om dette skjer (du kan avbryte resten av funskjonskallet ved å bruke enreturn
-setning).
- Hvis den nye posisjonen ikke er lovlig (returverdien fra funksjonskallet er false), endre
I key_pressed
, endre oppførselen slik at:
- hvis
app.state
er lik"active"
, fungerer tastetrykkene som før, men - hvis
app.state
er lik"gameover"
, har tastetrykk ingen betydning (bortsett frad
for debug-modus, som skal virke uansett).
I redraw_all
, endre oppførselen slik at:
- hvis
app.state
er lik"active"
, tegnes brettet som før, men - hvis
app.state
er lik"gameover"
, skrives det kun ut"Game Over"
midt på lerretet.
Guide til snake av Torstein Strømme er lisensiert under CC-NC-SA 4.0.