Menu
CoddyTech

Makin Cepat Seiring Waktu

Termasuk bagian Perulangan Game dalam perjalanan Pygame di Coddy. Pelajaran 32 dari 32.

Sebuah game menjadi semakin sulit seiring berjalannya waktu. Di sini, balok jatuh sedikit lebih cepat setiap 10 detik.

pygame.time.set_timer(event_type, ms) mengirimkan event dengan tipe tersebut setiap ms milidetik. Buat tipe event sendiri dengan pygame.USEREVENT, yaitu angka yang dibiarkan kosong oleh pygame untuk kamu gunakan:

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

Event tersebut tiba di perulangan event bersama event lainnya, sekali setiap 10 detik. Lalu, balok jatuh menggunakan block.y += fall_speed, bukan nilai tetap 3. Game baru dimulai dengan lambat lagi, jadi saat memulai ulang, fall_speed = 3 juga diatur.

challenge icon

Tantangan

Sedang
  1. Di bawah font, buat SPEED_UP = pygame.USEREVENT + 1 dan mulai timer untuknya setiap 10000 ms.
  2. Tetapkan fall_speed = 3 sebelum perulangan dan gunakan nilai itu untuk gerakan jatuh.
  3. Tambahkan 1 ke fall_speed saat event SPEED_UP tiba.
  4. Atur kembali nilainya menjadi 3 saat R memulai permainan baru.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Perulangan Game

Latihan sendiri: Playground Pygame