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

Python ile Kendi Puzzle Oyununu Yarat: Adım Adım Rehber

Python ile Kendi Puzzle Oyununu Yarat: Adım Adım Rehber

Python, basit sözdizimi ve zengin kütüphane desteği sayesinde oyun geliştirmek için ideal bir dildir. Bu makalede, Python ve Pygame kütüphanesini kullanarak nasıl bir puzzle oyunu oluşturabileceğinizi adım adım anlatacağız. Bu rehber, temel Python bilgisine sahip olan ve oyun geliştirmeye ilgi duyan herkes için uygundur.

Gereksinimler

  • Python (3.6 veya üzeri)
  • Pygame kütüphanesi

Pygame'i yüklemek için aşağıdaki komutu kullanabilirsiniz:

pip install pygame

Oyunun Temel Yapısı

Puzzle oyunumuz, bir resmi parçalara ayırıp, bu parçaları karıştırarak kullanıcıdan doğru sıraya koymasını isteyecek. Temel adımlar şunlardır:

  1. Resmi yükleme
  2. Resmi parçalara ayırma
  3. Parçaları karıştırma
  4. Oyun döngüsü (kullanıcı girdisi, güncelleme, çizim)
  5. Doğru sırayı kontrol etme

Adım 1: Gerekli Kütüphaneleri İçe Aktarma

İlk olarak, Pygame ve rastgele sayı üretmek için `random` kütüphanesini içe aktaralım:

import pygame
import random

Adım 2: Pygame'i Başlatma ve Pencere Oluşturma

Pygame'i başlatıp, oyun penceresini oluşturalım. Pencere boyutunu ve başlığını belirleyelim:

pygame.init()

width, height = 600, 400  # Pencere boyutu
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Python Puzzle Oyunu")

Adım 3: Resmi Yükleme ve Parçalara Ayırma

Kullanılacak resmi yükleyelim ve parçalara ayıralım. Resmin boyutunu pencere boyutuna uygun olacak şekilde yeniden boyutlandırabiliriz. Örneğin, resmi 3x3'lük parçalara ayıralım:

image_path = "resim.jpg"  # Resim dosyasının yolu
image = pygame.image.load(image_path)
image = pygame.transform.scale(image, (width, height))

rows, cols = 3, 3  # Parça sayısı
piece_width = width // cols
piece_height = height // rows

pieces = []
for i in range(rows):
 for j in range(cols):
  x = j * piece_width
  y = i * piece_height
  piece = image.subsurface(pygame.Rect(x, y, piece_width, piece_height))
  pieces.append(piece)

Bu kod, resmi belirtilen sayıda satır ve sütuna böler ve her bir parçayı `pieces` listesine ekler.

Adım 4: Parçaları Karıştırma

Parçaları karıştırmak için `random.shuffle()` fonksiyonunu kullanabiliriz. Son parçayı boş bırakmak (klasik puzzle oyunlarındaki gibi) için son parçayı listeden çıkarıp, karıştırma işleminden sonra tekrar ekleyebiliriz:

# Son parçayı boş bırak
empty_piece = pieces.pop()

random.shuffle(pieces)

pieces.append(empty_piece) # Boş parçayı tekrar ekle

Adım 5: Oyun Döngüsü

Oyun döngüsü, kullanıcı girdisini alıp, oyun durumunu güncelleyip, ekranı tekrar çizmekten oluşur. Temel oyun döngüsü şöyledir:

running = True
while running:
 for event in pygame.event.get():
  if event.type == pygame.QUIT:
   running = False
  if event.type == pygame.MOUSEBUTTONDOWN:
   # Tıklama olayını işle
   pass

 # Ekranı temizle
 screen.fill((0, 0, 0))

 # Parçaları çiz
 draw_pieces(screen, pieces, piece_width, piece_height, cols)

 # Ekranı güncelle
 pygame.display.flip()

pygame.quit()

`draw_pieces()` fonksiyonunu birazdan tanımlayacağız.

Adım 6: Parçaları Ekrana Çizme

Parçaları ekrana doğru pozisyonlarda çizmek için aşağıdaki `draw_pieces()` fonksiyonunu kullanabiliriz:

def draw_pieces(screen, pieces, piece_width, piece_height, cols):
 for i, piece in enumerate(pieces):
  x = (i % cols) * piece_width
  y = (i // cols) * piece_height
  screen.blit(piece, (x, y))

Adım 7: Tıklama Olayını İşleme ve Parçaları Değiştirme

Kullanıcının tıkladığı parçayı bulup, boş parça ile yer değiştirmemiz gerekiyor. Oyun döngüsündeki `pygame.MOUSEBUTTONDOWN` olayını şu şekilde güncelleyebiliriz:

  if event.type == pygame.MOUSEBUTTONDOWN:
   x, y = event.pos
   clicked_col = x // piece_width
   clicked_row = y // piece_height
   clicked_index = clicked_row * cols + clicked_col

   # Boş parçanın indeksini bul
   empty_index = pieces.index(empty_piece)

   # Tıklanan parça ve boş parça komşu ise yer değiştir
   if is_adjacent(clicked_index, empty_index, cols):
    pieces[clicked_index], pieces[empty_index] = pieces[empty_index], pieces[clicked_index]

Burada `is_adjacent()` fonksiyonunu tanımlamamız gerekiyor. Bu fonksiyon, iki parçanın komşu olup olmadığını kontrol eder:

def is_adjacent(index1, index2, cols):
 row1, col1 = index1 // cols, index1 % cols
 row2, col2 = index2 // cols, index2 % cols
 return abs(row1 - row2) + abs(col1 - col2) == 1

Adım 8: Doğru Sırayı Kontrol Etme

Kullanıcının puzzle'ı doğru çözüp çözmediğini kontrol etmek için, parçaların doğru sırada olup olmadığını kontrol etmemiz gerekir. Oyun döngüsünün sonunda aşağıdaki kontrolü ekleyebiliriz:

 # Doğru sırayı kontrol et
 if check_win(pieces, cols):
  print("Kazandınız!")
  running = False

`check_win()` fonksiyonunu şu şekilde tanımlayabiliriz:

def check_win(pieces, cols):
 for i, piece in enumerate(pieces):
  if i != len(pieces) - 1 and piece != image.subsurface(pygame.Rect((i % cols) * piece_width, (i // cols) * piece_height, piece_width, piece_height)):
   return False
 return True

Adım 9: Oyunu Tamamlama ve İyileştirmeler

Yukarıdaki adımları tamamladığınızda, temel bir puzzle oyununa sahip olacaksınız. Oyunu daha da geliştirmek için aşağıdaki iyileştirmeleri düşünebilirsiniz:

  • Farklı zorluk seviyeleri (daha fazla parça)
  • Zamanlayıcı
  • Hareket sayısı sayacı
  • Farklı resimler seçme
  • Görsel efektler ve sesler

Tam Kod Örneği

Aşağıda tüm adımları birleştiren bir kod örneği bulunmaktadır:

import pygame
import random

pygame.init()

width, height = 600, 400
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Python Puzzle Oyunu")

image_path = "resim.jpg"  # Resim dosyasının yolu
image = pygame.image.load(image_path)
image = pygame.transform.scale(image, (width, height))

rows, cols = 3, 3
piece_width = width // cols
piece_height = height // rows

pieces = []
for i in range(rows):
 for j in range(cols):
  x = j * piece_width
  y = i * piece_height
  piece = image.subsurface(pygame.Rect(x, y, piece_width, piece_height))
  pieces.append(piece)

# Son parçayı boş bırak
empty_piece = pieces.pop()

random.shuffle(pieces)

pieces.append(empty_piece)

def draw_pieces(screen, pieces, piece_width, piece_height, cols):
 for i, piece in enumerate(pieces):
  x = (i % cols) * piece_width
  y = (i // cols) * piece_height
  screen.blit(piece, (x, y))

def is_adjacent(index1, index2, cols):
 row1, col1 = index1 // cols, index1 % cols
 row2, col2 = index2 // cols, index2 % cols
 return abs(row1 - row2) + abs(col1 - col2) == 1

def check_win(pieces, cols):
 for i, piece in enumerate(pieces):
  if i != len(pieces) - 1 and piece != image.subsurface(pygame.Rect((i % cols) * piece_width, (i // cols) * piece_height, piece_width, piece_height)):
   return False
 return True

running = True
while running:
 for event in pygame.event.get():
  if event.type == pygame.QUIT:
   running = False
  if event.type == pygame.MOUSEBUTTONDOWN:
   x, y = event.pos
   clicked_col = x // piece_width
   clicked_row = y // piece_height
   clicked_index = clicked_row * cols + clicked_col

   empty_index = pieces.index(empty_piece)

   if is_adjacent(clicked_index, empty_index, cols):
    pieces[clicked_index], pieces[empty_index] = pieces[empty_index], pieces[clicked_index]

 screen.fill((0, 0, 0))
 draw_pieces(screen, pieces, piece_width, piece_height, cols)

 if check_win(pieces, cols):
  print("Kazandınız!")
  running = False

 pygame.display.flip()

pygame.quit()

Sonuç

Bu makalede, Python ve Pygame kullanarak basit bir puzzle oyununun nasıl oluşturulacağını adım adım öğrendiniz. Bu bilgileri kullanarak kendi yaratıcılığınızı katabilir ve daha gelişmiş ve eğlenceli puzzle oyunları geliştirebilirsiniz. Oyun geliştirme yolculuğunuzda başarılar dileriz!

Cevap bırakın

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