Snake: Coach-notities
Doel van de uitdaging
Een ninja heeft de uitdaging afgerond als:
- ✅ Basic: de slang beweegt via pijltjestoetsen, eet fruit, groeit en toont de score.
- ⭐ Stretch: game over bij muurbotsing of zelfbotsing; een game-over scherm met de score; herstart via R.
- 🔥 Expert: snelheid neemt toe naarmate de score stijgt; hoogste score blijft staan na een herstart; fruit spawnt nooit op de slang.
Voorbereiding
- Geef de ninja de startcode. Die bevat
main.pyén deimages/-map met fruitplaatjes. - De besturing, het venster en de tijdmeting staan al klaar. De ninja vult
nieuw_fruit(),zet_stap()enteken()in. - Test of pygame beschikbaar is op de laptop (zie Thonny instellen).
Nieuw concept: afbeeldingen laden en schalen
Dit is de eerste keer dat ninjas een afbeelding laden én schalen. De startcode doet het al, maar leg het uit als een ninja ernaar vraagt:
surf = pygame.image.load('images/apple.png').convert_alpha()
fruit_images['apple'] = pygame.transform.scale(surf, (TILE, TILE))pygame.image.load()leest het PNG-bestand in als een Surface..convert_alpha()zorgt dat de transparantie correct werkt.pygame.transform.scale()geeft een nieuwe Surface op het gevraagde formaat. Het origineel verandert niet.screen.blit(surf, (x, y))tekent de Surface op positie(x, y).
Veelgestelde vragen
“De slang beweegt te snel”
clock.tick(60) loopt 60 keer per seconde. Eén stap per frame is veel te snel. De startcode gebruikt pygame.time.get_ticks() om te meten of er genoeg tijd verstreken is. Controleer of de ninja zet_stap() alleen aanroept als nu - laatste_stap >= STAP_MS.
“De slang kan achterstevoren bewegen”
De richting mag nooit direct worden omgekeerd. De startcode checkt dit al in de event-handler (if event.key == pygame.K_UP and dy == 0). Als de ninja de besturing zelf heeft geschreven, wijst dan op die check.
“De slang groeit niet als hij fruit eet”
Elke stap verwijder je het laatste element (slang.pop()). Bij het eten van fruit sla je die pop() over. Controleer of de ninja die pop() overslaat bij een collision met fruit.
“Fruit verschijnt op de slang”
De ninja spawnt fruit zonder te checken of de positie al bezet is. Hint: gebruik een while-lus die herhaalt zolang pos in slang.
“Zelfbotsing wordt niet gedetecteerd”
nieuw_hoofd in slang matcht ook het huidige hoofd (het eerste element vóór de verplaatsing). Gebruik nieuw_hoofd in slang[1:].
“Score-tekst verschijnt niet”
font.render() geeft een Surface terug. Die moet je nog op het scherm zetten met screen.blit(). Veel ninjas vergeten de tweede stap.
Hints per niveau
Geef deze hints als een ninja vastloopt. Geen volledige code.
✅ Basic
- Sla de richting op als twee getallen
(dx, dy), bijv.(1, 0)voor rechts. - Elke stap: bereken
nieuw_hoofd = (slang[0][0] + dx, slang[0][1] + dy), voeg toe aan de voorkant, verwijder het laatste. - Groei: sla
slang.pop()over als het nieuwe hoofd gelijk is aanfruit_pos. Roep daarnanieuw_fruit()aan. - Tekst tonen:
tekst = font.render(f"Score: {score}", True, ZWART)+screen.blit(tekst, (6, 4)).
⭐ Stretch
- Controleer na het berekenen van het nieuwe hoofd: buiten het raster? In
slang[1:]? Dangame_over = Trueenreturn. - Herstart: vang
pygame.K_rop in de event-handler alsgame_overTrue is, roep danreset()aan.
🔥 Expert
- Snelheid:
STAP_MS = max(60, BASISINTERVAL - score * 10). Bij score 9 is het interval nog maar 60 ms. Herbereken dit elke keer voor je controleert. - Hoogste score: bewaar buiten
reset(). Update alleen alsscore > hoogste_score. - Fruit niet op de slang:
while True: pos = ...; if pos not in slang: break.