Python → Processing → Pong nivo 2
Pong nivo 2 — poeni, kraj igre i restart
Lekcija 7 od 14
U prethodnoj lekciji napravili smo osnovnu verziju igre: Mini projekat: Pong . Sada dodajemo:
- Brojanje poena
- Game over stanje
- Restart igre
1. Dodavanje promenljivih
# Lopta
ball_x = 300
ball_y = 200
dx = 4
dy = 3
ball_size = 20
# Palica
paddle_width = 100
paddle_height = 15
# Score i stanje igre
score = 0
game_over = False
Savet: Možeš eksperimentisati sa veličinama lopte, palice ili brzinom lopte.
2. Funkcija resetGame()
def resetGame():
global ball_x, ball_y, dx, dy, score, game_over
ball_x = width / 2
ball_y = height / 2
dx = 4
dy = 3
score = 0
game_over = False
□ Objašnjenje reset funkcije
Resetuje sve promenljive na početne vrednosti kada igra završi ili igrač želi restart.
3. Glavna logika igre (ORIGINAL)
def setup():
size(600, 400)
textSize(20)
def draw():
global ball_x, ball_y, dx, dy, score, game_over
background(30)
if game_over:
fill(255)
textAlign(CENTER)
text("GAME OVER", width/2, height/2)
text("Pritisni R za restart", width/2, height/2 + 40)
return
# Lopta
fill(255)
ellipse(ball_x, ball_y, ball_size, ball_size)
# Palica
rect(mouseX - paddle_width/2, height - 40,
paddle_width, paddle_height)
# Pomeranje lopte
ball_x += dx
ball_y += dy
# Odbijanje od zidova
if ball_x < ball_size/2 or ball_x > width - ball_size/2:
dx = -dx
if ball_y < ball_size/2:
dy = -dy
# Sudar sa palicom (PROBLEM ZONA)
if (ball_y > height - 50 and
mouseX - paddle_width/2 < ball_x < mouseX + paddle_width/2):
dy = -dy
score += 1
# Pad lopte (game over)
if ball_y > height:
game_over = True
# Score
fill(255)
textAlign(LEFT)
text("Score: " + str(score), 20, 30)
VAŽNO: ovde postoji logički problem koji često pravi “bug” u Pong igrama.
4. BAG / PROBLEM — zašto lopta “prođe palicu” ili se čudno ponaša?
Problem je u uslovu:
if (ball_y > height - 50 and
mouseX - paddle_width/2 < ball_x < mouseX + paddle_width/2):
Šta ovde NIJE idealno?
- Uslov za Y osu je “grub” (height - 50 nije tačna pozicija palice)
- Lopta može “preskočiti” palicu između frame-ova
- Python chaining (
a < b < c) može zbuniti logiku u igrama
Objašnjenje:
Ovaj zapis:
Ovaj zapis:
mouseX - paddle_width/2 < ball_x < mouseX + paddle_width/2
JE ISPRAVAN u Pythonu, ali u igrama je često bolji eksplicitni AND zapis.
5. ISPRAVKA — stabilan sudar (PREPORUČENO REŠENJE)
# precizniji sudar sa palicom
paddle_y = height - 40
if (
ball_y + ball_size/2 >= paddle_y and
ball_y - ball_size/2 <= paddle_y + paddle_height and
ball_x >= mouseX - paddle_width/2 and
ball_x <= mouseX + paddle_width/2
):
dy = -abs(dy)
score += 1
✔ Zašto je ovo bolje?
- uzima u obzir veličinu lopte
- koristi realnu poziciju palice
- koristi eksplicitne AND uslove (lakše debugovanje)
6. Dodaci — promašaji i GAME OVER posle 3 greške
misses = 0
max_misses = 3
# ako lopta padne
if ball_y > height:
misses += 1
resetBall()
if misses >= max_misses:
game_over = True
noLoop()
7. Random nova lopta
def resetBall():
global ball_x, ball_y, dx, dy
ball_x = random(width)
ball_y = height/2
dx = random(-4, 4)
dy = 3
8. Restart igre
def keyPressed():
global misses, game_over
if key == 'r' or key == 'R':
misses = 0
game_over = False
resetGame()
loop()
9. Šta smo unapredili?
- stabilan sudar (bez “prolaska lopte”)
- brojanje promašaja
- game over posle 3 greške
- random spawn lopte
- noLoop / loop kontrola igre
Mini ideja:
Pokušaj da ubrzaš loptu svaki put kada pogodi palicu.
Pokušaj da ubrzaš loptu svaki put kada pogodi palicu.