Ga naar hoofdinhoud

8. Een database

Gegevens opslaan op je computer is erg handig bij een spel. Je kunt bijvoorbeeld de high score opslaan, maar ook de instellingen van de gebruiker. Speelde de gebruiker het spel de laatste keer op easy of toch op medium?

8.1 Basis: gegevens opslaan en ophalen

Met set_data() en get_data() kun je eenvoudig gegevens opslaan en weer ophalen.

Een simpel voorbeeld

import play

database = play.new_database()

# Sla een getal op
database.set_data('punten', 5)

# Haal het getal weer op
mijn_punten = database.get_data('punten')

tekst = play.new_text(words="Punten: " + str(mijn_punten))

play.start_program()

Wat gebeurt hier?

database = play.new_database()

We maken een nieuwe database aan.

database.set_data('punten', 5)

We slaan het getal 5 op onder de naam 'punten'.

mijn_punten = database.get_data('punten')

We halen de waarde van 'punten' op en stoppen deze in de variabele mijn_punten.

Default waarde

Wat als je een waarde ophaalt die nog niet bestaat? Dan krijg je None terug. Maar je kunt ook een default waarde meegeven:

mijn_punten = database.get_data('punten', 0)

Als 'punten' nog niet in de database staat, krijg je nu 0 terug in plaats van None. Dit is handig bij de eerste keer dat je programma start, wanneer de database nog leeg is!

In dezelfde map als je Python bestand, vind je nu het bestand database.json. Hierin staan de gegevens opgeslagen!

Opdracht 8.1.a: Sla je naam op

Maak een programma dat:

  1. Een database aanmaakt
  2. Je naam opslaat met set_data('naam', 'jouw naam')
  3. Je naam ophaalt met get_data('naam')
  4. Je naam op het scherm toont
Klik hier voor de oplossing
import play

database = play.new_database()

database.set_data('naam', 'Anna')

opgeslagen_naam = database.get_data('naam')

tekst = play.new_text(words="Hallo " + opgeslagen_naam)

play.start_program()

8.2 High score bijhouden

Nu we weten hoe set_data() en get_data() werken, kunnen we een high score systeem maken:

import play

database = play.new_database()

database.set_data('punten', 0)

huidige_highscore = database.get_data('punten')

tekst = play.new_text(words="high score is " + str(huidige_highscore))

@play.when_key_pressed("space")
def update_high_score():
punten = database.get_data('punten')
database.set_data('punten', punten + 1)
tekst.words = "high score is " + str(database.get_data('punten'))

play.start_program()

Elke keer dat je op spatie drukt, wordt de high score met 1 verhoogd en opgeslagen!

8.3 User settings

Naast de high score, kun je natuurlijk ook settings opslaan, bijvoorbeeld:

import play

database = play.new_database()

database.set_data('punten', 0)
database.set_data('moeilijheid', 'makkelijk')
database.set_data('items', dict())

play.start_program()

8.4 Maar kan ik dit niet allemaal zelf?

Zeker! Mocht je Informatica-ACTIEF gebruiken, is er een mooi hoofdstuk over dictionaries waarin je ook leert om deze als JSON op te slaan. Durf je het aan om dit zelf te doen? Hieronder geven we je een voorzet om je op gang te helpen.

  • kopieer dit codefragment en voer de code uit
  • klik op spatie en update de database
  • zoek naar het bestand database.json in dezelfde folder als je Python bestand. Als het goed, zie je elke keer de inhoud van het bestand veranderen iedere keer dat je op spatie klikt.
import play
import os
import json

pad_mijn_db = 'database.json'
mijn_db = None

boven = play.new_text("Klik op spatie om de teller te verhogen",
y=100,
font_size=40)
onder = play.new_text("Dit wordt ook opgeslagen in je database",
y=0,
font_size=40)
daaronder = play.new_text("Aantal kliks:",
y=-100,
font_size=40)
daarweeronder = play.new_text('0',
y=-150,
font_size=40)

@play.when_program_starts
def start():
global mijn_db
# kijk of jouw 'pad_mijn_db' al bestaat
if os.path.exists(pad_mijn_db):
with open(pad_mijn_db, 'r') as infile:
mijn_db = json.load(infile)
mijn_db = {'aantal kliks': 0}

@play.when_key_released('space')
def update_database():
global mijn_db

# update je dictionary
mijn_db['aantal kliks'] += 1
daarweeronder.words = str(mijn_db['aantal kliks'])

# update database.json (dit verandert het bestand op je harde schijf)
with open(pad_mijn_db, 'w') as outfile:
json.dump(mijn_db, outfile)

play.start_program()