<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dojo Defender: Sessie 4 :: CoderDojo Python &amp; Pygame</title><link>https://python.coderdojohasselt.be/dojo-defender/session-4/index.html</link><description>Vandaag wordt Dojo Defender een echt spel met een menu. Geen zwarte start meer — je krijgt een titelscherm, een game-over scherm, en drie verschillende vijandtypes die elk hun eigen beweging hebben.
Wat je vandaag leert State machines: je spel heeft toestanden (MENU, PLAYING, GAME OVER) Vijand-AI: elke vijand beweegt anders (recht, zigzag, charger) Wave-systeem: steeds moeilijkere golven met mixen van vijanden Een reset-functie: alles netjes terugzetten zonder herstart Stap 0: Download de starter De starter is de oplossing van sessie 3 — Dojo Defender in raw pygame met geluid.</description><generator>Hugo</generator><language>nl</language><atom:link href="https://python.coderdojohasselt.be/dojo-defender/session-4/index.xml" rel="self" type="application/rss+xml"/><item><title>Dojo Defender Sessie 4: Cheatsheet</title><link>https://python.coderdojohasselt.be/dojo-defender/session-4/cheatsheet/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/dojo-defender/session-4/cheatsheet/index.html</guid><description>State machine state = "MENU" # "MENU", "PLAYING", "GAME_OVER" # In de event loop: if event.key == pygame.K_SPACE: if state == "MENU": reset_game() state = "PLAYING" elif state == "GAME_OVER": reset_game() state = "PLAYING" elif state == "PLAYING" and not game_over: # schiet # In de teken-loop: if state == "MENU": # titelscherm elif state == "PLAYING": # normaal spel elif state == "GAME_OVER": # game over scherm Reset functie def reset_game(): global ship, asteroids, bullets, enemies, lives, score global game_over, timer, explosion_active, explosion_frame global explosion_timer, invincible, invincible_timer global shoot_cooldown, wave, wave_display_timer global enemies_destroyed, spawn_counter, spawn_interval ship.rect.center = (WIDTH / 2, HEIGHT - 50) ship.visible = True asteroids.clear() bullets.clear() enemies.clear() lives = 3 score = 0 game_over = False timer = 0 explosion_active = False explosion_frame = 0 explosion_timer = 0 invincible = False invincible_timer = 0 shoot_cooldown = 0 wave = 1 wave_display_timer = 0 enemies_destroyed = 0 spawn_counter = 0 spawn_interval = 120 Drie vijandtypes spawnen def spawn_enemy_drone(): enemy = GameObject('enemy_drone.png', random.randint(30, WIDTH - 30), -30) enemy.type = 'drone' enemy.speed = random.uniform(1, 3) enemies.append(enemy) def spawn_enemy_zigzag(): enemy = GameObject('enemy_zigzag.png', random.randint(30, WIDTH - 30), -30) enemy.type = 'zigzag' enemy.speed = random.uniform(2, 4) enemy.dx = random.choice([-2, 2]) enemies.append(enemy) def spawn_enemy_charger(): enemy = GameObject('enemy_charger.png', random.randint(30, WIDTH - 30), -30) enemy.type = 'charger' enemy.speed = random.uniform(3, 5) enemies.append(enemy) Beweging per type for enemy in enemies[:]: if enemy.type == 'drone': enemy.rect.y += enemy.speed elif enemy.type == 'zigzag': enemy.rect.x += enemy.dx enemy.rect.y += enemy.speed if enemy.rect.left &lt;= 0 or enemy.rect.right >= WIDTH: enemy.dx = -enemy.dx elif enemy.type == 'charger': dx = ship.rect.centerx - enemy.rect.centerx if dx > 0: enemy.rect.centerx += min(enemy.speed, abs(dx)) elif dx &lt; 0: enemy.rect.centerx -= min(enemy.speed, abs(dx)) enemy.rect.y += enemy.speed * 0.8 Wave-selectie def spawn_enemy(): if wave == 1: spawn_enemy_drone() elif wave &lt;= 3: if random.random() &lt; 0.5: spawn_enemy_drone() else: spawn_enemy_zigzag() else: r = random.random() if r &lt; 0.3: spawn_enemy_drone() elif r &lt; 0.65: spawn_enemy_zigzag() else: spawn_enemy_charger()</description></item><item><title>Dojo Defender Sessie 4: Coach-notities</title><link>https://python.coderdojohasselt.be/dojo-defender/session-4/mentor-notes/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/dojo-defender/session-4/mentor-notes/index.html</guid><description>Doel van deze sessie Na deze sessie kan een ninja:
Een state machine toepassen (MENU → PLAYING → GAME_OVER) Een reset-functie schrijven die alle globale variabelen terugzet Verschillende vijand-AI implementeren (drone, zigzag, charger) Een wave-systeem bouwen dat de moeilijkheidsgraad opvoert Voorbereiding (30 min vóór de sessie) Starter ZIPs klaar op USB en de site: dojo-defender-s5-starter.zip en dojo-defender-s5-solution.zip. De starter éénmaal draaien op de dojoruimte-laptop. Controleer of enemy_zigzag.png en enemy_charger.png in de images/ map van de starter zitten. Leg de state machine uit op het bord: teken drie blokken (MENU, PLAYING, GAME_OVER) met pijlen ertussen. Tijdsindeling (3 uur) Deze sessie is integraal onderdeel van de normale sessie 5 (Breakout). Gebruik de tijd als volgt:</description></item><item><title>Dojo Defender Sessie 4: Demo</title><link>https://python.coderdojohasselt.be/dojo-defender/session-4/demo/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://python.coderdojohasselt.be/dojo-defender/session-4/demo/index.html</guid><description>Hoe demonstreer je de oplossing Open een terminal in de projectmap. Voer uit: uv run python3 code/sessions/05-breakout/dojo-defender-solution/main.py Laat zien:
Het spel start in het MENU met “DOJO DEFENDER” titel en “Press SPACE to start” SPACE start het spel en reset alle waarden Drie vijandtypes: Drone (blauw, vierkant) — beweegt recht naar beneden Zigzag (rood, driehoekig) — beweegt diagonaal, kaatst van de randen Charger (geel, puntig) — volgt het schip horizontaal Wave-systeem: Wave 1 alleen drones, Wave 2-3 drones + zigzag, Wave 4+ ook chargers Game over: toont “GAME OVER” met score en “Press SPACE to restart” State transitions: MENU → PLAYING → GAME_OVER → PLAYING Code-highlights om te tonen:</description></item></channel></rss>