Menu
CoddyTech

פונקציית איפוס

חלק מהיחידה חוקי המשחק במסלול ה-Pygame של Coddy. שיעור 4 מתוך 29.

שחקו במשחק, צברו כמה נקודות, הפסידו, לחצו על R. המשחק החדש מתחיל עם הניקוד הישן. כל ערך שהמשחק משנה חייב לחזור לערך ההתחלתי שלו, ולעיתים קרובות שוכחים ערך אחד.

רכזו את כל הערכים ההתחלתיים בפונקציה אחת וקראו לה גם לפני המשחק הראשון וגם בלחיצה על R:

def reset():
    global player, rock, score
    player = pygame.Rect(220, 300, 40, 40)
    rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
    score = 0


reset()

השורה global חשובה. משתנה שמקצים לו ערך בתוך פונקציה שייך לפונקציה הזאת, אלא אם מציינים אחרת. בלי global, הפקודה score = 0 תיצור משתנה מקומי חדש בשם score שייעלם כשהפונקציה תסתיים, והניקוד של המשחק לא ישתנה.

עכשיו קוד האתחול של המשחק מופיע פעם אחת. כשתוסיפו בהמשך ערך, למשל מספר חיים, תוסיפו אותו במקום אחד, והוא ייכלל גם במשחק הראשון וגם בכל משחק חדש.

challenge icon

אתגר

בינוני
  1. כתבו את reset() כך שתגדיר את player, את rock ואת score לערכי ההתחלה שלהם, כאשר global player, rock, score היא השורה הראשונה שלה.
  2. קראו ל־reset() פעם אחת לפני הלולאה, במקום שלוש השורות שמגדירות אותם.
  3. בלחיצה על R, קראו ל־reset() והגדירו את המצב ל־"play".

נסו בעצמכם

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Meteor Dodge")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

player = pygame.Rect(220, 300, 40, 40)
rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
score = 0
state = "menu"

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RETURN and state == "menu":
                state = "play"
            if event.key == pygame.K_r and state == "over":
                player.x = 220
                rock.y = -24
                rock.x = random.randint(0, 456)
                state = "play"

    if state == "play":
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            player.x -= 6
        if keys[pygame.K_RIGHT]:
            player.x += 6
        player.clamp_ip(screen.get_rect())

        rock.y += 4
        if rock.top > 360:
            rock.y = -24
            rock.x = random.randint(0, 456)
            score += 1
        if rock.colliderect(player):
            state = "over"

    screen.fill((30, 30, 46))
    if state == "menu":
        title = font.render("Meteor Dodge", True, (240, 240, 240))
        screen.blit(title, title.get_rect(center=(240, 140)))
        hint = font.render("Press Enter to play", True, (240, 240, 240))
        screen.blit(hint, hint.get_rect(center=(240, 200)))
    else:
        pygame.draw.rect(screen, (255, 196, 0), player)
        pygame.draw.rect(screen, (235, 80, 80), rock)
        score_text = font.render(f"Score: {score}", True, (240, 240, 240))
        screen.blit(score_text, (10, 10))
        if state == "over":
            message = font.render("Game over", True, (240, 240, 240))
            screen.blit(message, message.get_rect(center=(240, 160)))
            hint = font.render("Press R to play again", True, (240, 240, 240))
            screen.blit(hint, hint.get_rect(center=(240, 200)))
    pygame.display.flip()
    clock.tick(60)

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

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

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

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