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:
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.

Povezane lekcije