4.5 Een score bijhouden met global
Hier bouw je op verder: Jij als variabele, Scope en If en else
Weet je dit niet meer zeker? Lees het terug voordat je verdergaat.
- Python Jij als variabele
- Python Scope
- Python If en else
Hoe houd je een score bij in een spel? Als je een variabele, zoals score, wilt aanpassen binnen een functie, heb je het speciale sleutelwoord global nodig.
Een veelgemaakte fout
Draai het programma en druk een paar keer op de spatiebalk:
import play
score = 0
score_tekst = play.new_text(str(score), y=100, font_size=40)
@play.when_key_released("space")
def spatie_ingedrukt():
score = score + 1
score_tekst.words = str(score)
Druk maar eens op spatie. Als het goed is verandert er niets en zie je het volgende in je console (de eerste regel kan er bij jou anders uitzien):
UnboundLocalError: cannot access local variable 'score' where it is not associated with a value
Python denkt dat score in de functie (bij score = score + 1) een nieuwe variabele is.
Daardoor kent hij de score van buiten de functie (score = 0) niet.
Met global score geef je aan dat de score die buiten de functie is gemaakt, binnen de functie gebruikt en aangepast moet worden.
De oplossing: global
Met global score vertel je Python dat je de variabele van buiten de functie wilt gebruiken:
import play
score = 0
score_tekst = play.new_text(str(score), y=100, font_size=40)
@play.when_key_released("space")
def spatie_ingedrukt():
global score
score = score + 1
score_tekst.words = str(score)
- Regel 3: De score zelf, buiten elke functie. Dit is de variabele die straks moet blijven bestaan tussen twee toetsaanslagen door.
- Regel 4: De tekst op het scherm.
str(score)maakt van het getal 0 de tekst"0", wantnew_textwil tekst. - Regel 6-7: Koppelt de functie eronder aan de spatiebalk. Laat je die los, dan roept play
spatie_ingedrukt()aan. - Regel 8: De sleutelregel. Zonder deze regel maakt Python op regel 9 een nieuwe variabele die alleen binnen de functie bestaat; met
globalgebruikt hij descorevan regel 3. - Regel 9: Eén punt erbij.
- Regel 10: Zet de nieuwe stand op het scherm. De tekst verandert niet vanzelf mee als
scoreverandert; dat moet je zelf doen.
Opdracht 4.5.a: Score met twee toetsen
Maak een programma waarbij:
- De score begint op 0
- Met spatie gaat de score omhoog
- Met
rwordt de score teruggezet naar 0 - De score wordt op het scherm getoond
Klik hier voor een tip.
Twee toetsen betekent twee functies, en allebei hebben ze global score nodig. Bij r hoef je niets op te tellen — daar zet je de score gewoon terug op 0.
Klik hier voor de oplossing.
import play
score = 0
score_tekst = play.new_text(str(score), y=100, font_size=40)
@play.when_key_released("space")
def punt():
global score
score = score + 1
score_tekst.words = str(score)
@play.when_key_released("r")
def reset():
global score
score = 0
score_tekst.words = str(score)
Handige Python-kennis: if-statements
Nu je een score kunt bijhouden, wil je misschien ook iets laten gebeuren op basis van die score. Daarvoor gebruik je een if-statement:
if score == 10:
score_tekst.words = "Je hebt gewonnen!"
Dit checkt of score gelijk is aan 10. Let op de dubbele == (vergelijken) in plaats van een enkele = (toewijzen).
Er gaat iets mis?
Een veelgemaakte fout is het gebruik van = in plaats van ==:
# FOUT - dit geeft een foutmelding
if score = 10:
# GOED - dubbele == voor vergelijken
if score == 10:
De foutmelding die je krijgt bij een enkele = is:
SyntaxError: invalid syntax
Opdracht 4.5.b: Winnen bij 10 punten
Maak een programma waarbij:
- Een score begint op 0
- Met spatie gaat de score +1
- Als de score 10 bereikt, verandert de tekst in 'Je hebt gewonnen.' en stopt het programma
Klik hier voor een tip.
Combineer global, if score == 10: en play.stop_program() in dezelfde functie.
Klik hier voor de oplossing.
import play
score = 0
tekst = play.new_text(words="Score: 0", font_size=40)
@play.when_key_pressed("space")
def punt():
global score
score = score + 1
tekst.words = "Score: " + str(score)
if score == 10:
tekst.words = "Je hebt gewonnen!"
play.stop_program()
- In 6.2 Een high score bijhouden blijft die score bewaard nadat je het spel afsluit.
- In 9.3 Wanneer ga je naar het volgende level? is
globalde manier waarop je level-variabele buiten je functies blijft bestaan.