Pong u Pythonu — OOP verzija i modularna igra


Lekcija 9 od 14

U prethodnim lekcijama napravili smo Pong igru koristeći promenljive i funkcije:

Sada prelazimo na napredniji pristup — objektno orijentisano programiranje (OOP).


Šta je OOP? (jednostavno objašnjenje)

OOP je način programiranja gde umesto da koristimo samo promenljive i funkcije, organizujemo kod u objekte.

Zamisli igru kao svet:

  • Lopta je objekat
  • Palica je objekat
  • Igrač je objekat
Svaki objekat ima:
  • osobine (atribute) → pozicija, brzina
  • ponašanje (metode) → kretanje, crtanje
Kratko pravilo:

Klasa = plan (šablon)
Objekat = konkretna instanca tog plana

Zašto koristiti OOP u igrama?

  • kod je organizovan i pregledan
  • svaki deo igre ima svoju logiku
  • lakše dodaješ nove funkcionalnosti
  • manje dupliranja koda

1. Klasa Paddle (palica)


class Paddle:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.width = 15
        self.height = 80
        self.speed = 0
    
    def move(self):
        self.y += self.speed
        self.y = constrain(self.y, 0, height - self.height)
    
    def show(self):
        rect(self.x, self.y, self.width, self.height)

Kako da razumeš ovu klasu?

  • self znači "ovaj objekat"
  • __init__() se poziva kada pravimo objekat
  • svaka palica ima svoju poziciju i brzinu

2. Klasa Ball (lopta)


class Ball:
    def __init__(self):
        self.reset()
        self.size = 20
    
    def move(self):
        self.x += self.dx
        self.y += self.dy
        
        if self.y < self.size/2 or self.y > height - self.size/2:
            self.dy = -self.dy
    
    def check_collision(self, paddle):
        if (self.x - self.size/2 < paddle.x + paddle.width and
            self.x + self.size/2 > paddle.x and
            self.y > paddle.y and self.y < paddle.y + paddle.height):
            
            self.dx = -self.dx
            
            # malo ubrzanje
            self.dx *= 1.05
    
    def show(self):
        ellipse(self.x, self.y, self.size, self.size)
    
    def reset(self):
        self.x = width/2
        self.y = height/2
        self.dx = random([-5,5])
        self.dy = random(-4,4)
Važno:

Lopta sada "zna" kako da:
  • se kreće
  • se odbija
  • se resetuje

3. Kreiranje objekata


left_paddle = None
right_paddle = None
ball = None

score_left = 0
score_right = 0

4. Setup funkcija


def setup():
    global left_paddle, right_paddle, ball
    
    size(700, 400)
    textSize(24)

    left_paddle = Paddle(30, height/2 - 40)
    right_paddle = Paddle(width-45, height/2 - 40)

    ball = Ball()

5. Glavna petlja igre


def draw():
    global score_left, score_right
    
    background(20)

    # Lopta
    ball.move()
    ball.check_collision(left_paddle)
    ball.check_collision(right_paddle)
    ball.show()

    # Palice
    left_paddle.move()
    right_paddle.move()
    left_paddle.show()
    right_paddle.show()

    # Poeni
    if ball.x < 0:
        score_right += 1
        ball.reset()

    if ball.x > width:
        score_left += 1
        ball.reset()

    # Score
    text(score_left, width/4, 40)
    text(score_right, width*3/4, 40)

Zašto je ovo bolje nego ranije?

  • glavni kod je kraći
  • svaki objekat radi svoj deo posla
  • lakše dodaješ nove funkcije

6. Kontrole tastature


def keyPressed():
    if key == 'w':
        left_paddle.speed = -6
    if key == 's':
        left_paddle.speed = 6

    if keyCode == UP:
        right_paddle.speed = -6
    if keyCode == DOWN:
        right_paddle.speed = 6


def keyReleased():
    if key in ['w','s']:
        left_paddle.speed = 0

    if keyCode in [UP, DOWN]:
        right_paddle.speed = 0

Objektno programiranje u Pythonu – prikaz klase i objekata (Paddle i Ball) i njihove veze u memoriji programa
Slika 1: Vizuelni prikaz OOP koncepta u Pythonu: klase (Paddle i Ball) predstavljaju plan, dok objekti (left_paddle, right_paddle, ball) predstavljaju konkretne instance u programu.

Dodatno: Razumevanje OOP (objektno programiranje)

U ovoj lekciji prvi put koristimo objektno orijentisano programiranje (OOP). Ako ti ovo deluje novo — potpuno je normalno □

OOP je način pisanja programa gde umesto da koristimo samo promenljive i funkcije, organizujemo kod kroz objekte.

Jednostavno objašnjenje:

- Klasa = plan (šablon) - Objekat = konkretna instanca tog plana
Primer iz stvarnog života:
  • Klasa: Auto
  • Objekti: BMW, Audi, Tesla

Vizuelno objašnjenje (iz realnog sveta)

Na slici (koju si video ranije u Java delu tutorijala, kao i na slici 1) vidiš razliku između:

  • stvarnih objekata (auto, drvo, avion)
  • njihovih softverskih modela (klase u programu)

U programu svaka klasa opisuje:

  • osobine (npr. brzina, veličina)
  • ponašanje (kretanje, sudar)

Ideja: Jedna klasa može napraviti više objekata (npr. više automobila ili više lopti u igri).


Kako se to koristi u našoj Pong igri?

U ovoj lekciji koristimo dve klase:

  • Paddle → predstavlja palicu
  • Ball → predstavlja loptu

To znači da:

  • svaka palica ima svoju poziciju i brzinu
  • lopta ima sopstveno kretanje i sudare
  • svaki objekat "zna" kako da se ponaša
Zašto je ovo važno?

Bez OOP-a: - sve bi bilo u jednoj funkciji □ - kod bi brzo postao haotičan Sa OOP-om: - kod je podeljen i pregledan ✅ - lakše dodaješ nove funkcije - koristi se u pravim igrama i aplikacijama

Povezivanje sa Java tutorijalom

Ako želiš dodatno objašnjenje OOP koncepta, možeš pogledati Java deo sajta:

Važno:

Java koristi OOP kao osnovu jezika, pa ako želiš dublje razumevanje:
□ Java tutorijal je odličan sledeći korak

Preporuka za početnike

Ako ti je ovo i dalje teško, vrati se na:

Savet: Ne moraš odmah savršeno razumeti OOP — dovoljno je da razumeš osnovnu ideju i nastaviš dalje.

Mali OOP izazov

  • Dodaj novu klasu PowerUp (bonus objekat)
  • Dodaj više lopti koristeći klasu Ball
  • Napraviti AI protivnika kao posebnu klasu

Ovo je sledeći korak ka pravim igrama □


Šta smo naučili?

  • šta je OOP i kako funkcioniše
  • kako napraviti klase u Pythonu
  • kako organizovati igru pomoću objekata
  • kako razdvojiti logiku na manje celine

Korisni resursi za OOP

Savet:

Ako ti je OOP težak — to je normalno. Najbolje se uči kroz projekte kao što je ovaj Pong.

Mali izazov

  • Dodaj klasu za Score
  • Dodaj AI protivnika
  • Dodaj meni (start / pause)
  • Dodaj više lopti

Sledeća lekcija

U sledećoj lekciji radimo sa listama i više objekata.

Liste i više objekata →


Povezane lekcije


Često postavljana pitanja

Šta je OOP u Pythonu?

OOP (objektno orijentisano programiranje) je način organizovanja koda pomoću klasa i objekata. Svaki objekat ima svoje podatke i funkcije.

Zašto koristiti OOP u igrama?

U igrama postoji mnogo objekata poput igrača, neprijatelja, projektila i prepreka. OOP omogućava da svaki od tih objekata ima svoju logiku.

Da li je Python Processing dobar za učenje programiranja igara?

Da. Processing omogućava jednostavno crtanje grafike i interakciju, što ga čini odličnim za početnike u programiranju igara.

Kako mogu proširiti Pong igru?

Možete dodati AI protivnika, zvuk pri sudaru lopte, nivoe težine ili grafičke efekte.