Bedah Kode Pygame
Game sederhana: pemain menggerakkan pesawat, menembak musuh, mengumpulkan skor, dan kalah jika tersentuh musuh.
Game sederhana: pemain menggerakkan pesawat, menembak musuh, mengumpulkan skor, dan kalah jika tersentuh musuh.
Game dimulai dengan mengaktifkan Pygame, membuat layar, lalu menyimpan ukuran dan warna dalam variabel agar mudah dipakai ulang.
import pygame
import random
import sys
pygame.init()
WIDTH = 500
HEIGHT = 600
window = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Space Defender")
clock = pygame.time.Clock()
Player dibuat sebagai kotak pygame.Rect. Peluru dan musuh disimpan dalam list karena jumlahnya bisa lebih dari satu.
player = pygame.Rect(225, 530, 50, 30)
player_speed = 6
bullets = []
bullet_speed = 8
enemies = []
enemy_speed = 3
score = 0
Loop for dipakai untuk membuat 5 musuh sekaligus. Posisi X diacak, sedangkan posisi Y dimulai dari atas layar agar musuh muncul bertahap.
for i in range(5):
enemy = pygame.Rect(
random.randint(0, WIDTH - 40),
random.randint(-400, -50),
40,
40
)
enemies.append(enemy)
Selama running bernilai True, game terus membaca event, memproses input, menghitung gerakan, dan menggambar ulang layar.
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
Tombol panah kiri dan kanan mengubah posisi X player. Kondisi player.left > 0 dan player.right < WIDTH menjaga pesawat tetap di dalam layar.
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and player.left > 0:
player.x -= player_speed
if keys[pygame.K_RIGHT] and player.right < WIDTH:
player.x += player_speed
Tombol spasi membuat peluru baru. Cooldown mencegah peluru muncul terlalu cepat, sehingga tembakan terasa lebih rapi dan mudah dikontrol.
current_time = pygame.time.get_ticks()
if keys[pygame.K_SPACE]:
if current_time - last_shot >= shoot_cooldown:
bullet = pygame.Rect(
player.centerx - 3,
player.top,
6,
15
)
bullets.append(bullet)
last_shot = current_time
Setiap peluru bergerak ke atas. Jika sudah keluar layar, peluru dihapus dari list agar game tidak menyimpan objek yang tidak terlihat.
for bullet in bullets[:]:
bullet.y -= bullet_speed
if bullet.bottom < 0:
bullets.remove(bullet)
bullets[:] berarti membuat salinan list, sehingga aman saat ada elemen yang dihapus ketika loop berjalan.
Musuh bergerak turun terus-menerus. Jika melewati bawah layar, posisinya diacak lagi di atas layar untuk muncul kembali.
for enemy in enemies:
enemy.y += enemy_speed
if enemy.top > HEIGHT:
enemy.x = random.randint(0, WIDTH - enemy.width)
enemy.y = random.randint(-300, -50)
Saat peluru bertabrakan dengan musuh, peluru dihapus, skor bertambah, lalu musuh dikembalikan ke posisi acak di atas layar.
for bullet in bullets[:]:
for enemy in enemies:
if bullet.colliderect(enemy):
if bullet in bullets:
bullets.remove(bullet)
score += 10
enemy.x = random.randint(0, WIDTH - enemy.width)
enemy.y = random.randint(-300, -50)
break
Jika musuh menyentuh player, game berhenti. Setelah semua logika selesai, layar dibersihkan, objek digambar, skor ditampilkan, lalu frame dikunci di 60 FPS.
if player.colliderect(enemy):
print("GAME OVER")
running = False
window.fill(BLACK)
pygame.draw.rect(window, BLUE, player)
pygame.draw.rect(window, YELLOW, bullet)
pygame.draw.rect(window, RED, enemy)
score_text = font.render(f"Score: {score}", True, WHITE)
window.blit(score_text, (10, 10))
pygame.display.update()
clock.tick(60)