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! 🎮✨





Tinggalkan Balasan