Mini-proyek Bagian 7: Collect-All-Coins

Proyek terakhir dalam buku ini menggabungkan setiap konsep Bagian 7: gambar pygame, input keyboard, deteksi tabrakan, list objek game, dan timing berbasis frame. Lima koin berada di layar sekaligus. Timer hitung mundur berjalan di pojok. Kumpulkan semua lima sebelum menyentuh nol untuk menang.

Yang harus dibangun

Saat program berjalan:

  1. Lima koin muncul di posisi acak di layar.
  2. Pemain (kotak biru) bergerak dengan tombol panah.
  3. Berjalan ke koin menghapusnya dan menambahkan 1 ke jumlah yang dikumpulkan.
  4. Timer hitung mundur (30 detik) ditampilkan di sudut kanan atas.
  5. Jika semua lima koin dikumpulkan sebelum timer mencapai nol, pesan hijau "You win!" memenuhi layar.
  6. Jika timer mencapai nol dengan koin yang tersisa, pesan merah "Time's up!" memenuhi layar.
  7. Kedua hasil membekukan game selama 3 detik, lalu menutup jendela.

File

projects/collect-all-coins/
    collect_all_coins.py

Satu file, tidak ada kerangka awal. Tulis dari awal.

Jalankan dengan:

python projects/collect-all-coins/collect_all_coins.py

Cara mendekatinya

  1. Buka jendela dan gerakkan pemain (sama seperti Coin Collector).
  2. Buat list lima objek pygame.Rect koin dengan posisi acak.
  3. Gambar setiap koin dalam list setiap frame.
  4. Saat bertabrakan dengan koin mana pun, hapus dari list.
  5. Tambahkan penghitung frame: tambah setiap frame, bagi dengan FPS untuk mendapatkan detik yang telah berlalu, kurangi dari 30 untuk mendapatkan sisa waktu.
  6. Gambar teks timer setiap frame.
  7. Setelah loop utama, periksa apakah list kosong (menang) atau tidak (kalah) dan tampilkan layar hasil.

Petunjuk

  • Munculkan koin dalam loop:

    coins = []
    for _ in range(5):
        x = random.randint(padding, WIDTH - padding)
        y = random.randint(padding, HEIGHT - padding)
        coins.append(pygame.Rect(x - COIN_R, y - COIN_R, COIN_R * 2, COIN_R * 2))
  • Hapus koin saat tabrakan di dalam game loop:

    coins = [c for c in coins if not player_rect.colliderect(c)]
  • Hitung sisa waktu dari penghitung frame:

    frames += 1
    time_left = TIME_LIMIT - frames // FPS

    Saat time_left <= 0, keluar dari game loop.

  • Kondisi menang: if len(coins) == 0: break di dalam game loop. Setelah loop, periksa kondisi mana yang menyebabkan keluar untuk memutuskan menang atau kalah.

  • Untuk layar hasil, isi latar belakang, render pesan besar, panggil pygame.display.flip(), lalu pygame.time.wait(3000) sebelum keluar.

List comprehension ([c for c in coins if ...]) adalah cara terbersih untuk menghapus item dari list saat mengiterasi. Menghapus item dengan loop for biasa dan remove() bisa melewatkan entri — gunakan comprehension.

Gambar koin sebagai lingkaran menggunakan center rect-nya: pygame.draw.circle(screen, YELLOW, coin_rect.center, COIN_R). Rect hanya digunakan untuk tabrakan; visualnya adalah lingkaran.

Tujuan tambahan opsional

  • Dua pemain. Tambahkan pemain kedua (tombol WASD) dengan skor mereka sendiri; yang pertama mengumpulkan tiga koin menang.
  • Batang timer. Gambar persegi panjang horizontal di bagian bawah layar yang menyusut seiring waktu habis; ubah dari hijau ke merah dalam 10 detik terakhir.
  • Ronde respawn. Setelah menang, tunggu 2 detik, munculkan lima koin baru, dan reset timer untuk ronde berikutnya. Lacak nomor ronde.

Tidak ada dari ini yang diperlukan untuk menyelesaikan proyek.

Selesai?

Saat semua lima koin bisa dikumpulkan sebelum timer habis dan layar menang muncul — proyek, dan buku, selesai.

Kamu memulai dengan print("Hello") dan mengakhirinya dengan game yang berfungsi. Setiap tutorial pygame dari sini menggunakan loop yang sama, penanganan event yang sama, pendekatan tabrakan yang sama — hanya lebih banyak objek, lebih banyak state. Buat sesuatu.