Pong u Pythonu — OOP verzija i modularna igra
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.
- Lopta je objekat
- Palica je objekat
- Igrač je objekat
- osobine (atribute) → pozicija, brzina
- ponašanje (metode) → kretanje, crtanje
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?
selfznač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)
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
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.
- 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
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:
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:
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
- Uvod u funkcije (osnova za OOP)
- Opseg promenljivih (global vs local)
- Python classes (zvanična dokumentacija)
- W3Schools — Python klase
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
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.