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 de images/-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.circle met random.randintrandom.seed() om te resetten. Zo flikkeren de sterren niet.
  • Alien-beweging: loop over aliens, doe alien.x += ALIEN_SNL * alien_richting. Daarna: bereken rechts = max(a.right for a in aliens) en links = min(a.left for a in aliens). Als rechts >= BREEDTE or links <= 0: keer alien_richting om en doe alien.y += ALIEN_VAL voor elk alien.
  • Schieten: check pygame.time.get_ticks() - laatste_schot >= COOLDOWN_MS. Voeg een pygame.Rect toe 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 alle global-variabelen opnieuw instelt. Roep hem aan bij pygame.K_r als game_over True is.