Mobil Menü

Python ile Satranç Oyunu

Bu kod, Python programlama dili ve Pygame kütüphanesi kullanılarak geliştirilmiş basit bir satranç oyunu temsil eder. Oyun, temel satranç kurallarını ve oynanışını içerir ve kullanıcıların etkileşimli bir şekilde satranç oynamasına olanak tanır.

Oyunun Temel Özellikleri:

  • Grafik Arayüz: Oyun, Pygame kütüphanesi kullanılarak oluşturulmuş grafik bir arayüze sahiptir. Bu arayüz, satranç tahtasını, taşları ve oyunun diğer görsel unsurlarını görüntüler.
  • Taş Hareketleri: Oyun, satranç taşlarının (piyon, kale, at, fil, vezir, şah) temel hareket kurallarını uygular. Kullanıcılar, taşları tahta üzerinde hareket ettirebilir ve rakip taşları ele geçirebilir.
  • Hamle Geçmişi: Oyun, yapılan hamleleri kaydeder ve kullanıcıların hamleleri geri almasına olanak tanır. Bu özellik, oyuncuların hatalarını düzeltmelerine ve farklı stratejiler denemelerine yardımcı olur.
  • Şah Mat Kontrolü: Oyun, şah mat durumunu kontrol eder ve oyunun sonucunu belirler. Bu özellik, oyunun satranç kurallarına uygun bir şekilde oynanmasını sağlar.
  • Yeniden Başlatma: Oyun, kullanıcıların oyunu istedikleri zaman yeniden başlatmasına olanak tanır. Bu özellik, oyuncuların yeni bir oyuna başlamalarını veya farklı oyun senaryoları denemelerini kolaylaştırır.

Kodun Yapısı:

Kod, farklı işlevleri yerine getiren birkaç fonksiyondan oluşur:

  • tahtayi_ciz(): Satranç tahtasını ve taşları çizer.
  • gecerli_hamleleri_hesapla(): Seçilen taşın geçerli hamlelerini hesaplar.
  • hamle_yap(): Kullanıcının yaptığı hamleyi uygular.
  • geri_al(): Son hamleyi geri alır.
  • tahtayi_sifirla(): Oyunu başlangıç durumuna döndürür.
  • sah_mat_kontrol(): Şah mat durumunu kontrol eder.
  • gecerli_hamleleri_goster(): Seçilen taşın geçerli hamlelerini gösterir.
  • main(): Oyunun ana döngüsünü yönetir.

Dikkat:

Bu satranç oyunu hala geliştirilme aşamasında olup oyun sırasında hatalarla karşılaşılabilir. Karşılaştığınız hataları lütfen bildiriniz.

import pygame

# Renkler
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 128, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)

# Tahta ve taşlar
TAHTA_BOYUTU = 8
KARE_BOYUTU = 80
PENCERE_GENISLIK = TAHTA_BOYUTU * KARE_BOYUTU
PENCERE_YUKSEKLIK = TAHTA_BOYUTU * KARE_BOYUTU

# Taşların resimleri
TAS_RESIMLERI = {
    'P': pygame.image.load('wp.png'),  # Beyaz piyon
    'R': pygame.image.load('wr.png'),  # Beyaz kale
    'N': pygame.image.load('wn.png'),  # Beyaz at
    'B': pygame.image.load('wb.png'),  # Beyaz fil
    'Q': pygame.image.load('wq.png'),  # Beyaz vezir
    'K': pygame.image.load('wk.png'),  # Beyaz şah
    'p': pygame.image.load('bp.png'),  # Siyah piyon
    'r': pygame.image.load('br.png'),  # Siyah kale
    'n': pygame.image.load('bn.png'),  # Siyah at
    'b': pygame.image.load('bb.png'),  # Siyah fil
    'q': pygame.image.load('bq.png'),  # Siyah vezir
    'k': pygame.image.load('bk.png')   # Siyah şah
}

# Tahta başlangıç durumu
BASLANGIC_TAHTASI = [
    ['r', 'n', 'b', 'q', 'k', 'b', 'n', 'r'],
    ['p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'],
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
    ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'],
    ['R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R']
]

# Pygame başlatma
pygame.init()
ekran = pygame.display.set_mode((PENCERE_GENISLIK, PENCERE_YUKSEKLIK))
pygame.display.set_caption("Satranç Oyunu")

def tahtayi_ciz():
    for satir in range(TAHTA_BOYUTU):
        for sutun in range(TAHTA_BOYUTU):
            renk = WHITE if (satir + sutun) % 2 == 0 else GREEN
            pygame.draw.rect(ekran, renk, (sutun * KARE_BOYUTU, satir * KARE_BOYUTU, KARE_BOYUTU, KARE_BOYUTU))
            tas = TAHTA[satir][sutun]
            if tas != ' ':
                ekran.blit(TAS_RESIMLERI[tas], (sutun * KARE_BOYUTU, satir * KARE_BOYUTU))

def gecerli_hamleleri_hesapla(tas, x, y):
    gecerli_hamleler = []
    if tas.lower() == 'p':  # Piyon
        if tas.isupper():  # Beyaz piyon
            if x > 0 and TAHTA[x - 1][y] == ' ':
                gecerli_hamleler.append((x - 1, y))
            if x == 6 and TAHTA[x - 2][y] == ' ' and TAHTA[x - 1][y] == ' ':
                gecerli_hamleler.append((x - 2, y))
            if y > 0 and TAHTA[x - 1][y - 1].islower():
                gecerli_hamleler.append((x - 1, y - 1))
            if y < 7 and TAHTA[x - 1][y + 1].islower():
                gecerli_hamleler.append((x - 1, y + 1))
        else:  # Siyah piyon
            if x < 7 and TAHTA[x + 1][y] == ' ':
                gecerli_hamleler.append((x + 1, y))
            if x == 1 and TAHTA[x + 2][y] == ' ' and TAHTA[x + 1][y] == ' ':
                gecerli_hamleler.append((x + 2, y))
            if y > 0 and TAHTA[x + 1][y - 1].isupper():
                gecerli_hamleler.append((x + 1, y - 1))
            if y < 7 and TAHTA[x + 1][y + 1].isupper():
                gecerli_hamleler.append((x + 1, y + 1))
    elif tas.lower() == 'n':  # At
        hamleler = [(-2, -1), (-1, -2), (1, -2), (2, -1),
                    (2, 1), (1, 2), (-1, 2), (-2, 1)]
        for dx, dy in hamleler:
            nx, ny = x + dx, y + dy
            if 0 <= nx < 8 and 0 <= ny < 8:
                if (tas.isupper() and TAHTA[nx][ny].islower()) or (tas.islower() and TAHTA[nx][ny].isupper()) or TAHTA[nx][ny] == ' ':
                    gecerli_hamleler.append((nx, ny))
    elif tas.lower() == 'b':  # Fil
        for dx, dy in [(-1, -1), (-1, 1), (1, -1), (1, 1)]:
            nx, ny = x + dx, y + dy
            while 0 <= nx < 8 and 0 <= ny < 8:
                if TAHTA[nx][ny] == ' ':
                    gecerli_hamleler.append((nx, ny))
                elif (tas.isupper() and TAHTA[nx][ny].islower()) or (tas.islower() and TAHTA[nx][ny].isupper()):
                    gecerli_hamleler.append((nx, ny))
                    break
                else:
                    break
                nx += dx
                ny += dy
    elif tas.lower() == 'r':  # Kale
        for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
            nx, ny = x + dx, y + dy
            while 0 <= nx < 8 and 0 <= ny < 8:
                if TAHTA[nx][ny] == ' ':
                    gecerli_hamleler.append((nx, ny))
                elif (tas.isupper() and TAHTA[nx][ny].islower()) or (tas.islower() and TAHTA[nx][ny].isupper()):
                    gecerli_hamleler.append((nx, ny))
                    break
                else:
                    break
                nx += dx
                ny += dy
    elif tas.lower() == 'q':  # Vezir
        gecerli_hamleler.extend(gecerli_hamleleri_hesapla('b', x, y))  # Fil hareketi
        gecerli_hamleler.extend(gecerli_hamleleri_hesapla('r', x, y))  # Kale hareketi
    elif tas.lower() == 'k':  # Şah
        for dx in [-1, 0, 1]:
            for dy in [-1, 0, 1]:
                if dx == 0 and dy == 0:
                    continue
                nx, ny = x + dx, y + dy
                if 0 <= nx < 8 and 0 <= ny < 8:
                    if (tas.isupper() and TAHTA[nx][ny].islower()) or (tas.islower() and TAHTA[nx][ny].isupper()) or TAHTA[nx][ny] == ' ':
                        gecerli_hamleler.append((nx, ny))
    return gecerli_hamleler

def hamle_yap(baslangic, hedef):
    x1, y1 = baslangic
    x2, y2 = hedef
    tas = TAHTA[x1][y1]
    hedef_tas = TAHTA[x2][y2]

    # Hedef konumda aynı renkte bir taş varsa hamle geçersiz
    if (tas.isupper() and hedef_tas.isupper()) or (tas.islower() and hedef_tas.islower()):
        return False

    gecerli_hamleler = gecerli_hamleleri_hesapla(tas, x1, y1)
    if (x2, y2) in gecerli_hamleler:
        HAMLE_GECMISI.append((baslangic, hedef, TAHTA[x2][y2]))  # Hamle geçmişine ekle
        TAHTA[x2][y2] = TAHTA[x1][y1]
        TAHTA[x1][y1] = ' '
        return True
    return False

def geri_al():
    if HAMLE_GECMISI:
        son_hamle = HAMLE_GECMISI.pop()
        (x1, y1), (x2, y2), tas = son_hamle
        TAHTA[x1][y1] = TAHTA[x2][y2]
        TAHTA[x2][y2] = tas

def tahtayi_sifirla():
    global TAHTA, HAMLE_GECMISI, sira
    TAHTA = [satir.copy() for satir in BASLANGIC_TAHTASI]
    HAMLE_GECMISI = []
    sira = 'beyaz'

def sah_tehdit_altinda_mi(renk):
    # Şahın konumunu bul
    sah_konum = None
    for i in range(8):
        for j in range(8):
            if TAHTA[i][j] == ('K' if renk == 'beyaz' else 'k'):
                sah_konum = (i, j)
                break
        if sah_konum:
            break

    if not sah_konum:
        return False

    # Rakip taşların geçerli hamlelerini kontrol et
    for i in range(8):
        for j in range(8):
            tas = TAHTA[i][j]
            if tas != ' ' and ((renk == 'beyaz' and tas.islower()) or (renk == 'siyah' and tas.isupper())):
                gecerli_hamleler = gecerli_hamleleri_hesapla(tas, i, j)
                if sah_konum in gecerli_hamleler:
                    return True
    return False

def gecerli_hamleleri_goster(secili_tas):
    x, y = secili_tas
    tas = TAHTA[x][y]
    gecerli_hamleler = gecerli_hamleleri_hesapla(tas, x, y)
    for nx, ny in gecerli_hamleler:
        pygame.draw.rect(ekran, BLUE, (ny * KARE_BOYUTU, nx * KARE_BOYUTU, KARE_BOYUTU, KARE_BOYUTU), 3)

def sah_mat_kontrol():
    # Beyaz şah mat mı?
    if sah_tehdit_altinda_mi('beyaz'):
        # Beyaz şahın kaçış hamlesi var mı?
        sah_konum = None
        for i in range(8):
            for j in range(8):
                if TAHTA[i][j] == 'K':
                    sah_konum = (i, j)
                    break
            if sah_konum:
                break

        if sah_konum:
            x, y = sah_konum
            gecerli_hamleler = gecerli_hamleleri_hesapla('K', x, y)
            if not gecerli_hamleler:  # Kaçış hamlesi yok
                return 'siyah'  # Siyah kazandı

    # Siyah şah mat mı?
    if sah_tehdit_altinda_mi('siyah'):
        # Siyah şahın kaçış hamlesi var mı?
        sah_konum = None
        for i in range(8):
            for j in range(8):
                if TAHTA[i][j] == 'k':
                    sah_konum = (i, j)
                    break
            if sah_konum:
                break

        if sah_konum:
            x, y = sah_konum
            gecerli_hamleler = gecerli_hamleleri_hesapla('k', x, y)
            if not gecerli_hamleler:  # Kaçış hamlesi yok
                return 'beyaz'  # Beyaz kazandı

    return None  # Şah mat değil

def main():
    global TAHTA, HAMLE_GECMISI, sira
    TAHTA = [satir.copy() for satir in BASLANGIC_TAHTASI]
    HAMLE_GECMISI = []
    secili_tas = None
    sira = 'beyaz'  # Beyaz başlar
    oyun_devam_ediyor = True

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return
            elif event.type == pygame.MOUSEBUTTONDOWN and oyun_devam_ediyor:
                x, y = pygame.mouse.get_pos()
                satir = y // KARE_BOYUTU
                sutun = x // KARE_BOYUTU
                if secili_tas is None:
                    tas = TAHTA[satir][sutun]
                    if tas != ' ' and ((sira == 'beyaz' and tas.isupper()) or (sira == 'siyah' and tas.islower())):
                        secili_tas = (satir, sutun)
                else:
                    if hamle_yap(secili_tas, (satir, sutun)):
                        sira = 'siyah' if sira == 'beyaz' else 'beyaz'  # Sıra değiştir
                    secili_tas = None
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_z:  # Geri al
                    geri_al()
                    sira = 'siyah' if sira == 'beyaz' else 'beyaz'  # Sıra değiştir
                elif event.key == pygame.K_r:  # Baştan başla
                    tahtayi_sifirla()
                    oyun_devam_ediyor = True

        ekran.fill(BLACK)
        tahtayi_ciz()
        if secili_tas:
            gecerli_hamleleri_goster(secili_tas)

            # Şah çekme kontrolü
            if sah_tehdit_altinda_mi('beyaz'):
                font = pygame.font.SysFont(None, 55)
                metin = font.render("Şah!", True, RED)
                ekran.blit(metin, (10, 10))
            if sah_tehdit_altinda_mi('siyah'):
                font = pygame.font.SysFont(None, 55)
                metin = font.render("Şah!", True, RED)
                ekran.blit(metin, (PENCERE_GENISLIK - 100, 10))

            # Şah mat kontrolü
            kazanan = sah_mat_kontrol()
            if kazanan:
                oyun_devam_ediyor = False
                font = pygame.font.SysFont(None, 55)
                metin = font.render(f"{kazanan.capitalize()} kazandı!", True, RED)
                ekran.blit(metin, (PENCERE_GENISLIK // 2 - 150, PENCERE_YUKSEKLIK // 2 - 30))

            pygame.display.flip()

if __name__ == "__main__":
    main()

Osman Bayrak
Osman Bayrak

Yazılım Mühendisiyim. Teknoloji ve yazılıma meraklıyım.

Articles: 278