12. Pygame ile bir tetris oyunu kodla.
Pygame ile Tetris Oyunu Kodlama: Adım Adım Rehber
nnBu makalede, popüler oyun geliştirme kütüphanesi Pygame kullanarak nasıl bir Tetris oyunu oluşturacağınızı adım adım göstereceğim. Hem yeni başlayanlar hem de Pygame deneyimi olanlar için uygun bir rehber olacak. Amacımız, temel Tetris mekaniklerini içeren oynanabilir bir oyun yaratmak.
nnGereksinimler
nnBaşlamadan önce, aşağıdaki gereksinimlerin karşılandığından emin olun:
nn- n
- Python 3 kurulu olmalı. n
- Pygame kütüphanesi kurulu olmalı. Kurulum için şu komutu kullanabilirsiniz:
pip install pygame
n
Oyunun Temel Yapısı
nnTetris oyunumuzun temel bileşenleri şunlardır:
nn- n
- Oyun alanı (grid): Tetris taşlarının yerleştirildiği alan. n
- Taşlar (tetrominoes): Dönen ve düşen şekiller. n
- Oyun döngüsü (game loop): Oyunun sürekli çalışmasını sağlayan döngü. n
- Kullanıcı girdisi (user input): Oyuncunun taşları hareket ettirmesini sağlayan girdiler. n
Adım 1: Pygame'i Başlatma ve Pencere Oluşturma
nnİlk adım olarak Pygame'i başlatmalı ve oyun penceresini oluşturmalıyız.
nnnnimport pygamenimport randomnn# Ekran boyutlarıngenislik = 800nyukseklik = 700nboyut = (genislik, yukseklik)nn# Renklernsiyah = (0, 0, 0)nbeyaz = (255, 255, 255)nkirmizi = (255, 0, 0)nmavi = (0, 0, 255)nyesil = (0, 255, 0)nsari = (255, 255, 0)nn# Pygame'i başlatnpygame.init()nn# Ekranı oluşturnekran = pygame.display.set_mode(boyut)npygame.display.set_caption("Pygame Tetris")nn# Oyun döngüsü için değişkenlernyapiliyor = Truensaat = pygame.time.Clock()nn# Oyun döngüsünwhile yapiliyor:n for event in pygame.event.get():n if event.type == pygame.QUIT:n yapiliyor = Falsenn # Ekranı temizlen ekran.fill(siyah)nn # Çizim işlemleri buraya gelecekn pygame.display.flip()nn # FPS ayarın saat.tick(60)nn# Pygame'i kapatnpygame.quit()n
n
nnBu kod, Pygame'i başlatır, bir pencere oluşturur ve basit bir oyun döngüsü kurar. Şimdilik sadece pencereyi temizliyor ve güncelliyor. Oyunun ana mantığı bu döngü içinde yer alacak.
nnAdım 2: Tetrominoes (Taşlar) Tanımlama
nnTetris'te 7 farklı taş (tetromino) bulunur. Her bir taşı, bir dizi koordinatla temsil edebiliriz. Bu koordinatlar, taşın oyun alanındaki konumunu belirler.
nnnn# Taşların tanımları (koordinatlar)nsekiller = [n [[1, 5, 9, 13], [4, 5, 6, 7]], # In [[4, 5, 9, 10], [2, 6, 5, 9]], # Zn [[6, 7, 9, 10], [1, 5, 6, 10]], # Sn [[1, 2, 5, 9], [0, 4, 5, 6], [1, 5, 9, 8], [4, 5, 6, 10]], # Ln [[1, 2, 6, 10], [5, 6, 4, 8], [1, 5, 9, 8], [0, 4, 5, 6]], # Jn [[1, 2, 5, 6]], # On [[1, 4, 5, 6], [1, 4, 5, 9], [4, 5, 6, 9], [1, 5, 6, 9]] # Tn]nn# Taş renklerinrenkler = [n (0, 255, 255), # Cyan (I)n (255, 0, 0), # Red (Z)n (0, 255, 0), # Green (S)n (255, 165, 0), # Orange (L)n (0, 0, 255), # Blue (J)n (255, 255, 0), # Yellow (O)n (128, 0, 128) # Purple (T)n]n
n
nnBurada, her bir şekil için olası rotasyonları da tanımladık. Örneğin, 'I' şekli için iki farklı rotasyon var.
nnAdım 3: Oyun Alanı (Grid) Oluşturma
nnOyun alanı, taşların yerleştirildiği 2 boyutlu bir dizidir. Bu diziyi, her bir hücrenin boş (0) veya dolu (bir taşın rengi) olduğunu gösteren sayılarla dolduracağız.
nnnn# Oyun alanı boyutlarınalan_genisligi = 10nalan_yuksekligi = 20nn# Oyun alanını oluşturnalan = [[0 for _ in range(alan_genisligi)] for _ in range(alan_yuksekligi)]nn# Oyun alanını çizme fonksiyonundef ciz_alan(alan, ekran):n for i in range(alan_yuksekligi):n for j in range(alan_genisligi):n pygame.draw.rect(ekran, gri, [j * 30, i * 30, 30, 30], 1) # Kenarlıkları çizn if alan[i][j] != 0:n pygame.draw.rect(ekran, renkler[alan[i][j]-1], [j * 30 + 1, i * 30 + 1, 28, 28], 0) # Dolu hücreleri çiznn# Gri renk (kenarlıklar için)ngri = (128, 128, 128)n
n
nnBu kod, oyun alanını oluşturur ve ciz_alan
fonksiyonu ile ekrana çizer. Şimdilik sadece boş bir alan çiziyoruz.
Adım 4: Düşen Taşı Oluşturma ve Hareket Ettirme
nnOyunun en önemli parçalarından biri, düşen taşı oluşturmak ve hareket ettirmektir. Yeni bir taş oluşturduğumuzda, onu oyun alanının en üstüne yerleştireceğiz. Ardından, onu aşağı doğru hareket ettireceğiz. Kullanıcı girdisiyle de sola, sağa veya aşağı hareket ettirebiliriz.
nnnn# Düşen taş sınıfınclass DusenTas:n def __init__(self):n self.x = alan_genisligi // 2 - 2n self.y = 0n self.sekil_indeksi = random.randint(0, len(sekiller) - 1)n self.sekil = sekiller[self.sekil_indeksi][0]n self.renk = renkler[self.sekil_indeksi]nn def dondur(self):n eski_sekil = self.sekiln eski_indeks = sekiller[self.sekil_indeksi].index(self.sekil)n yeni_indeks = (eski_indeks + 1) % len(sekiller[self.sekil_indeksi])n self.sekil = sekiller[self.sekil_indeksi][yeni_indeks]n if not self.gecerli_konum(alan):n self.sekil = eski_sekil # Döndürme geçersizse eski haline geri dönnn def gecerli_konum(self, alan):n for i, satir in enumerate(self.sekil):n for j, hucre in enumerate(satir):n if hucre:n p = self.x + jn q = self.y + in if p = alan_genisligi or q >= alan_yuksekligi or alan[q][p] != 0:n return Falsen return Truenn def hareket_et(self, dx, dy, alan):n self.x += dxn self.y += dyn if not self.gecerli_konum(alan):n self.x -= dxn self.y -= dyn return False # Hareket geçersizse False döndürn return True # Hareket geçerliyse True döndürnn# Yeni bir taş oluşturndusen_tas = DusenTas()nn# Taşın düşme hızındusme_hizi = 0.05nn# Son düşme zamanınson_dusme = pygame.time.get_ticks()n
n
nnBu kod, DusenTas
sınıfını tanımlar. Bu sınıf, taşın konumunu, şeklini ve rengini tutar. Ayrıca, taşı döndürme ve hareket ettirme fonksiyonlarını da içerir. gecerli_konum
fonksiyonu, taşın oyun alanı içinde kalmasını ve diğer taşlarla çakışmamasını sağlar.
Adım 5: Kullanıcı Girdisi İşleme
nnKullanıcı girdisi, oyuncunun taşı hareket ettirmesini ve döndürmesini sağlar. Pygame'in olay işleme sistemi ile klavye girişlerini yakalayabiliriz.
nnnn # Oyun döngüsünün içinden for event in pygame.event.get():n if event.type == pygame.QUIT:n yapiliyor = Falsenn if event.type == pygame.KEYDOWN:n if event.key == pygame.K_LEFT:n dusen_tas.hareket_et(-1, 0, alan)n elif event.key == pygame.K_RIGHT:n dusen_tas.hareket_et(1, 0, alan)n elif event.key == pygame.K_DOWN:n dusen_tas.hareket_et(0, 1, alan)n elif event.key == pygame.K_UP:n dusen_tas.dondur()n
n
nnBu kod, sol, sağ, aşağı ve yukarı ok tuşlarına basıldığında taşı hareket ettirir veya döndürür.
nnAdım 6: Taşı Sabitleme ve Yeni Taş Oluşturma
nnTaş, oyun alanının en altına ulaştığında veya başka bir taşla temas ettiğinde, sabitlenmelidir. Sabitlenen taş, oyun alanına eklenir ve yeni bir taş oluşturulur.
nnnn# Taş sabitleme fonksiyonundef sabitle_tas(alan, tas):n for i, satir in enumerate(tas.sekil):n for j, hucre in enumerate(satir):n if hucre:n alan[tas.y + i][tas.x + j] = tas.sekil_indeksi + 1nn# Oyun döngüsünün içinde, düşme zamanı kontrolünden sonran if pygame.time.get_ticks() - son_dusme > dusme_hizi * 1000:n if not dusen_tas.hareket_et(0, 1, alan):n sabitle_tas(alan, dusen_tas)n dusen_tas = DusenTas()n son_dusme = pygame.time.get_ticks()n
n
nnBu kod, sabitle_tas
fonksiyonu ile taşı oyun alanına ekler ve ardından yeni bir taş oluşturur.
Adım 7: Satırları Temizleme
nnTamamlanmış satırları temizlemek, oyunun önemli bir parçasıdır. Tamamlanmış bir satır, tamamen dolu olan bir satırdır. Bu satırları temizlediğimizde, üstteki satırları aşağı kaydırırız ve oyuncuya puan veririz.
nnnn# Satır temizleme fonksiyonundef temizle_satirlar(alan):n temizlenen_satir_sayisi = 0n i = alan_yuksekligi - 1n while i >= 0:n if all(alan[i][j] != 0 for j in range(alan_genisligi)):n del alan[i]n alan.insert(0, [0 for _ in range(alan_genisligi)])n temizlenen_satir_sayisi += 1n else:n i -= 1n return temizlenen_satir_sayisinn# Oyun döngüsünün içinde, taş sabitlendikten sonran temizlenen_satir_sayisi = temizle_satirlar(alan)n # Puanlama sistemi buraya eklenebilir (örneğin, temizlenen_satir_sayisi * 100)n
n
nnBu kod, temizle_satirlar
fonksiyonu ile tamamlanmış satırları temizler ve üstteki satırları aşağı kaydırır. Ayrıca, temizlenen satır sayısını döndürür, böylece puanlama sistemi ekleyebiliriz.
Adım 8: Oyun Sonu Kontrolü
nnOyunun bitip bitmediğini kontrol etmek için, yeni bir taş oluşturulduğunda oyun alanının en üstünde boş yer olup olmadığını kontrol etmeliyiz. Eğer yoksa, oyun bitmiştir.
nnnn# Oyun sonu kontrolündef oyun_sonu(alan):n return any(alan[0][j] != 0 for j in range(alan_genisligi))nn# Oyun döngüsünün içinde, yeni taş oluşturulmadan öncen if oyun_sonu(alan):n yapiliyor = Falsen print("Oyun Bitti!")n
n
nnBu kod, oyun_sonu
fonksiyonu ile oyunun bitip bitmediğini kontrol eder. Oyun bittiyse, oyun döngüsünü sonlandırır ve ekrana "Oyun Bitti!" mesajını yazdırır.
Adım 9: Tam Kod ve İyileştirmeler
nnYukarıdaki adımları bir araya getirdiğimizde, temel bir Tetris oyunu elde ederiz. Ancak, bu oyun hala geliştirilebilir. Örneğin:
nn- n
- Puanlama sistemi ekleyebiliriz. n
- Grafikleri iyileştirebiliriz. n
- Ses efektleri ekleyebiliriz. n
- Zorluk seviyesini ayarlayabiliriz. n
- Oyunun daha akıcı çalışmasını sağlayabiliriz. n
Aşağıda tam kod bulunmaktadır (yukarıdaki parçaların birleştirilmiş hali):
nnnnimport pygamenimport randomnn# Ekran boyutlarınGENISLIK = 800nYUKSEKLIK = 700nBOYUT = (GENISLIK, YUKSEKLIK)nn# Oyun alanı boyutlarınALAN_GENISLIGI = 10nALAN_YUKSEKLIGI = 20nBLOK_BOYUTU = 30nn# RenklernSIYAH = (0, 0, 0)nBEYAZ = (255, 255, 255)nKIRMIZI = (255, 0, 0)nMAVI = (0, 0, 255)nYESIL = (0, 255, 0)nSARI = (255, 255, 0)nMOR = (128, 0, 128)nCIYAN = (0, 255, 255)nGRİ = (128, 128, 128)nn# Taşların tanımları (koordinatlar)nSEKILLER = [n [[1, 5, 9, 13], [4, 5, 6, 7]], # In [[4, 5, 9, 10], [2, 6, 5, 9]], # Zn [[6, 7, 9, 10], [1, 5, 6, 10]], # Sn [[1, 2, 5, 9], [0, 4, 5, 6], [1, 5, 9, 8], [4, 5, 6, 10]], # Ln [[1, 2, 6, 10], [5, 6, 4, 8], [1, 5, 9, 8], [0, 4, 5, 6]], # Jn [[1, 2, 5, 6]], # On [[1, 4, 5, 6], [1, 4, 5, 9], [4, 5, 6, 9], [1, 5, 6, 9]] # Tn]nn# Taş renklerinRENKLER = [n CIYAN, # Cyan (I)n KIRMIZI, # Red (Z)n YESIL, # Green (S)n (255, 165, 0), # Orange (L)n MAVI, # Blue (J)n SARI, # Yellow (O)n MOR # Purple (T)n]nn# Pygame'i başlatnpygame.init()nn# Ekranı oluşturnekran = pygame.display.set_mode(BOYUT)npygame.display.set_caption("Pygame Tetris")nn# Oyun alanı oluşturmandef alan_olustur():n return [[0 for _ in range(ALAN_GENISLIGI)] for _ in range(ALAN_YUKSEKLIGI)]nn# Oyun alanınalan = alan_olustur()nn# Düşen taş sınıfınclass DusenTas:n def __init__(self):n self.x = ALAN_GENISLIGI // 2 - 2n self.y = 0n self.sekil_indeksi = random.randint(0, len(SEKILLER) - 1)n self.sekil = SEKILLER[self.sekil_indeksi][0]n self.renk = RENKLER[self.sekil_indeksi]nn def dondur(self):n eski_sekil = self.sekiln eski_indeks = SEKILLER[self.sekil_indeksi].index(self.sekil)n yeni_indeks = (eski_indeks + 1) % len(SEKILLER[self.sekil_indeksi])n self.sekil = SEKILLER[self.sekil_indeksi][yeni_indeks]n if not self.gecerli_konum(alan):n self.sekil = eski_sekil # Döndürme geçersizse eski haline geri dönnn def gecerli_konum(self, alan):n for i, satir in enumerate(self.sekil):n for j, hucre in enumerate(satir):n if hucre:n p = self.x + jn q = self.y + in if p = ALAN_GENISLIGI or q = ALAN_YUKSEKLIGI or alan[q][p] != 0:n return Falsen return Truenn def hareket_et(self, dx, dy, alan):n self.x += dxn self.y += dyn if not self.gecerli_konum(alan):n self.x -= dxn self.y -= dyn return False # Hareket geçersizse False döndürn return True # Hareket geçerliyse True döndürnn# Taş sabitleme fonksiyonundef sabitle_tas(alan, tas):n for i, satir in enumerate(tas.sekil):n for j, hucre in enumerate(satir):n if hucre:n alan[tas.y + i][tas.x + j] = tas.sekil_indeksi + 1nn# Satır temizleme fonksiyonundef temizle_satirlar(alan):n temizlenen_satir_sayisi = 0n i = ALAN_YUKSEKLIGI - 1n while i >= 0:n if all(alan[i][j] != 0 for j in range(ALAN_GENISLIGI)):n del alan[i]n alan.insert(0, [0 for _ in range(ALAN_GENISLIGI)])n temizlenen_satir_sayisi += 1n else:n i -= 1n return temizlenen_satir_sayisinn# Oyun sonu kontrolündef oyun_sonu(alan):n return any(alan[0][j] != 0 for j in range(ALAN_GENISLIGI))nn# Oyun alanını çizme fonksiyonundef ciz_alan(alan, ekran):n for i in range(ALAN_YUKSEKLIGI):n for j in range(ALAN_GENISLIGI):n pygame.draw.rect(ekran, GRI, [j * BLOK_BOYUTU, i * BLOK_BOYUTU, BLOK_BOYUTU, BLOK_BOYUTU], 1) # Kenarlıkları çizn if alan[i][j] != 0:n pygame.draw.rect(ekran, RENKLER[alan[i][j]-1], [j * BLOK_BOYUTU + 1, i * BLOK_BOYUTU + 1, BLOK_BOYUTU - 2, BLOK_BOYUTU - 2], 0) # Dolu hücreleri çiznn# Düşen taşı çizme fonksiyonundef ciz_tas(tas, ekran):n for i, satir in enumerate(tas.sekil):n for j, hucre in enumerate(satir):n if hucre:n pygame.draw.rect(ekran, tas.renk, [(tas.x + j) * BLOK_BOYUTU + 1, (tas.y + i) * BLOK_BOYUTU + 1, BLOK_BOYUTU - 2, BLOK_BOYUTU - 2], 0)nn# Yeni bir taş oluşturndusen_tas = DusenTas()nn# Taşın düşme hızındusme_hizi = 0.05nn# Son düşme zamanınson_dusme = pygame.time.get_ticks()nn# Oyun döngüsü için değişkenlernyapiliyor = Truensaat = pygame.time.Clock()nn# Puanlama sisteminpuan = 0nfont = pygame.font.Font(None, 36)nn# Oyun döngüsünwhile yapiliyor:n for event in pygame.event.get():n if event.type == pygame.QUIT:n yapiliyor = Falsenn if event.type == pygame.KEYDOWN:n if event.key == pygame.K_LEFT:n dusen_tas.hareket_et(-1, 0, alan)n elif event.key == pygame.K_RIGHT:n dusen_tas.hareket_et(1, 0, alan)n elif event.key == pygame.K_DOWN:n dusen_tas.hareket_et(0, 1, alan)n elif event.key == pygame.K_UP:n dusen_tas.dondur()nn # Düşme zamanı kontrolün if pygame.time.get_ticks() - son_dusme > dusme_hizi * 1000:n if not dusen_tas.hareket_et(0, 1, alan):n sabitle_tas(alan, dusen_tas)n temizlenen_satir_sayisi = temizle_satirlar(alan)n puan += temizlenen_satir_sayisi * 100n dusen_tas = DusenTas()n if oyun_sonu(alan):n yapiliyor = Falsen print("Oyun Bitti!")n son_dusme = pygame.time.get_ticks()nn # Ekranı temizlen ekran.fill(SIYAH)nn # Oyun alanını çizn ciz_alan(alan, ekran)nn # Düşen taşı çizn ciz_tas(dusen_tas, ekran)nn # Puanı ekrana yazdırnpuan_yazisi = font.render("Puan: " + str(puan), True, BEYAZ)nekran.blit(puan_yazisi, [10, 10])nn # Ekranı güncellen pygame.display.flip()nn # FPS ayarın saat.tick(60)nn# Pygame'i kapatnpygame.quit()n
n
nnBu kod, temel bir Tetris oyununu oluşturur. Umarım bu rehber size yardımcı olmuştur! İyi eğlenceler!
nnSonuç
nnBu makalede, Pygame kullanarak basit bir Tetris oyunu oluşturmanın temel adımlarını inceledik. Bu, daha karmaşık oyunlar geliştirmek için iyi bir başlangıç noktasıdır. Unutmayın, pratik yapmak ve denemek önemlidir. Kodunuzu değiştirerek, farklı özellikler ekleyerek ve hataları düzelterek daha iyi bir oyun geliştiricisi olabilirsiniz.
nnn", "tags": "pygame, tetris, oyun geliştirme, python, kodlama, programlama, tutorial, rehber" } ```