Menu
CoddyTech

פגיעה ואיפוס כשיטות

שיעור 39 מתוך 41 בקורס צרו משחקים עם Pygame של Coddy.

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

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

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