Menu
CoddyTech

ציד אבני חן

חלק מהיחידה לולאת המשחק במסלול ה-Pygame של Coddy. שיעור 17 מתוך 32.

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

הציבו את הארגז על אבן החן על ידי הגדרת המרכז שלו למרכז אבן החן: crate.center = gem.center. עשו זאת לפני הלולאה ובכל פעם שמופיעה אבן חן חדשה.

מדדו את הזמן בפריימים. בקצב של 60 פריימים בשנייה, 30 שניות הן 1800 פריימים:

time_left = 1800

while running:
    # אירועים
    if time_left > 0:
        time_left -= 1

כאשר time_left מגיע ל-0, המשחק מפסיק לקבל לחיצות וגרירות, ושורת הניקוד מציגה את התוצאה. הוסיפו and time_left > 0 לבדיקות של MOUSEBUTTONDOWN ושל MOUSEMOTION.

פס בחלק העליון מציג את הזמן שנותר. הרוחב שלו מייצג את החלק שנותר מהסבב: 480 * time_left // 1800 הוא 480 בתחילת הסבב, 240 באמצע ו-0 בסופו.

challenge icon

אתגר

בינוני
  1. לאחר יצירת התיבה, הגדר crate.center = gem.center. בצע את אותו הדבר לאחר שלפנינה שנאספה נקבע מיקום חדש.
  2. לפני הלולאה, הגדר time_left = 1800. בלולאה, אחרי האירועים, הפחת ממנו 1 כל עוד הוא גדול מ־0.
  3. טפל ב־MOUSEBUTTONDOWN וב־MOUSEMOTION רק כאשר time_left > 0.
  4. אחרי שורת הניקוד, צייר את סרגל הזמן: בירוק (120, 200, 120) במיקום (0, 0, 480 * time_left // 1800, 6).

נסו בעצמכם

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Gem Hunt")
clock = pygame.time.Clock()

gem = pygame.Rect(225, 165, 30, 30)
crate = pygame.Rect(40, 230, 60, 60)
dragging = False
score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if crate.collidepoint(event.pos):
                dragging = True
            elif gem.collidepoint(event.pos):
                score += 1
                gem.x = random.randint(15, 435)
                gem.y = random.randint(55, 315)
        elif event.type == pygame.MOUSEBUTTONUP:
            dragging = False
        elif event.type == pygame.MOUSEMOTION and dragging:
            crate.move_ip(event.rel)

    screen.fill((30, 30, 46))
    gem_points = [gem.midtop, gem.midright, gem.midbottom, gem.midleft]
    pygame.draw.polygon(screen, (80, 220, 255), gem_points)
    if gem.collidepoint(pygame.mouse.get_pos()):
        pygame.draw.rect(screen, (255, 196, 0), gem.inflate(10, 10), 2)
    pygame.draw.rect(screen, (150, 100, 50), crate)
    pygame.draw.rect(screen, (110, 70, 35), crate, 3)
    for i in range(score):
        pygame.draw.rect(screen, (240, 110, 180), (10 + 10 * i, 14, 8, 8))
    mouse_x, mouse_y = pygame.mouse.get_pos()
    pygame.draw.circle(screen, (240, 240, 240), (mouse_x, mouse_y), 10, 2)
    pygame.display.flip()
    clock.tick(60)

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

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

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

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