Skip to main content

Snake copy

0 Wat gaan we leren

We gaan nog een projectje maken met Thonny (uit de vorige les) en bij dit project gaan we gebruik maken van de standaard Python library:

pgzero

Weet je nog hoe je een package installeert in Thonny?

Yep, Tools - Manage Packages en dan pgzero zoeken en installeren.

1 Snake – Les 1: Teken de slangkop

In deze les gaan we beginnen met het maken van een eigen versie van Snake in Python met Pygame Zero.

We gaan eerst de kop van de slang tekenen op het scherm. Je ziet dan een vierkantje dat straks kan gaan bewegen.

Wat gaan we doen?

We maken een slangkop als vierkant met een bepaalde positie en grootte, en tekenen die in de draw()-functie.

đŸ“Ļ Benodigdheden

  • Een werkende Python-omgeving met Pygame Zero (zoals Thonny)
  • Geen plaatjes nodig – we tekenen de slang met blokken

🔰 Startercode

# importeer library
import pgzrun

# Spelgrootte
WIDTH = 600
HEIGHT = 400

# Startpositie van de slangkop
snake_x = 100
snake_y = 100
tile_size = 20

def draw():
    screen.clear()
    screen.draw.filled_rect(Rect((snake_x, snake_y), (tile_size, tile_size)), "green")
    
#start programma
pgzrun.go()

â„šī¸ Uitleg

  • WIDTH en HEIGHT: grootte van het spelvenster
  • snake_x en snake_y: positie van de slangkop
  • tile_size: grootte van het blokje
  • screen.draw.filled_rect(...): tekent een gevuld vierkantje op het scherm

đŸ› ī¸ Opdracht

  • Pas de waarde van snake_x en snake_y aan – wat gebeurt er?
  • Maak het vierkant groter of kleiner door tile_size te wijzigen
  • Verander de kleur van het vierkant in bijvoorbeeld "blue" of "orange"

💡 Extra uitdaging

Teken een tweede blokje naast de slangkop alsof er al een stukje staart is. Gebruik nog een screen.draw.filled_rect().

📤 Inleveren

  1. Maak een screenshot van je 'slangkop' op het scherm waarbij je de 'slangkop'op een andere positie hebt gezet.

2 Snake – Les 2: Beweeg de slang

In deze les gaan we de slangkop laten bewegen met de pijltjestoetsen.pijltjestoets die je indrukt.

We gebruiken daarvoor de update()-functie van Pygame Zero en de toetsenbordinput.

Wat gaan we doen?

We maken een richting-variabele en passen de positie van de slang aan op basis van de pijltjes die je indrukt.

🔰 Code

Dit is een deel van de code, je moet jouw bestaande code aanpassen aan de hand van deze nieuwe code.

Je hoeft dus niet alles opnieuw te typen. Plaats de update() functie  en pas eventueel snake_x, snake_y, tile_size en step aan in jouw bestaande code.

# Startpositie van de slangkop
snake_x = 200
snake_y = 200
tile_size = 10
step = 1

def draw():
    screen.clear()
    screen.draw.filled_rect(Rect((snake_x, snake_y), (tile_size, tile_size)), "green")
    
def update():
    global snake_x, snake_y

    if keyboard.left:
        snake_x -= step
    if keyboard.right:
        snake_x += step
    if keyboard.up:
        snake_y -= step
    if keyboard.down:
        snake_y += step  

â„šī¸ Uitleg

  • update() wordt automatisch meerdere keren per seconde uitgevoerd
  • keyboard.left controleert of de linkerpijl is ingedrukt
  • Telkens als je een toets indrukt, verandert de positie van de slang
  • step bepaalt hoe ver de slang per stap beweegt

đŸ› ī¸ Opdracht

  • Beweeg de slang door het scherm met de pijltjes
  • Pas step aan naar een andere waarde – wat merk je?
  • Laat de slang sneller of langzamer bewegen door minder of meer pixels per keer te verplaatsen

💡 Extra uitdaging

Laat de slang automatisch blijven bewegen in de laatst gekozen richting:

  • Gebruik een variabele richting die je bijwerkt met on_key_down()
  • Laat de slang dan elke update in die richting verder bewegen

📤 Inleveren

  1. Leg uit wat de variable step doet.
  2. Welke waarde heb je gekozen, waarom?

(je kunt dit inleveren in het tekst veld of in een .txt. bestandje)

3 Automatische beweging

In deze les gaan we de slang automatisch laten blijven bewegen in de richting van de laatste pijltjestoets die je hebt ingedrukt.

🔍 Wat gaan we doen?

  • We maken een nieuwe variabele richting.
  • Als je op een pijltjestoets drukt, verandert de waarde van richting.
  • In de update() functie verplaatst de slang zich elke keer opnieuw in de gekozen richting – ook als je de toets niet ingedrukt houdt!

🔰 Code

Gebruik deze versie als nieuwe code (je mag dit toevoegen aan of combineren met je bestaande code):

import pgzrun

WIDTH = 600
HEIGHT = 400

snake_x = 200
snake_y = 200
tile_size = 20
step = 10
richting = "right"

def draw():
    screen.clear()
    screen.draw.filled_rect(Rect((snake_x, snake_y), (tile_size, tile_size)), "green")

def update():
    global snake_x, snake_y

    if richting == "left":
        snake_x -= step
    elif richting == "right":
        snake_x += step
    elif richting == "up":
        snake_y -= step
    elif richting == "down":
        snake_y += step

def on_key_down(key):
    global richting

    if key == keys.LEFT:
        richting = "left"
    elif key == keys.RIGHT:
        richting = "right"
    elif key == keys.UP:
        richting = "up"
    elif key == keys.DOWN:
        richting = "down"

pgzrun.go()

â„šī¸ Uitleg

  • richting: deze variabele onthoudt de laatst gekozen richting
  • on_key_down(): dit is een functie die wordt uitgevoerd als je op een toets drukt
  • update(): deze functie verplaatst de slang elke keer in de gekozen richting, ook als je geen toets indrukt

đŸ› ī¸ Opdracht

  • Test of je slang automatisch blijft bewegen nadat je een pijl indrukt
  • Wat gebeurt er als je twee keer snel op een andere richting drukt?
  • Probeer met tile_size en step te spelen voor een ander effect

💡 Extra uitdaging

Voeg grenzen toe aan je spel: laat de slang stoppen of ergens anders naartoe gaan als hij de rand van het scherm raakt.

📤 Inleveren

  1. Leg in je eigen woorden uit wat de functie on_key_down() doet

(Lever dit in via het tekstvak of via een upload.)

4 Randbotsing en automatische richting

In deze les zorgen we ervoor dat de slang niet zomaar het scherm verlaat. Zodra hij een rand raakt, verandert hij automatisch van richting. Zo beweegt hij steeds binnen het scherm!

🔍 Wat gaan we doen?

  • We controleren of de slang de rand van het scherm raakt.
  • Als dat zo is, passen we automatisch de richting aan.

🔰 Code (let op: onvolledig!)

Hieronder zie je de code. EÊn belangrijke regel ontbreekt – die moet jij toevoegen!

import pgzrun

WIDTH = 600
HEIGHT = 400

snake_x = 200
snake_y = 200
tile_size = 20
step = 5
richting = "right"

def draw():
    screen.clear()
    screen.draw.filled_rect(Rect((snake_x, snake_y), (tile_size, tile_size)), "green")

def update():
    global snake_x, snake_y, richting

    if richting == "left":
        snake_x -= step
    elif richting == "right":
        snake_x += step
    elif richting == "...":
        snake_y -= step
    elif richting == "...":
        snake_y += step

    # 🧠 Hier controleren we of de slang de rand raakt
    if snake_x < 0:
        richting = "right"
    elif snake_x + tile_size > WIDTH:
        richting = "left"
    elif snake_y < 0:
        richting = "..."
    elif snake_y + tile_size > HEIGHT:
        richting = "..."

def on_key_down(key):
    global richting

    if key == keys.LEFT:
        richting = "left"
    elif key == keys.RIGHT:
        richting = "right"
    elif key == keys.UP:
        richting = "up"
    elif key == keys.DOWN:
        richting = "down"

pgzrun.go()

Als je de linker- of rechterkant raakt, dan 'stuitert' je terug. Dat gebeurt niet als je de boven- of onderkant aanraakt. Pas de code aan zodat je ook terugstuiters als je de onder-of bovenkant aanraakt.

â„šī¸ Uitleg

  • snake_x + tile_size > WIDTH: betekent dat de slang voorbij de rechterrand gaat
  • Als de slang een rand raakt, verander je de variabele richting
  • De ontbrekende waarde is wat de slang moet doen als hij links het scherm uit dreigt te gaan

đŸ› ī¸ Opdracht

  • Voeg de ontbrekende regel toe zodat de slang niet door de linkerkant verdwijnt
  • Test of de slang de andere richtingen goed oppikt
  • Verander eventueel de standaardrichting of startpositie om verschillende randen te testen

💡 Extra uitdaging

Laat de slang bij elke randbotsing van kleur veranderen! (Tip: maak een variabele kleur en gebruik bijvoorbeeld random.choice())

📤 Inleveren

  1. Leg uit wat je hebt aangepast en waarom dat werkt.

5 Snake – Les 5: Geen omkeren toegestaan

In deze les zorgen we ervoor dat de slang niet meteen omkeert. In een echte Snake-game kun je namelijk niet ineens van rechts naar links bewegen – dan zou de slang zichzelf opeten!

🔍 Wat gaan we doen?

  • We voorkomen dat de slang direct de tegenovergestelde richting kiest.
  • We vergelijken de huidige richting met de nieuwe richting voordat we die veranderen.

🔰 Code (let op: onvolledig!)

De volgende code voorkomt omkeren, maar jij moet ÊÊn voorwaarde nog zelf aanvullen.

import pgzrun

WIDTH = 600
HEIGHT = 400

snake_x = 200
snake_y = 200
tile_size = 20
step = 5
richting = "right"

def draw():
    screen.clear()
    screen.draw.filled_rect(Rect((snake_x, snake_y), (tile_size, tile_size)), "green")

def update():
    global snake_x, snake_y

    if richting == "left":
        snake_x -= step
    elif richting == "right":
        snake_x += step
    elif richting == "up":
        snake_y -= step
    elif richting == "down":
        snake_y += step

def on_key_down(key):
    global richting

    if key == keys.LEFT and richting != "right":
        richting = "left"
    elif key == keys.RIGHT and richting != "left":
        richting = "right"
    elif key == keys.UP and richting != "down":
        richting = "up"
    elif key == keys.DOWN and richting != "...":
        richting = "down"

pgzrun.go()

â„šī¸ Uitleg

  • We gebruiken een if-voorwaarde om te voorkomen dat je teruggaat in de tegenovergestelde richting.
  • De ontbrekende regel is die voor keys.DOWN: welke richting is dan niet toegestaan?

đŸ› ī¸ Opdracht

  • Vul de ontbrekende voorwaarde aan zodat de slang niet van "up" naar "down" mag keren
  • Test alle richtingen: kun je nog steeds normaal draaien? Keren lukt niet meer, toch?

💡 Extra uitdaging

Laat de slang een geluidje maken als je op een toets drukt, maar de richting wordt niet veranderd (bijv. als je wÊl op links drukt, maar dat mag niet).

Met deze code kan je ene geluidje afspelen.

sounds.beep.play()

📤 Inleveren

  1. Leg uit wat je hebt veranderd en hoe het werkt.