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