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 de images/-map met fruitplaatjes.
  • De besturing, het venster en de tijdmeting staan al klaar. De ninja vult nieuw_fruit(), zet_stap() en teken() 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 aan fruit_pos. Roep daarna nieuw_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:]? Dan game_over = True en return.
  • Herstart: vang pygame.K_r op in de event-handler als game_over True is, roep dan reset() 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 als score > hoogste_score.
  • Fruit niet op de slang: while True: pos = ...; if pos not in slang: break.