Merhaba genç kodlayıcı! 👾 Bugün seninle birlikte bilgisayarımızın karşısına geçecek ve kendi uzay oyunumuzu baştan sona kodlayacağız. Bu oyunda bir uzay gemisini yönetecek, üzerimize düşen meteorları vuracak ve en yüksek puanı toplamaya çalışacağız.
Python ve Pygame Zero kullanarak yapacağımız bu harika oyunun kodlarını adım adım öğreneceğiz. Her şeyin nasıl çalıştığını anladıktan sonra, sayfanın en altındaki tüm kodları kopyalayıp kendi oyununu hemen çalıştırabilirsin. Hazırsan uzay maceramız başlasın! ✨
Bölüm 1: Sahneyi Hazırlamak ve Oyuncuları Tanıtmak 🎬
Tüm Dosyaları aşağıdaki linkten indirebilirsin…
Bir tiyatro oyunu düşün. Önce sahnenin büyüklüğüne karar veririz, sonra da oyuncuları sahneye davet ederiz. Kodlamada da aynı şeyi yapıyoruz!
Önce ekranımızın boyutunu belirliyoruz ve Actor (Aktör) diyerek oyunumuzdaki karakterleri (gemimizi, meteoru ve ateşi) yaratıyoruz. Ayrıca oyunun durumunu takip etmek için bazı değişkenlere ihtiyacımız var: Puanımız kaç? Ateş ettik mi? Oyun bitti mi?
Python
import random
WIDTH = 600
HEIGHT = 600
# Aktörler (Oyuncularımız)
gemi = Actor("gemi")
gemi.pos = (300, 550) # Geminin başlangıç yeri
meteor = Actor("meteor")
meteor.pos = (random.randint(50, 550), -50) # Meteor yukarıdan rastgele bir yerden düşsün
fire = Actor("fire")
fire.pos = (-100, -100) # Ateşi şimdilik ekran dışına saklıyoruz
background=Actor('background')
# Oyun Değişkenleri (Oyunun kurallarını tutan kutucuklar)
ates_var_mi = False
puan = 0
oyun_bitti = False
Bölüm 2: Karakterleri Ekranda Çizmek 🎨
Karakterleri tanımladık ama onları ekranda görmek için çizmemiz gerekiyor. Pygame Zero’da bunun için draw() (çiz) adında özel bir bölüm (fonksiyon) vardır. Oyun bitmediyse gemiyi ve meteoru çiziyoruz. Eğer oyun bittiyse, ekranı kırmızı yapıp kocaman bir OYUN BİTTİ yazısı çıkarıyoruz!
Python
def draw():
screen.clear()
background.draw() # Arka planı çiz
if not oyun_bitti: # Eğer oyun bitmediyse bunları yap
gemi.draw()
meteor.draw()
if ates_var_mi:
fire.draw() # Eğer ateş edildiyse lazeri çiz
# Puanı ekranın sol üst köşesine yazdır
screen.draw.text(f"Puan: {puan}", (20, 20), fontsize=40, color="white")
else:
# Oyun bittiğinde burası çalışır
screen.fill((200, 0, 0)) # Ekranı kırmızı yap
screen.draw.text("OYUN BITTI", center=(300, 250), fontsize=80, color="white")
screen.draw.text(f"Toplam Puan: {puan}", center=(300, 350), fontsize=50, color="yellow")
screen.draw.text("Yeniden başlamak için 'R' tuşuna bas", center=(300, 450), fontsize=30, color="white")
Bölüm 3: Oyuna Hareket Katmak 🏃♂️
Sırada en eğlenceli kısım var: Hareket! update() (güncelle) fonksiyonu oyun çalıştığı sürece saniyede defalarca kez çalışır. Gemimizi sağ ve sol ok tuşlarıyla hareket ettireceğiz. Ayrıca meteorun sürekli aşağı doğru düşmesini sağlayacağız. Eğer meteor ekranın en altından dışarı çıkarsa, maalesef oyunu kaybederiz!
Python
def update():
global ates_var_mi, puan, oyun_bitti # Oyunun her yerinden bu bilgilere ulaşmak için global diyoruz
if oyun_bitti:
if keyboard.r: # Eğer R tuşuna basılırsa oyunu sıfırla
sifirla()
return # Oyun bittiyse aşağıdaki kodları okuma, burada dur!
# 1. Gemi Kontrolü (Sağ ve Sol ok tuşları)
if keyboard.left and gemi.left > 0:
gemi.x -= 5
if keyboard.right and gemi.right < WIDTH:
gemi.x += 5
# 2. Meteor Hareketi ve Sınır Kontrolü
meteor.y += 5 # Meteor her adımda 5 birim aşağı iner
if meteor.top > HEIGHT: # Meteor alt çizgiyi geçerse
oyun_bitti = True
Bölüm 4: Hedefi Vurmak ve Puan Kazanmak 🎯
Şimdi de Boşluk (Space) tuşuna basarak ateş edelim! Ateşimiz meteora değerse (buna colliderect yani çarpışma diyoruz), 10 puan kazanacağız ve gökyüzünden yeni bir meteor düşmeye başlayacak. Dikkat et, eğer meteor gemimize değerse oyun biter!
(Not: Bu kodlar Bölüm 3’teki update fonksiyonunun devamıdır.)
Python
# 3. Ateş Etme
if keyboard.space and not ates_var_mi:
fire.pos = gemi.pos # Ateşin çıkış yeri geminin olduğu yerdir
ates_var_mi = True
if ates_var_mi:
fire.y -= 12 # Lazer hızlıca yukarı gider
if fire.bottom < 0:
ates_var_mi = False # Ateş ekrandan çıkınca kaybolur
# 4. Çarpışma: Ateş Meteora Değerse
if fire.colliderect(meteor): # Vurduk!
puan += 10 # Puan ekle
meteor.pos = (random.randint(50, 550), -50) # Yeni meteor yolla
fire.pos = (-100, -100) # Lazer kaybolsun
ates_var_mi = False
# 5. Çarpışma: Meteor Gemiye Değerse
if gemi.colliderect(meteor): # Eyvah, çarptık!
oyun_bitti = True
Bölüm 5: İkinci Bir Şans (Oyunu Sıfırlamak) 🔄
Oyun bittikten sonra tekrar oynamak isteyebiliriz. Bölüm 3’te eğer “R” tuşuna basarsak sifirla() adında bir kodun çalışacağını söylemiştik. İşte o kod burada! Puanı sıfırlar, gemiyi ve meteoru ilk yerlerine geri gönderir.
Python
def sifirla():
"""Oyunu başlangıç haline getirir"""
global puan, oyun_bitti, ates_var_mi
puan = 0
oyun_bitti = False
ates_var_mi = False
gemi.pos = (300, 550)
meteor.pos = (random.randint(50, 550), -50)
🚀 Bütün Kodlar Tek Bir Yerde!
İşte oyunumuzun tam hali! Bu kodları Python dosyana yapıştır, karakter resimlerini (gemi.png, meteor.png, fire.png, background.png) images adlı klasörün içine koymayı unutma ve oyunun tadını çıkar!
Python
import random
WIDTH = 600
HEIGHT = 600
# Aktörler
gemi = Actor("gemi")
gemi.pos = (300, 550)
meteor = Actor("meteor")
meteor.pos = (random.randint(50, 550), -50)
fire = Actor("fire")
fire.pos = (-100, -100)
background=Actor('background')
# Oyun Değişkenleri
ates_var_mi = False
puan = 0
oyun_bitti = False
def draw():
screen.clear()
background.draw()
if not oyun_bitti:
gemi.draw()
meteor.draw()
if ates_var_mi:
fire.draw()
# Puanı ekrana yazdır
screen.draw.text(f"Puan: {puan}", (20, 20), fontsize=40, color="white")
else:
# Oyun bitti ekranı
screen.fill((200, 0, 0)) # Ekranı kırmızı yap
screen.draw.text("OYUN BITTI", center=(300, 250), fontsize=80, color="white")
screen.draw.text(f"Toplam Puan: {puan}", center=(300, 350), fontsize=50, color="yellow")
screen.draw.text("Yeniden başlamak için 'R' tuşuna bas", center=(300, 450), fontsize=30, color="white")
def update():
global ates_var_mi, puan, oyun_bitti
if oyun_bitti:
if keyboard.r: # R tuşu ile oyunu sıfırla
sifirla()
return # Oyun bittiyse diğer hareketleri hesaplama
# 1. Gemi Kontrolü
if keyboard.left and gemi.left > 0:
gemi.x -= 5
if keyboard.right and gemi.right < WIDTH:
gemi.x += 5
# 2. Meteor Hareketi ve Sınır Kontrolü
meteor.y += 5
if meteor.top > HEIGHT: # Meteor alt çizgiyi geçerse
oyun_bitti = True
# 3. Ateş Etme
if keyboard.space and not ates_var_mi:
fire.pos = gemi.pos
ates_var_mi = True
if ates_var_mi:
fire.y -= 12
if fire.bottom < 0:
ates_var_mi = False
# 4. Çarpışma: Ateş Meteora Değerse
if fire.colliderect(meteor):
puan += 10 # Puan ekle
meteor.pos = (random.randint(50, 550), -50)
fire.pos = (-100, -100)
ates_var_mi = False
# 5. Çarpışma: Meteor Gemiye Değerse
if gemi.colliderect(meteor):
oyun_bitti = True
def sifirla():
"""Oyunu başlangıç haline getirir"""
global puan, oyun_bitti, ates_var_mi
puan = 0
oyun_bitti = False
ates_var_mi = False
gemi.pos = (300, 550)
meteor.pos = (random.randint(50, 550), -50)