Panduan Seru Membuat Game Tembak Balon dengan Python dan Pygame
Halo, teman-teman! Siapa di sini yang suka bermain game? Nah, kali ini kita akan belajar cara membuat game sederhana yang pasti bikin kalian ketagihan: Game Tembak Balon! 🎈
Kenapa Harus Pygame?
Sebelum kita mulai, mungkin ada yang bertanya-tanya, “Kenapa harus menggunakan Pygame?” Pygame adalah library Python yang sangat cocok untuk membuat game. Dengan Pygame, kita bisa membuat game dengan grafis yang menarik dan kontrol yang mudah. Jadi, siap-siap ya untuk berkreasi!
Langkah Pertama: Siapkan Lingkungan Kerja
Pertama-tama, pastikan kalian sudah menginstal Python dan Pygame di komputer kalian. Jika belum, kalian bisa mengunduhnya dari situs resmi Python dan Pygame. Setelah itu, buat folder baru untuk proyek kita, misalnya gametembakbalon
.
Struktur Folder
Di dalam folder gametembakbalon
, kita akan membuat beberapa file:
gametembak.py
: Ini adalah file utama yang berisi kode game kita.high_score.txt
: File ini akan menyimpan skor tertinggi.assets/
: Folder ini akan menyimpan gambar balon yang akan kita gunakan.

Jangan lupa untuk menambahkan gambar balon ke dalam folder assets
! 🎈 unduh file balon disini
Kode Game
Sekarang, mari kita mulai menulis kode! Berikut adalah contoh kode untuk game kita:
import pygame import random import os import sys <h1>Inisialisasi Pygame</h1> pygame.init() <h1>Dimensi layar</h1> SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), pygame.RESIZABLE) pygame.display.set_caption("Game Tembak Balon") <h1>Warna</h1> WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) <h1>Menentukan path ke file balloon.png</h1> if getattr(sys, 'frozen', False): # Jika aplikasi dijalankan sebagai executable base_path = sys._MEIPASS else: # Jika dijalankan sebagai skrip Python base_path = os.path.dirname(<strong>file</strong>) balloon_image_path = os.path.join(base_path, 'assets', 'balloon.png') balloon_image = pygame.image.load(balloon_image_path) balloon_image = pygame.transform.scale(balloon_image, (50, 70)) <h1>Font untuk skor dan timer</h1> font = pygame.font.Font(None, 36) <h1>Kelas Balon</h1> class Balloon(pygame.sprite.Sprite): def <strong>init</strong>(self): super().<strong>init</strong>() self.image = balloon_image self.rect = self.image.get_rect() self.reset_position() <pre><code>def reset_position(self): # Mengatur posisi balon secara acak di layar self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width) self.rect.y = random.randint(SCREEN_HEIGHT, SCREEN_HEIGHT + 100) self.speed = random.randint(1, 3) def update(self): # Memperbarui posisi balon self.rect.y -= self.speed if self.rect.y < -self.rect.height: self.reset_position()</code></pre> <h1>Inisialisasi grup sprite</h1> balloons = pygame.sprite.Group() all_sprites = pygame.sprite.Group() <h1>Membuat balon awal</h1> for _ in range(10): balloon = Balloon() balloons.add(balloon) all_sprites.add(balloon) <h1>Skor dan timer</h1> score = 0 high_score = 0 high_score_player = "" countdown = 30 # Hitungan mundur 30 detik <h1>Memuat skor tertinggi dari file</h1> high_score_data = [] if os.path.exists("high_score.txt"): with open("high_score.txt", "r") as file: high_score_data = file.read().split(",") # Membaca data sebagai elemen daftar <h1>Pastikan ada cukup elemen sebelum mengakses</h1> if len(high_score_data) > 1: high_score = int(high_score_data[0]) high_score_player = high_score_data[1] else: high_score = 0 # Atau nilai default lainnya high_score_player = "" # Atau nilai default lainnya <h1>Memuat skor saat ini dari file (opsional)</h1> if os.path.exists("current_score.txt"): with open("current_score.txt", "r") as file: current_score = int(file.read()) else: current_score = 0 # Nilai default jika file tidak ada <h1>Fungsi untuk menampilkan layar mulai</h1> def show_start_screen(): screen.fill(WHITE) title_text = font.render("Game Tembak Balon", True, BLACK) instructions_text = font.render("Klik balon untuk mendapatkan skor!", True, BLACK) start_text = font.render("Klik untuk Mulai", True, RED) high_score_text = font.render(f"High Score: {high_score} oleh {high_score_player}", True, BLACK) screen.blit(title_text, (SCREEN_WIDTH // 2 - title_text.get_width() // 2, SCREEN_HEIGHT // 2 - 100)) screen.blit(instructions_text, (SCREEN_WIDTH // 2 - instructions_text.get_width() // 2, SCREEN_HEIGHT // 2 - 50)) screen.blit(start_text, (SCREEN_WIDTH // 2 - start_text.get_width() // 2, SCREEN_HEIGHT // 2)) screen.blit(high_score_text, (SCREEN_WIDTH // 2 - high_score_text.get_width() // 2, SCREEN_HEIGHT // 2 + 50)) pygame.display.flip() <h1>Fungsi untuk menampilkan layar akhir</h1> def show_end_screen(score, high_score, high_score_player): screen.fill(WHITE) final_score_text = font.render(f"Final Score: {score}", True, BLACK) high_score_text = font.render(f"High Score: {high_score} oleh {high_score_player}", True, BLACK) restart_text = font.render("Klik untuk Mulai Lagi", True, RED) screen.blit(final_score_text, (SCREEN_WIDTH // 2 - 100, SCREEN_HEIGHT // 2 - 50)) screen.blit(high_score_text, (SCREEN_WIDTH // 2 - 100, SCREEN_HEIGHT // 2)) screen.blit(restart_text, (SCREEN_WIDTH // 2 - restart_text.get_width() // 2, SCREEN_HEIGHT // 2 + 50)) pygame.display.flip() <h1>Fungsi untuk menampilkan layar input nama</h1> def show_name_input_screen(): screen.fill(WHITE) input_box = pygame.Rect(SCREEN_WIDTH // 2 - 100, SCREEN_HEIGHT // 2, 200, 50) color_inactive = pygame.Color('lightskyblue3') color_active = pygame.Color('dodgerblue2') color = color_inactive active = False text = '' done = False <pre><code>while not done: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() elif event.type == pygame.MOUSEBUTTONDOWN: if input_box.collidepoint(event.pos): active = not active else: active = False color = color_active if active else color_inactive elif event.type == pygame.KEYDOWN: if active: if event.key == pygame.K_RETURN: return text elif event.key == pygame.K_BACKSPACE: text = text[:-1] else: text += event.unicode screen.fill(WHITE) txt_surface = font.render(text, True, color) width = max(200, txt_surface.get_width() + 10) input_box.w = width screen.blit(txt_surface, (input_box.x + 5, input_box.y + 5)) pygame.draw.rect(screen, color, input_box, 2) # Tambahkan keterangan masukan nama instruction_text = font.render("Masukkan Nama:", True, BLACK) screen.blit(instruction_text, (SCREEN_WIDTH // 2 - instruction_text.get_width() // 2, SCREEN_HEIGHT // 2 - 30)) pygame.display.flip()</code></pre> <h1>Loop utama permainan</h1> def main_game(): global score, high_score, high_score_player # Tambahkan high_score_player di sini running = True start_ticks = pygame.time.get_ticks() # Mulai timer while running: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() elif event.type == pygame.MOUSEBUTTONDOWN: pos = pygame.mouse.get_pos() clicked_balloons = [b for b in balloons if b.rect.collidepoint(pos)] for balloon in clicked_balloons: balloon.reset_position() score += 1 elif event.type == pygame.VIDEORESIZE: global SCREEN_WIDTH, SCREEN_HEIGHT, screen SCREEN_WIDTH, SCREEN_HEIGHT = event.w, event.h screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), pygame.RESIZABLE) <pre><code> # Update balon all_sprites.update() # Hitung waktu yang tersisa seconds = (pygame.time.get_ticks() - start_ticks) / 1000 # Hitung berapa detik remaining_time = countdown - int(seconds) # Periksa apakah waktu habis if remaining_time <= 0: if score > high_score: high_score = score high_score_player = show_name_input_screen() # Simpan skor tertinggi baru ke file with open("high_score.txt", "w") as file: file.write(f"{high_score},{high_score_player}") # Simpan skor saat ini ke file with open("current_score.txt", "w") as file: file.write(str(score)) return # Kembali untuk memulai ulang permainan # Gambar semuanya screen.fill(WHITE) all_sprites.draw(screen) # Gambar skor dan timer score_text = font.render(f"Score: {score}", True, BLACK) screen.blit(score_text, (10, 10)) timer_text = font.render(f"Time: {remaining_time}", True, BLACK) screen.blit(timer_text, (SCREEN_WIDTH - 150, 10)) # Segarkan layar pygame.display.flip() # Kecepatan frame pygame.time.Clock().tick(60)</code></pre> <h1>Loop permainan dengan opsi restart</h1> while True: # Tampilkan layar mulai dan tunggu pengguna untuk mengklik untuk memulai waiting_to_start = True while waiting_to_start: show_start_screen() for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() elif event.type == pygame.MOUSEBUTTONDOWN: waiting_to_start = False <pre><code># Jalankan permainan utama main_game() # Reset skor untuk permainan baru score = 0</code></pre> <h1>Copyright audhighasu.com</h1>
Menambahkan Fitur
Setelah kita memiliki dasar game, kita bisa menambahkan berbagai fitur menarik, seperti:
- Skor: Hitung berapa banyak balon yang berhasil ditembak.
- Timer: Berikan waktu terbatas untuk menembak balon.
- Skor Tertinggi: Simpan skor tertinggi agar pemain bisa bersaing.
Uji Coba Game
Setelah semua kode ditulis, saatnya untuk menguji game kita! Jalankan file gametembak.py
dan lihat apakah semuanya berjalan dengan baik. Jika ada yang tidak berfungsi, jangan khawatir! Debugging adalah bagian dari proses belajar.


Ekspor ke Executable
Jika kalian ingin membagikan game ini kepada teman-teman, kalian bisa mengemasnya menjadi file executable menggunakan PyInstaller. Cukup jalankan perintah berikut di terminal:
pyinstaller --onefile --add-data "assets/balloon.png;assets" gametembak.py
Kesimpulan
Nah, itu dia! Sekarang kalian sudah tahu cara membuat game Tembak Balon menggunakan Python dan Pygame. Semoga panduan ini bermanfaat dan menginspirasi kalian untuk membuat game-game seru lainnya. Jangan lupa untuk berbagi hasil karya kalian dengan teman-teman!
Selamat bermain dan berkreasi! 🎮✨