Ga naar hoofdinhoud

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.

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)
Spel laden...

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)
  1. Regel 3: De score zelf, buiten elke functie. Dit is de variabele die straks moet blijven bestaan tussen twee toetsaanslagen door.
  2. Regel 4: De tekst op het scherm. str(score) maakt van het getal 0 de tekst "0", want new_text wil tekst.
  3. Regel 6-7: Koppelt de functie eronder aan de spatiebalk. Laat je die los, dan roept play spatie_ingedrukt() aan.
  4. Regel 8: De sleutelregel. Zonder deze regel maakt Python op regel 9 een nieuwe variabele die alleen binnen de functie bestaat; met global gebruikt hij de score van regel 3.
  5. Regel 9: Eén punt erbij.
  6. Regel 10: Zet de nieuwe stand op het scherm. De tekst verandert niet vanzelf mee als score verandert; dat moet je zelf doen.
Spel laden...

Opdracht 4.5.a: Score met twee toetsen​

Maak een programma waarbij:

  1. De score begint op 0
  2. Met spatie gaat de score omhoog
  3. Met r wordt de score teruggezet naar 0
  4. 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)
Spel laden...

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:

  1. Een score begint op 0
  2. Met spatie gaat de score +1
  3. 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()
Spel laden...
Waar kom je dit later weer tegen?