Space Invaders: Coach-notities
Doel van de uitdaging
Een ninja heeft de uitdaging afgerond als:
- ✅ Basic: het schip beweegt, de formatie beweegt heen en weer en zakt omlaag, de speler kan schieten met een cooldown.
- ⭐ Stretch: kogels raken aliens (score), aliens schieten willekeurig terug, levens gaan omlaag bij treffer; game-over scherm.
- 🔥 Expert: formatie versnelt bij minder aliens, game over bij landing, herstart via R.
Voorbereiding
- Geef de ninja de startcode. Die bevat
main.pyén deimages/-map met ship.png, enemy.png en laser.png. - Venster, klok, lettertype, kleuren, constanten, afbeeldingen laden en
maak_vijanden()staan al in de startcode. - Test of pygame beschikbaar is op de laptop (zie Thonny instellen).
Veelgestelde vragen
“De aliens bewegen, maar zakken niet omlaag”
De rand-check moet ná de beweging, niet ervóór. De ninja berekent eerst de nieuwe rechts/links na het verschuiven, en dan pas de rand-controle. Controleer of alien.y += ALIEN_VAL echt in het if-blok zit.
“Alle aliens zakken tegelijk twee keer omlaag” Eén frame kan zowel de rechterrand als de linkerrand raken (als de formatie breed is en beide tegelijk overschrijdt). Fix: check de rand één keer per frame, niet één keer per alien. Verplaats de rand-check buiten de alien-loop.
“De kogel schiet maar één keer”
De ninja verwijdert de kogel zodra die het scherm verlaat, maar vergeet hem ook te verwijderen wanneer hij een alien raakt. Of andersom: de kogel verdwijnt na de botsing, maar de alien niet. Controleer beide remove()-aanroepen.
“Ik loop over de lijst terwijl ik erin verwijder”
for k in speler_kogels terwijl je speler_kogels.remove(k) aanroept geeft onverwachte overslaans. Gebruik for k in speler_kogels[:] (kopie van de lijst) zodat de originele lijst veilig wijzigt.
“De speler schiet razendsnel”
COOLDOWN_MS = 500 moet gecheckt worden via pygame.time.get_ticks(). Controleer of de ninja laatste_schot bijhoudt en vergelijkt met nu - laatste_schot >= COOLDOWN_MS vóór het toevoegen van een kogel.
“De score telt omhoog maar de tekst verschijnt niet”
font.render() geeft een Surface terug. Die moet nog op het scherm gezet worden met screen.blit(). Controleer of de ninja de tweede stap niet vergeten is.
Hints per niveau
✅ Basic
- Sterren:
random.seed(42)→ 70×pygame.draw.circlemetrandom.randint→random.seed()om te resetten. Zo flikkeren de sterren niet. - Alien-beweging: loop over
aliens, doealien.x += ALIEN_SNL * alien_richting. Daarna: berekenrechts = max(a.right for a in aliens)enlinks = min(a.left for a in aliens). Alsrechts >= BREEDTE or links <= 0: keeralien_richtingom en doealien.y += ALIEN_VALvoor elk alien. - Schieten: check
pygame.time.get_ticks() - laatste_schot >= COOLDOWN_MS. Voeg eenpygame.Recttoe boven het schip:pygame.Rect(speler.centerx - KOGEL_B // 2, speler.top - KOGEL_H, KOGEL_B, KOGEL_H).
⭐ Stretch
- Botsing kogel ↔ alien:
for k in speler_kogels[:]: for alien in aliens[:]: if k.colliderect(alien): remove k, remove alien, score += 10, break. - Aliens schieten:
for alien in aliens: if random.random() < SCHIET_KANS: voeg kogel toe onder alien. - Levens:
for k in alien_kogels[:]: if k.colliderect(speler): remove k, levens -= 1; if levens <= 0: game_over = True.
🔥 Expert
- Snelheid:
restant = len(aliens) / (RIJEN * KOLOMMEN); snelheid = max(1, round(1 + 3 * (1 - restant))). Herbereken dit elke frame vóór de alien-loop. - Landing:
for alien in aliens: if alien.bottom >= HOOGTE - 50: game_over = True; break. - Reset: maak een
reset()-functie die alleglobal-variabelen opnieuw instelt. Roep hem aan bijpygame.K_ralsgame_overTrue is.