Menu
CoddyTech
flag Ar iconالعربيةdown icon

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

الدرس 18 من 40 في دورة اصنع ألعابًا باستخدام Pygame على Coddy.

تصبح اللعبة أصعب مع استمرارها. هنا تسقط الكتل أسرع قليلًا كل 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اختبر نفسك

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

جميع دروس اصنع ألعابًا باستخدام Pygame

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