Menu
CoddyTech

פגיעה ואיפוס כמתודות

חלק מהיחידה פרויקטים במסלול ה-Pygame של Coddy. שיעור 21 מתוך 33.

לכדור יש עוד שתי משימות: לקפוץ ממחבט ולחזור למרכז. כשכותבים אותן כמתודות, הלולאה הראשית נקראת כמו כללי המשחק.

def reset(self):
    self.rect.center = (300, 200)
    self.vx = -self.vx

שתי הבדיקות של המחבטים נבדלות רק בכיוון שבו הכדור יוצא: ימינה מהמחבט השמאלי, שמאלה מהימני. מעבירים את הכיוון הזה כמספר, way, שהוא 1 או ‎-1, ומתודה אחת מתאימה לשניהם:

ball.hit(left, 1)
ball.hit(right, -1)

בתוך המתודה, self.vx = way * abs(self.vx) שולח את הכדור בכיוון הזה, בלי קשר לכיוון שבו הוא נע קודם, והזווית של הירייה נשארת כפי שהייתה.

challenge icon

אתגר

קשה

העבירו את הטיפול בפגיעה במחבט ואת האיפוס למחלקה Ball.

  1. כתבו hit(paddle, way): בהתנגשות, self.vx = way * abs(self.vx) ואת זווית החבטה.
  2. כתבו reset(): מרכז במיקום (300, 200) והפכו את self.vx.
  3. בלולאה, קראו ל־ball.hit(left, 1), ל־ball.hit(right, -1) ול־ball.reset() אחרי כל נקודה.

לחצו על "שחק": המשחק עדיין מתנהל באותו אופן. לאחר מכן לחצו על "בדיקה".

נסו בעצמכם

import pygame


class Ball:
    def __init__(self):
        self.rect = pygame.Rect(293, 193, 14, 14)
        self.vx = 5
        self.vy = 4

    def move(self):
        self.rect.x += self.vx
        self.rect.y += self.vy
        if self.rect.top <= 0 or self.rect.bottom >= 400:
            self.vy = -self.vy

    def draw(self, surface):
        pygame.draw.rect(surface, (255, 196, 0), self.rect)


pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 36)

ball = Ball()
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)
left_score = 0
right_score = 0
waiting = False
winner = None

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            if winner is None:
                waiting = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]:
        left.y -= 6
    if keys[pygame.K_s]:
        left.y += 6
    if keys[pygame.K_UP]:
        right.y -= 6
    if keys[pygame.K_DOWN]:
        right.y += 6
    left.clamp_ip(screen.get_rect())
    right.clamp_ip(screen.get_rect())

    if not waiting:
        ball.move()
        if ball.rect.colliderect(left):
            ball.vx = abs(ball.vx)
            ball.vy = (ball.rect.centery - left.centery) // 6
        if ball.rect.colliderect(right):
            ball.vx = -abs(ball.vx)
            ball.vy = (ball.rect.centery - right.centery) // 6
        if ball.rect.left > 600:
            left_score += 1
            ball.rect.center = (300, 200)
            ball.vx = -ball.vx
            waiting = True
        if ball.rect.right < 0:
            right_score += 1
            ball.rect.center = (300, 200)
            ball.vx = -ball.vx
            waiting = True
        if left_score == 5:
            winner = "Left player wins!"
        elif right_score == 5:
            winner = "Right player wins!"

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), left)
    pygame.draw.rect(screen, (235, 80, 80), right)
    ball.draw(screen)
    score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
    screen.blit(score, score.get_rect(center=(300, 30)))
    if winner is not None:
        message = font.render(winner, True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(300, 120)))
    elif waiting:
        message = font.render("Press Space to serve", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(300, 360)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה פרויקטים

תרגלו בעצמכם: Pygame אונליין