Python Podstawowy - Lekcja 6: Tworzymy Grę Arkanoid! 🎮🧱

Summary

🎮 Lekcja 6: Tworzymy Grę Arkanoid! 🧱✨

← Powrót do kursu Python Podstawowy

Witaj ponownie, młody twórco gier! 🚀 Dotarliśmy do bardzo specjalnej lekcji. Przez ostatnie 5 lekcji nauczyłeś się podstaw programowania w Pythonie - zmiennych, pętli, list, funkcji i logiki. Teraz połączymy WSZYSTKO, co umiesz, i stworzymy prawdziwą grę - Arkanoid!

🎯 Czego się dzisiaj nauczymy?

W tej super lekcji:

  • 🎮 Stworzymy kompletną grę Arkanoid od podstaw
  • 🧱 Nauczymy się tworzyć cegły do rozbijania
  • 🏓 Zrobimy paletkę sterowaną klawiaturą
  • ⚽ Dodamy piłkę z prawdziwą fizyką odbić
  • 💥 Nauczymy się wykrywać kolizje (zderzenia)
  • 🎨 Dodamy tło i kolory
  • 📊 Stworzymy system punktacji
  • 🏆 Nauczymy się warunków wygranej i przegranej

To będzie najbardziej ekscytująca lekcja! 🎉


🎮 Co to jest Arkanoid?

Arkanoid to klasyczna gra zręcznościowa, którą możesz znać pod różnymi nazwami (niektórzy mówią “Breakout” lub “rozbijanie cegieł”). Zasady są proste:

  1. U góry są kolorowe cegły do rozbijania 🧱
  2. Na dole jest paletka, którą sterujesz strzałkami ⬅️➡️
  3. Piłka odbija się od wszystkiego ⚽
  4. Cel: Zniszczyć wszystkie cegły, nie dając piłce spaść na dół!

Brzmi prosto? Ale stworzenie tego to prawdziwa przygoda programistyczna! 💻✨


🛠️ Przygotowanie - Co potrzebujemy?

Krok 1: Upewnij się, że masz Pygame Zero

W Lekcji 5 już instalowaliśmy Pygame Zero. Jeśli jeszcze tego nie zrobiłeś:

W Thonny:

  1. Menu: NarzędziaZarządzaj pakietami
  2. Wpisz: pgzero
  3. Kliknij Zainstaluj

Lub w terminalu:

pip install pgzero

Krok 2: Przygotuj grafiki

Nasza gra potrzebuje obrazków! Stwórz folder images obok swojego pliku z kodem i pobierz tam obrazki:

Potrzebujemy:

  • paletka.png - obrazek paletki (prostokąt, np. 100x20 pikseli)
  • pilka.png - obrazek piłki (kółko, np. 20x20 pikseli)
  • tlo.png - tło gry (800x600 pikseli)
  • cegla_czerwona.png - czerwona cegła (100x25 pikseli)
  • cegla_niebieska.png - niebieska cegła
  • cegla_zielona.png - zielona cegła
  • cegla_zolta.png - żółta cegła

📥 Pobierz gotowe grafiki!

Mam dla Ciebie gotowe obrazki do gry! 🎨

Możesz pobrać kompletny pakiet grafik dla gry Arkanoid:

👉 POBIERZ GRAFIKI DO GRY ARKANOID 📦

Co zawiera pakiet?

  • ✅ Paletka (100×20 px)
  • ✅ Piłka (20×20 px)
  • ✅ Tło (800×600 px)
  • ✅ 4 rodzaje kolorowych cegieł (100×25 px każda)

Jak użyć pobranych grafik?

  1. Pobierz plik ZIP i rozpakuj go
  2. Znajdziesz folder images z wszystkimi grafikami
  3. Skopiuj cały folder images do folderu z Twoją grą (obok pliku arkanoid.py)
  4. Gotowe! 🎉

💡 Alternatywy:

  • Paint / GIMP - narysuj własne grafiki! To świetna okazja do kreatywności! 🎨
  • Internet - szukaj “pixel art brick”, “pixel art paddle” (pamiętaj o odpowiednich rozmiarach!)
  • Proste kształty - na początek możesz rysować prostokąty zamiast używać obrazków (pokażemy jak poniżej)

🎨 Opcja: Gra BEZ obrazków (tylko kształty)

Nie masz obrazków? Żaden problem! Możesz użyć prostych kolorowych prostokątów:

# Zamiast Actor("paletka") użyj:
def draw():
    screen.draw.filled_rect(Rect(paletka_x, paletka_y, 100, 20), 'white')
    screen.draw.filled_circle((pilka_x, pilka_y), 10, 'yellow')

📁 Struktura folderów:

🗂️ twoj_projekt/
   ├── arkanoid.py         ← Twój kod gry
   └── 📁 images/
       ├── paletka.png
       ├── pilka.png
       ├── tlo.png
       ├── cegla_czerwona.png
       ├── cegla_niebieska.png
       ├── cegla_zielona.png
       └── cegla_zolta.png

📚 Nowe koncepty, które poznasz

Zanim zaczniemy kodować, wyjaśnijmy kilka nowych rzeczy:

🎭 Co to jest Actor?

Actor (czytaj: “aktor”) to specjalny obiekt w Pygame Zero, który reprezentuje rzeczy w grze - jak postać w filmie! Każdy Actor ma:

  • Obrazek - jak wygląda (np. "paletka" - Pygame Zero szuka pliku paletka.png w folderze images)
  • Pozycję - gdzie jest na ekranie (x, y)
  • Rozmiar - szerokość i wysokość
# Tworzymy paletke jako Actor
paletka = Actor("paletka", (400, 555))
#                 ↑obrazek   ↑pozycja (x, y)

Dlaczego Actor jest super?

  • Ma wbudowane funkcje jak .draw() (rysowanie)
  • Ma automatyczne krawędzie: .left, .right, .top, .bottom
  • Łatwo sprawdzać kolizje: .colliderect()

🌍 Zmienne global - Dlaczego ich potrzebujemy?

Pamiętasz zmienne z poprzednich lekcji? W grach mamy problem: zmienne utworzone poza funkcjami (na górze kodu) są “widoczne” w funkcjach, ale nie możemy ich tam zmieniać bez słowa global!

# Zmienna utworzona na górze
wynik = 0

def update():
    global wynik  # Mówimy: "Chcę zmieniać zmienną wynik z góry!"
    wynik += 1    # Teraz możemy ją zmieniać!

Dlaczego to ważne? W grze wiele funkcji musi zmieniać te same zmienne - wynik, pozycję piłki, listę cegieł. Bez global każda funkcja miałaby swoją własną kopię i nic by nie działało! 😱

📦 Listy obiektów - Wiele cegieł naraz

Pamiętasz listy z Lekcji 5? W grze użyjemy listy do przechowywania wszystkich cegieł:

cegly = []  # Pusta lista na cegły

# Dodajemy cegły do listy
cegly.append(Actor("cegla_czerwona", (100, 20)))
cegly.append(Actor("cegla_niebieska", (200, 20)))

# Rysujemy wszystkie cegły pętlą!
for cegla in cegly:
    cegla.draw()

Super sprawa: Możemy mieć 100 cegieł, a rysuje je tylko 3 linijki kodu! 🎨

💥 Kolizje - Jak sprawdzić, czy coś uderzyło?

Kolizja to moment, gdy dwie rzeczy się dotykają (np. piłka uderza w paletkę). W Pygame Zero sprawdzamy to funkcją .colliderect():

if pilka.colliderect(paletka):
    print("Piłka uderzyła w paletkę!")
    pilka.predkoscy *= -1  # Odwróć kierunek piłki

Jak to działa? Pygame Zero sprawdza, czy prostokąty (boxy) wokół obiektów się nakładają. Proste i skuteczne! 📦➕📦 = 💥


🚀 Etap 1: Podstawowa struktura gry

Zaczynamy! Stwórz nowy plik arkanoid.py i wpisz ten kod:

import pgzrun

# Rozmiar okna gry
WIDTH = 800
HEIGHT = 600

# Tworzymy tło
tlo = Actor("tlo", (400, 300))

def draw():
    """Ta funkcja rysuje wszystko na ekranie"""
    tlo.draw()  # Rysujemy tło

    # Tytuł gry
    screen.draw.text("ARKANOID", (320, 250),
                     color="white", fontsize=60)
    screen.draw.text("Naciśnij ENTER, aby zacząć", (250, 350),
                     color="yellow", fontsize=30)

def update():
    """Ta funkcja aktualizuje grę co klatkę"""
    pass  # Na razie nic nie robimy

pgzrun.go()

Uruchom to! (F5 w Thonny)

Co widzisz? Okno z tłem i napisami! To jest nasz ekran startowy. 🎬

Wyjaśnienie kodu:

  • WIDTH = 800, HEIGHT = 600 - rozmiar okna (jak ekran telewizora!)
  • tlo = Actor("tlo", (400, 300)) - tło wycentrowane na środku (połowa z 800 = 400, połowa z 600 = 300)
  • screen.draw.text() - funkcja do rysowania tekstu na ekranie
  • pass - słowo “nic nie rób” (placeholder)

🏓 Etap 2: Dodajemy paletkę

Teraz dodamy paletkę, którą będziesz sterować!

Zamień cały kod na ten:

import pgzrun

WIDTH = 800
HEIGHT = 600

# Tworzymy obiekty gry
tlo = Actor("tlo", (400, 300))
paletka = Actor("paletka", (400, 555))  # Paletka na dole, na środku

def draw():
    """Rysuje wszystko"""
    tlo.draw()
    paletka.draw()  # Rysujemy paletkę!

    # Napisy
    screen.draw.text("ARKANOID", (320, 50),
                     color="white", fontsize=60)
    screen.draw.text("Użyj strzałek ← →", (300, 500),
                     color="yellow", fontsize=25)

def update():
    """Sterowanie paletką"""
    if keyboard.right and paletka.right <= WIDTH:
        paletka.x += 10  # Idź w prawo
    if keyboard.left and paletka.left > 0:
        paletka.x -= 10  # Idź w lewo

pgzrun.go()

Uruchom! Teraz możesz sterować paletką strzałkami! ⬅️➡️

Co nowego?

  • paletka = Actor("paletka", (400, 555)) - paletka na dole (y=555 to prawie sam dół!)
  • paletka.right <= WIDTH - sprawdza, czy paletka nie wyszła za prawą krawędź
  • paletka.left > 0 - sprawdza, czy nie wyszła za lewą krawędź
  • paletka.x += 10 - przesuwa paletkę o 10 pikseli w prawo

🎮 Zadanie: Zmień 10 na 5 lub 15 - zobacz, jak zmienia się szybkość paletki!


⚽ Etap 3: Dodajemy piłkę

Czas na piłkę, która się porusza!

Dodaj na górze (po linii z paletką):

# Tworzymy piłkę
pilka = Actor("pilka", (400, 300))  # Start na środku ekranu
pilka.predkoscx = 5  # Prędkość w prawo/lewo
pilka.predkoscy = 5  # Prędkość góra/dół

W funkcji draw() dodaj (po rysowaniu paletki):

    pilka.draw()  # Rysujemy piłkę

Stwórz nową funkcję (pod funkcją update()):

def pilka_sterowanie():
    """Poruszanie piłką i odbicia od ścian"""
    global pilka

    # Poruszaj piłką
    pilka.x += pilka.predkoscx
    pilka.y += pilka.predkoscy

    # Odbicie od lewej i prawej ściany
    if pilka.x >= WIDTH or pilka.x <= 0:
        pilka.predkoscx *= -1  # Odwróć kierunek poziomy

    # Odbicie od górnej ściany
    if pilka.y <= 0:
        pilka.predkoscy *= -1  # Odwróć kierunek pionowy

    # Piłka spadła na dół - przegrana
    if pilka.y >= HEIGHT:
        print("PRZEGRAŁEŚ! Piłka spadła!")
        pilka.predkoscy *= -1  # Na razie odbijamy od dołu też

W funkcji update() dodaj na końcu:

    pilka_sterowanie()  # Wywołujemy funkcję piłki

Uruchom! Piłka leci i odbija się od ścian! ⚽💨

Wyjaśnienie:

  • pilka.predkoscx - prędkość pozioma (x). Dodatnia = w prawo, ujemna = w lewo
  • pilka.predkoscy - prędkość pionowa (y). Dodatnia = w dół, ujemna = w górę
  • *= -1 - zmienia znak (5 staje się -5, -5 staje się 5) = odwrócenie kierunku!
  • pilka.x >= WIDTH - sprawdza, czy piłka dotarła do prawej ściany

🧠 Zastanów się: Dlaczego piłka odbija się od ścian? Bo gdy dotyka ściany, zmieniamy znak prędkości - jeśli leciała w prawo (+5), to zaczyna lecieć w lewo (-5)! 🔄


🏓 Etap 4: Odbicie od paletki

Teraz sprawmy, żeby piłka odbijała się od paletki!

W funkcji pilka_sterowanie() dodaj (przed linią “Piłka spadła na dół”):

    # Odbicie od paletki
    if pilka.colliderect(paletka):
        pilka.predkoscy *= -1  # Odbij piłkę w górę!

Uruchom! Teraz możesz odbijać piłkę paletką! 🎾

Co się dzieje?

  1. pilka.colliderect(paletka) - sprawdza, czy piłka dotyka paletki
  2. Jeśli TAK → odwracamy predkoscy (piłka leci w górę zamiast w dół)
  3. Efekt: piłka odbija się od paletki! 🏓

🧱 Etap 5: Dodajemy cegły do rozbijania!

Najważniejsza część - cegły! Użyjemy pętli i listy, żeby stworzyć wiele cegieł naraz.

Na górze pliku (po linii z piłką) dodaj:

# Lista cegieł (na razie pusta)
cegly = []

# Kolory cegieł (4 rzędy)
kolory_cegiel = ["cegla_czerwona", "cegla_niebieska",
                 "cegla_zielona", "cegla_zolta"]

# Tworzymy siatkę cegieł: 7 kolumn × 4 rzędy = 28 cegieł!
for i in range(7):  # 7 cegieł w poziomie
    for j in range(4):  # 4 rzędy w pionie
        # Wybieramy kolor cegły (zmienia się co rząd)
        kolor = kolory_cegiel[j % 4]

        # Tworzymy cegłę i dodajemy do listy
        cegly.append(Actor(kolor, (1.1 * i * 100 + 70, j * 25 + 20)))

W funkcji draw() dodaj (po rysowaniu piłki):

    # Rysujemy wszystkie cegły
    for cegla in cegly:
        cegla.draw()

Uruchom! WOW! Masz teraz siatkę kolorowych cegieł! 🧱🌈

📊 Matematyka pozycji cegieł (nie bój się, wyjaśniam!):

(1.1 * i * 100 + 70, j * 25 + 20)

Poziomo (X):

  • i * 100 - każda cegła jest przesunięta o 100 pikseli
  • 1.1 * - mnożymy przez 1.1, żeby dać małą przerwę między cegłami
  • + 70 - przesunięcie od lewej krawędzi (margines)

Wynik dla pierwszych 3 cegieł:

  • i=0: 1.1 * 0 * 100 + 70 = 70
  • i=1: 1.1 * 1 * 100 + 70 = 180
  • i=2: 1.1 * 2 * 100 + 70 = 290

Pionowo (Y):

  • j * 25 - każdy rząd jest 25 pikseli niżej
  • + 20 - przesunięcie od górnej krawędzi

Wynik dla 4 rzędów:

  • j=0: 0 * 25 + 20 = 20 (pierwszy rząd)
  • j=1: 1 * 25 + 20 = 45 (drugi rząd)
  • j=2: 2 * 25 + 20 = 70 (trzeci rząd)
  • j=3: 3 * 25 + 20 = 95 (czwarty rząd)

Wizualizacja:

        70    180   290   400   510   620   730
     ┌─────────────────────────────────────────┐
  20 │ 🟥    🟥    🟥    🟥    🟥    🟥    🟥  │ ← Czerwone (j=0)
  45 │ 🟦    🟦    🟦    🟦    🟦    🟦    🟦  │ ← Niebieskie (j=1)
  70 │ 🟩    🟩    🟩    🟩    🟩    🟩    🟩  │ ← Zielone (j=2)
  95 │ 🟨    🟨    🟨    🟨    🟨    🟨    🟨  │ ← Żółte (j=3)
     └─────────────────────────────────────────┘

🎓 Nauka:

  • Pętla for i in range(7) tworzy kolumny (0, 1, 2, 3, 4, 5, 6)
  • Pętla for j in range(4) tworzy rzędy (0, 1, 2, 3)
  • % (modulo) wybiera kolor - j % 4 daje resztę z dzielenia: 0→czerwony, 1→niebieski, 2→zielony, 3→żółty

💥 Etap 6: Rozbijanie cegieł i punkty!

Czas sprawić, żeby cegły znikały po trafieniu!

Na górze (po linii z cegłami) dodaj:

wynik = 0  # Licznik punktów

W funkcji pilka_sterowanie() dodaj (przed linią “Odbicie od paletki”):

    # Sprawdzanie kolizji z cegłami
    global wynik
    for index, cegla in enumerate(cegly):
        if pilka.colliderect(cegla):
            pilka.predkoscy *= -1  # Odbij piłkę
            cegly.pop(index)       # Usuń cegłę z listy
            wynik += 1             # Dodaj punkt!
            print(f"Punkty: {wynik}")
            break  # Ważne! Wychodzimy z pętli (piłka może trafić tylko 1 cegłę na raz)

W funkcji draw() dodaj (na końcu, po rysowaniu cegieł):

    # Wyświetl wynik
    screen.draw.text(f"Wynik: {wynik}", (10, 10),
                     color="white", fontsize=30)

Uruchom! Teraz rozbijasz cegły i zdobywasz punkty! 🎯💥

Wyjaśnienie nowego kodu:

  1. enumerate(cegly) - specjalna funkcja, która daje nam zarówno numer (index), jak i cegłę z listy:

    for index, cegla in enumerate(cegly):
        # index = 0, 1, 2, 3...
        # cegla = Actor z listy
    
  2. cegly.pop(index) - usuwa cegłę o danym numerze z listy. To jak wyrzucanie książki z półki!

  3. break - natychmiast wychodzi z pętli. Dlaczego? Bo jeśli piłka trafi 2 cegły naraz, kod by się popsuł (próbowalibyśmy usunąć tę samą cegłę dwa razy). break mówi: “OK, trafiłem jedną, koniec pętli!”

  4. wynik += 1 - to samo co wynik = wynik + 1 - dodaj 1 punkt!

🎮 Zagraj! Spróbuj rozbić wszystkie cegły!


🎯 Etap 7: Warunki wygranej i przegranej

Gra musi mieć koniec - wygraną lub przegraną! Dodajmy to.

Zmień funkcję pilka_sterowanie() - znajdź linię “Piłka spadła na dół” i zamień na:

    # Piłka spadła na dół - PRZEGRANA!
    if pilka.y >= HEIGHT:
        print("💀 KONIEC GRY! Piłka spadła na dół!")
        print(f"Twój wynik: {wynik} punktów")
        # Reset gry
        pilka.x = 400
        pilka.y = 300
        pilka.predkoscx = 5
        pilka.predkoscy = 5

W funkcji update() dodaj na końcu:

    # Sprawdź, czy wygrałeś!
    if len(cegly) == 0:
        screen.draw.text("🏆 WYGRAŁEŚ! 🏆", (250, 250),
                         color="gold", fontsize=60)
        print("🎉 Gratulacje! Rozbiłeś wszystkie cegły!")

Uruchom! Teraz gra wykrywa wygraną i przegraną!

Co nowego?

  • len(cegly) - funkcja len() sprawdza długość listy (ile cegieł zostało)
  • len(cegly) == 0 - jeśli 0 cegieł, to WYGRANA! 🏆
  • Reset gry ustawia piłkę z powrotem na środek

� Złóż wszystko razem!

A teraz najważniejsza część! 💪

Przeszedłeś przez wszystkie 7 etapów. Twoja gra powinna działać i mieć:

  • ✅ Okno z tłem
  • ✅ Paletkę sterowaną strzałkami
  • ✅ Lecącą piłkę
  • ✅ Odbicia od ścian i paletki
  • ✅ Siatkę kolorowych cegieł
  • ✅ Rozbijanie cegieł i punkty
  • ✅ Warunki wygranej i przegranej

Uruchom swoją grę i zagraj! Jeśli wszystko działa - GRATULACJE! Jesteś prawdziwym twórcą gier! 🎉

💡 Wskazówka: Jeśli coś nie działa, sprawdź:

  1. Czy wszystkie fragmenty kodu są w odpowiednich miejscach?
  2. Czy pamiętałeś o global w funkcji pilka_sterowanie()?
  3. Czy masz folder images/ z grafikami?
  4. Czy funkcja pilka_sterowanie() jest wywoływana w update()?

🆘 Potrzebujesz pomocy? Zapytaj ChatGPT: “Dlaczego moja gra Arkanoid nie działa? Oto mój kod: [wklej kod]”


🚀 Zadania i wyzwania - Ulepsz swoją grę!

Teraz, gdy masz działającą grę, możesz ją rozwijać! Oto pomysły:

🟢 Łatwe wyzwania (dla każdego!)

  1. Zmień kolory cegieł - dodaj piąty kolor!

    kolory_cegiel = ["cegla_czerwona", "cegla_niebieska",
                     "cegla_zielona", "cegla_zolta", "cegla_rozowa"]
    
  2. Zmień prędkość piłki - spraw, żeby leciała szybciej lub wolniej:

    pilka.predkoscx = 8  # Szybciej!
    pilka.predkoscy = 8
    
  3. Dodaj więcej cegieł - zmień range(7) i range(4):

    for i in range(10):  # 10 kolumn!
        for j in range(6):  # 6 rzędów!
    
  4. Zmień punkty za cegły - niektóre cegły są warte więcej:

    if kolor == "cegla_czerwona":
        wynik += 5  # Czerwone cegły = 5 punktów!
    else:
        wynik += 1
    

🟡 Średnie wyzwania (spróbuj!)

  1. System żyć - gracz ma 3 życia zamiast 1:

    zycia = 3  # Na górze
    
    # W pilka_sterowanie():
    if pilka.y >= HEIGHT:
        zycia -= 1
        if zycia == 0:
            print("KONIEC GRY!")
        else:
            print(f"Zostało żyć: {zycia}")
            # Reset piłki
    
  2. Przyspieszanie piłki - piłka przyspiesza po każdym odbiciu:

    if pilka.colliderect(paletka):
        pilka.predkoscy *= -1
        pilka.predkoscx *= 1.05  # 5% szybciej!
        pilka.predkoscy *= 1.05
    
  3. Różne punkty za kolory:

    punkty_za_kolor = {
        "cegla_czerwona": 10,
        "cegla_niebieska": 5,
        "cegla_zielona": 3,
        "cegla_zolta": 1
    }
    
    # W kolizji:
    wynik += punkty_za_kolor[cegla.image]
    
  4. Dźwięki - dodaj efekty dźwiękowe! (musisz mieć folder sounds/ z plikami .wav):

    # W kolizji z cegłą:
    sounds.brick_break.play()
    
    # W kolizji z paletką:
    sounds.paddle_hit.play()
    

🔴 Trudne wyzwania (dla mistrzów!)

  1. Power-upy - spadające bonusy, które wydłużają paletkę lub zwalniają piłkę:

    powerupy = []
    
    # Gdy cegła się rozbije:
    if random.randint(1, 5) == 1:  # 20% szans
        powerup = Actor("powerup", cegla.pos)
        powerupy.append(powerup)
    
    # Poruszaj power-upami w dół
    # Sprawdzaj kolizje z paletką
    
  2. Cegły niezniszczalne - niektóre cegły trzeba uderzyć 2-3 razy:

    # Zamiast Actor, użyj słownika:
    cegly = []
    for i in range(7):
        for j in range(4):
            cegla = {
                "actor": Actor(kolor, pozycja),
                "wytrzymalosc": 2  # Trzeba 2 razy uderzyć!
            }
            cegly.append(cegla)
    
    # W kolizji:
    cegla["wytrzymalosc"] -= 1
    if cegla["wytrzymalosc"] == 0:
        cegly.pop(index)
    
  3. Odbicie pod kątem - piłka odbija się pod różnymi kątami w zależności od miejsca trafienia paletki:

    if pilka.colliderect(paletka):
        # Gdzie piłka uderzyła w paletkę?
        offset = pilka.x - paletka.x  # -50 do +50
        pilka.predkoscx = offset / 5  # Wpływ na kierunek
        pilka.predkoscy *= -1
    
  4. Poziomy trudności - po rozbiciu wszystkich cegieł, nowy poziom!

    poziom = 1
    
    # Gdy wszystkie cegły rozbite:
    if len(cegly) == 0:
        poziom += 1
        # Stwórz nowe cegły
        # Zwiększ prędkość piłki
        pilka.predkoscx *= 1.2
        pilka.predkoscy *= 1.2
    

🧠 Co się nauczyłeś w tej lekcji?

To była OGROMNA lekcja! Zobacz, ile nowych rzeczy opanowałeś:

📚 Nowe koncepty:

  1. Obiekty Actor - reprezentacja rzeczy w grze (paletka, piłka, cegły)
  2. Kolizje - wykrywanie zderzeń za pomocą .colliderect()
  3. Listy obiektów - przechowywanie wielu cegieł w jednej zmiennej
  4. Zmienne global - modyfikowanie zmiennych z funkcji
  5. Pętle zagnieżdżone - tworzenie siatki cegieł
  6. Fizyka odbić - zmiana kierunku przez *= -1
  7. Warunki gry - wykrywanie wygranej i przegranej

🎮 Umiejętności z gier:

  • Sterowanie obiektem (paletka)
  • Fizyka poruszania (piłka)
  • Wykrywanie kolizji (zderzenia)
  • System punktacji (wynik)
  • Usuwanie obiektów (rozbijanie cegieł)
  • Warunki zwycięstwa (brak cegieł)

💡 Z poprzednich lekcji użyłeś:

Zmienne (Lekcja 1-2) - wynik, pilka.predkoscx
Instrukcje warunkowe if (Lekcja 3) - sprawdzanie kolizji
Pętle for (Lekcja 4) - rysowanie cegieł
Listy (Lekcja 5) - cegly, kolory_cegiel
Funkcje (Lekcja 5) - draw(), update(), własne funkcje

Zobacz? Wszystko, czego się uczyłeś przez 5 lekcji, połączyło się w prawdziwą grę! 🎯✨


🎨 Dodatkowe porady i triki

🖼️ Jak stworzyć proste grafiki?

Jeśli nie masz gotowych obrazków, możesz je szybko zrobić:

W programie Paint (Windows):

  1. Utwórz nowy obraz 100×25 pikseli (dla cegły)
  2. Zamaluj na czerwono
  3. Zapisz jako PNG: cegla_czerwona.png
  4. Powtórz dla innych kolorów

Lub użyj prostych kształtów:

# Zamiast Actor możesz narysować prostokąty:
screen.draw.filled_rect(Rect(x, y, 100, 25), 'red')

🎵 Gdzie znaleźć dźwięki?

Darmowe dźwięki:

Umieść pliki w folderze sounds/:

🗂️ twoj_projekt/
   ├── arkanoid.py
   ├── 📁 images/
   └── 📁 sounds/
       ├── brick_break.wav
       ├── paddle_hit.wav
       └── game_over.wav

📊 Śledzenie najlepszego wyniku

najlepszy_wynik = 0

# Po przegranej:
if wynik > najlepszy_wynik:
    najlepszy_wynik = wynik
    print(f"🏆 NOWY REKORD! {najlepszy_wynik} punktów!")

# W draw():
screen.draw.text(f"Rekord: {najlepszy_wynik}", (10, 40),
                 color="gold", fontsize=25)

🤖 Pytaj AI o pomoc!

Jeśli coś nie działa lub chcesz dodać nową funkcję, zapytaj ChatGPT!

Przykładowe pytania:

📌 “Jak dodać dźwięk do mojej gry Pygame Zero?”
📌 “Jak zrobić power-up, który wydłuża paletkę w Arkanoid?”
📌 “Dlaczego moja piłka przechodzi przez cegły?”
📌 “Jak dodać animację rozbijającej się cegły?”
📌 “Pokaż kod na system 3 żyć w grze Arkanoid”

Magiczna formuła z Lekcji 3 działa świetnie! 🧙‍♂️


🎉 Podsumowanie - Jesteś prawdziwym twórcą gier!

Gratulacje! 🏆 Właśnie stworzyłeś swoją pierwszą kompletną grę! To niesamowite osiągnięcie!

Co dalej?

  1. Pokaż swoją grę rodzinie i przyjaciołom! 👨‍👩‍👧‍👦
  2. Dodaj własne ulepszenia z sekcji wyzwań 🚀
  3. Stwórz nowe gry - może Snake? Pac-Man? Space Invaders? 🎮
  4. Dziel się swoim kodem z innymi młodymi programistami! 💻

Pamiętaj:

  • Każdy programista zaczynał od prostych projektów
  • Gry to najlepsza metoda nauki programowania
  • Nie bój się eksperymentować - nie zepsujesz komputera! 😊
  • Każdy błąd to lekcja, nie porażka

W następnej lekcji możemy stworzyć kolejną grę lub nauczyć się nowych rzeczy - co Cię bardziej interesuje? Napisz w komentarzach! 💬


← Powrót do kursu Python Podstawowy


Stworzyłeś swoją grę? Pokaż w komentarzach! Chcemy zobaczyć Twoje dzieło! A może masz pomysł na nową funkcję? Napisz! 🎮✨


comments powered by Disqus