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:
- Lima koin muncul di posisi acak di layar.
- Pemain (kotak biru) bergerak dengan tombol panah.
- Berjalan ke koin menghapusnya dan menambahkan 1 ke jumlah yang dikumpulkan.
- Timer hitung mundur (30 detik) ditampilkan di sudut kanan atas.
- Jika semua lima koin dikumpulkan sebelum timer mencapai nol, pesan hijau "You win!" memenuhi layar.
- Jika timer mencapai nol dengan koin yang tersisa, pesan merah "Time's up!" memenuhi layar.
- 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
- Buka jendela dan gerakkan pemain (sama seperti Coin Collector).
- Buat list lima objek
pygame.Rectkoin dengan posisi acak. - Gambar setiap koin dalam list setiap frame.
- Saat bertabrakan dengan koin mana pun, hapus dari list.
- Tambahkan penghitung frame: tambah setiap frame, bagi dengan
FPSuntuk mendapatkan detik yang telah berlalu, kurangi dari 30 untuk mendapatkan sisa waktu. - Gambar teks timer setiap frame.
- 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 // FPSSaat
time_left <= 0, keluar dari game loop.Kondisi menang:
if len(coins) == 0: breakdi 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(), lalupygame.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.