Menu
CoddyTech

تزايد السرعة مع الوقت

جزء من قسم حلقة اللعبة في رحلة Pygame على Coddy. الدرس 32 من 32.

تزداد صعوبة اللعبة مع استمرارها. هنا تسقط الكتل بسرعة أكبر قليلًا كل 10 ثوانٍ.

تُرسل pygame.time.set_timer(event_type, ms) حدثًا من ذلك النوع كل ms مللي ثانية. أنشئ نوع حدث خاصًا بك باستخدام pygame.USEREVENT، وهو رقم يتركه pygame متاحًا لك:

SPEED_UP = pygame.USEREVENT + 1
pygame.time.set_timer(SPEED_UP, 10000)
fall_speed = 3

for event in pygame.event.get():
    if event.type == SPEED_UP:
        fall_speed += 1

يصل الحدث إلى حلقة الأحداث مع الأحداث الأخرى، مرة كل 10 ثوانٍ. بعد ذلك تسقط الكتلة باستخدام block.y += fall_speed بدلًا من سرعة ثابتة مقدارها 3. تبدأ اللعبة الجديدة ببطء مجددًا، لذا تعيّن إعادة التشغيل أيضًا fall_speed = 3.

challenge icon

التحدي

متوسط
  1. أسفل الخط، عيّن SPEED_UP = pygame.USEREVENT + 1 وابدأ مؤقّتًا له كل 10000 مللي ثانية.
  2. عيّن fall_speed = 3 قبل الحلقة واستخدمه للسقوط.
  3. أضف 1 إلى fall_speed عند وصول حدث SPEED_UP.
  4. أعِده إلى 3 عندما يبدأ المفتاح R لعبة جديدة.

جرّب بنفسك

import random
import pygame

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

basket = pygame.Rect(200, 330, 80, 16)
block = pygame.Rect(220, 0, 20, 20)
score = 0
lives = 3
paused = False

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_p:
                paused = not paused
            elif event.key == pygame.K_r and (lives == 0 or score == 10):
                score = 0
                lives = 3
                basket.x = 200
                block.y = -20
                block.x = random.randint(0, 460)

    if lives > 0 and score < 10 and not paused:
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            basket.x -= 8
        if keys[pygame.K_RIGHT]:
            basket.x += 8
        basket.clamp_ip(screen.get_rect())

        block.y += 3
        if block.top > 360:
            block.y = -20
            block.x = random.randint(0, 460)
            lives -= 1
        if block.colliderect(basket):
            block.y = -20
            block.x = random.randint(0, 460)
            score += 1

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), basket)
    pygame.draw.rect(screen, (235, 80, 80), block)
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    lives_text = font.render(f"Lives: {lives}", True, (240, 240, 240))
    screen.blit(lives_text, (370, 10))
    if lives == 0:
        message = font.render("Game over", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(240, 160)))
    elif score == 10:
        message = font.render("You win!", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(240, 160)))
    if lives == 0 or score == 10:
        again = font.render("Press R to play again", True, (240, 240, 240))
        screen.blit(again, again.get_rect(center=(240, 200)))
    if paused:
        message = font.render("Paused", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(240, 160)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس حلقة اللعبة

تدرّب بنفسك: Playground لـ Pygame