Mustafa Aferin
Özgün ve farklı içerikler üreten python, linux ve teknoloji haberleri okumayı seven birisi

12. Pygame ile bir tetris oyunu kodla.

```json { "title": "Pygame ile Tetris Oyunu Kodlama: Adım Adım Rehber", "content": "nnnnnPygame ile Tetris Oyunu Kodlama: Adım Adım Rehbernnbody {n font-family: Arial, sans-serif;n line-height: 1.6;n margin: 20px;n}nh1, h2, h3 {n color: #333;n}np {n margin-bottom: 15px;n}ncode {n background-color: #f4f4f4;n padding: 2px 5px;n border: 1px solid #ddd;n border-radius: 4px;n font-family: monospace;n}npre {n background-color: #f4f4f4;n padding: 10px;n border: 1px solid #ddd;n border-radius: 4px;n overflow-x: auto;n font-family: monospace;n}n.highlight {n background-color: yellow;n}nimg {n max-width: 100%;n height: auto;n}nnnnn

Pygame ile Tetris Oyunu Kodlama: Adım Adım Rehber

nn

Bu 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.

nn

Gereksinimler

nn

Baş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
nn

Oyunun Temel Yapısı

nn

Tetris 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
nn

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.

nn
nnimport 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()nn
nn

Bu 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.

nn

Adım 2: Tetrominoes (Taşlar) Tanımlama

nn

Tetris'te 7 farklı taş (tetromino) bulunur. Her bir taşı, bir dizi koordinatla temsil edebiliriz. Bu koordinatlar, taşın oyun alanındaki konumunu belirler.

nn
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 (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]nn
nn

Burada, her bir şekil için olası rotasyonları da tanımladık. Örneğin, 'I' şekli için iki farklı rotasyon var.

nn

Adım 3: Oyun Alanı (Grid) Oluşturma

nn

Oyun 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.

nn
nn# 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)nn
nn

Bu kod, oyun alanını oluşturur ve ciz_alan fonksiyonu ile ekrana çizer. Şimdilik sadece boş bir alan çiziyoruz.

nn

Adım 4: Düşen Taşı Oluşturma ve Hareket Ettirme

nn

Oyunun 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.

nn
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# 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
nn

Bu 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.

nn

Adım 5: Kullanıcı Girdisi İşleme

nn

Kullanıcı girdisi, oyuncunun taşı hareket ettirmesini ve döndürmesini sağlar. Pygame'in olay işleme sistemi ile klavye girişlerini yakalayabiliriz.

nn
nn # 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()nn
nn

Bu kod, sol, sağ, aşağı ve yukarı ok tuşlarına basıldığında taşı hareket ettirir veya döndürür.

nn

Adım 6: Taşı Sabitleme ve Yeni Taş Oluşturma

nn

Taş, 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.

nn
nn# 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()nn
nn

Bu kod, sabitle_tas fonksiyonu ile taşı oyun alanına ekler ve ardından yeni bir taş oluşturur.

nn

Adım 7: Satırları Temizleme

nn

Tamamlanmış 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.

nn
nn# 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)nn
nn

Bu 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.

nn

Adım 8: Oyun Sonu Kontrolü

nn

Oyunun 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.

nn
nn# 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!")nn
nn

Bu 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.

nn

Adım 9: Tam Kod ve İyileştirmeler

nn

Yukarı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
nn

Aşağıda tam kod bulunmaktadır (yukarıdaki parçaların birleştirilmiş hali):

nn
nnimport 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()nn
nn

Bu kod, temel bir Tetris oyununu oluşturur. Umarım bu rehber size yardımcı olmuştur! İyi eğlenceler!

nn

Sonuç

nn

Bu 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" } ```
Cevap bırakın

E-posta hesabınız yayımlanmayacak.