Snake

Notitie

Vereist: sessie 5 afgerond.

De slang beweegt vanzelf. Jij stuurt met de pijltjestoetsen. Eet een stuk fruit: de slang groeit één vakje. Raak de muur of jezelf: game over.

Opstarten

Download de startcode en pak de ZIP uit. Open main.py in Thonny en klik Run. Je ziet een leeg raster. De besturing en de tijdmeting staan al klaar. Jij vult de functies nieuw_fruit(), zet_stap() en teken() in.

Hoe werkt het?

Snake speelt op een rooster. De slang is een lijst van (kolom, rij) coördinaten. Elke stap voeg je een nieuw hoofd toe aan de voorkant van de lijst en verwijder je het laatste element. Eet de slang fruit, dan laat je het laatste element staan, waardoor de slang groeit.

TILE = 20          # grootte van één vakje in pixels
COLS = WIDTH // TILE
ROWS = HEIGHT // TILE

slang = [(10, 10), (9, 10), (8, 10)]  # lijst van (kolom, rij)
dx, dy = 1, 0                          # richting: 1 stap naar rechts

Afbeeldingen laden en schalen

De fruitplaatjes zijn 64×64 pixels. Dat is te groot voor één vakje van 20×20. Je laadt ze met pygame.image.load() en schaalt ze daarna met pygame.transform.scale(). Dit staat al klaar in de startcode.

surf = pygame.image.load('images/apple.png').convert_alpha()
fruit_images['apple'] = pygame.transform.scale(surf, (TILE, TILE))

convert_alpha() zorgt dat de transparantie van het plaatje goed werkt. pygame.transform.scale() geeft een nieuwe Surface terug op het gevraagde formaat. Het origineel blijft ongewijzigd.

Om een geschaald plaatje op het scherm te zetten, gebruik je screen.blit():

screen.blit(fruit_surf, (fruit_pos[0] * TILE, fruit_pos[1] * TILE))

✅ Basic

  • Vul nieuw_fruit() in: kies een willekeurig fruit, zoek een vrij vakje en sla de positie en Surface op.
  • Vul zet_stap() in: bereken het nieuwe hoofd, voeg het toe aan de voorkant van de lijst, verwijder het laatste element.
  • Vul teken() in: teken het raster (pygame.draw.line), het fruit (screen.blit), en elke slangbol (pygame.draw.circle). Toon de score met font.render() en screen.blit().
  • Spawn fruit als de slang het eet: laat slang.pop() weg en roep nieuw_fruit() aan.

⭐ Stretch

  • Game over als het hoofd buiten het raster valt.
  • Game over als het hoofd een eigen segment raakt (nieuw_hoofd in slang[1:]).
  • Toon een game-over scherm met de score. Druk op R om opnieuw te starten.

🔥 Expert

  • Verhoog de snelheid naarmate de score stijgt: verlaag STAP_MS op basis van de score (max(60, BASISINTERVAL - score * 10)).
  • Sla de hoogste score op en toon hem naast de huidige score, ook na een herstart.
  • Zorg dat fruit nooit spawnt op een vakje dat de slang al bezet.

Downloads

  • Startcode: main.py met de besturing en tijdmeting klaar; jij vult de functies in.
  • Fruitafbeeldingen: als je zonder startcode begint (al inbegrepen in de startcode-ZIP).

Fruit: Kenney Food Kit, CC0 (publiek domein). kenney.nl