OOP hk. Basit Örnek Üzerinden Soru

import time
import random
import sys

class Oyuncu():
    def __init__(self, isim, can=5, enerji=100):
        self.isim = isim
        self.darbe = 0
        self.can = can
        self.enerji = enerji

    def mevcut_durumu_görüntüle(self):
        print('darbe: ', self.darbe)
        print('can: ', self.can)
        print('enerji: ', self.enerji)

    def saldır(self, rakip):
        print('Bir saldırı gerçekleştirdiniz.')
        print('Saldırı sürüyor. Bekleyiniz.')

        for i in range(10):
            time.sleep(.3)
            print('.', end='', flush=True)

        sonuç = self.saldırı_sonucunu_hesapla()

        if sonuç == 0:
            print('\nSONUÇ: kazanan taraf yok')

        if sonuç == 1:
            print('\nSONUÇ: rakibinizi darbelediniz')
            self.darbele(rakip)

        if sonuç == 2:
            print('\nSONUÇ: rakibinizden darbe aldınız')
            rakip.darbele(self)

    def saldırı_sonucunu_hesapla(self):
         return random.randint(0, 2)

    def kaç(self):
        print('Kaçılıyor...')
        for i in range(10):
            time.sleep(.3)
            print('\n', flush=True)

        print('Rakibiniz sizi yakaladı')

    def darbele(self, darbelenen):
        darbelenen.darbe += 1
        darbelenen.enerji -= 1
        if (darbelenen.darbe % 5) == 0:
            darbelenen.can -= 1
        if darbelenen.can < 1:
            darbelenen.enerji = 0
            print('Oyunu {} kazandı!'.format(self.isim))
            self.oyundan_çık()

    def oyundan_çık(self):
        print('Çıkılıyor...')
        sys.exit()

##################################

# Oyuncular
siz = Oyuncu('Ahmet')
rakip = Oyuncu('Mehmet')

# Oyun başlangıcı
while True:
    print('Şu anda rakibinizle karşı karşıyasınız.',
          'Yapmak istediğiniz hamle: ',
          'Saldır:  s',
          'Kaç:     k',
          'Çık:     q', sep='\n')

    hamle = input('\n> ')
    if hamle == 's':
        siz.saldır(rakip)

        print('Rakibinizin durumu')
        rakip.mevcut_durumu_görüntüle()

        print('Sizin durumunuz')
        siz.mevcut_durumu_görüntüle()

    if hamle == 'k':
        siz.kaç()

    if hamle == 'q':
        siz.oyundan_çık()

Kodun da;

        if sonuç == 1:
            print('\nSONUÇ: rakibinizi darbelediniz')
            self.darbele(rakip)

        if sonuç == 2:
            print('\nSONUÇ: rakibinizden darbe aldınız')
            rakip.darbele(self)

kısmın da kafam karıştı. class içinde rakip.darbele(self) kullanımı tam olarak nasıl oluyor ?

saldır fonksiyonuna baktığımızda görüyoruz ki rakip isimli bir parametresi var.

self sizsiniz. rakip de yine Oyuncu sınıfına ait başka bir nesne.

Oyun başladığında, size yapmak istediğiniz hamle sorulur ve s tuşuna basarak saldırmayı seçerseniz siz.saldır(rakip) ifadesi çalışır.

Bundan sonra, sırayla aşağıdakiler gerçekleşir:

  • Ekrana saldırıyı gerçekleştirdiğiniz, saldırının sürdüğü ve beklemeniz gerektiği ile alakalı yazılar yazdırılır.

  • Daha sonra 3 saniye bekletilirsiniz.

  • Sonra self.saldırı_sonucunu_hesapla() fonksiyonu çağrılır. Bu fonksiyon random.randint(0, 2) fonksiyonu kullanılarak 0 ile 2 arasında üretilen rastgele bir sayıyı geri döndürür ve dönen değer sonuç isimli bir değişkene kaydedilir.

  • Eğer sonuç, 0 ise, kazanan taraf yok şeklinde bir yazı ekrana yazdırılır. Eğer sonuç, 1 ise, ekrana rakibinizi darbelediniz şeklinde bir yazı yazdırılır ve self.darbele(rakip) fonksiyonu çağrılır. Eğer sonuç, 2 ise, ekrana rakibinizden darbe aldınız yazısı yazdırılır ve rakip.darbele(self) fonksiyonu çağrılır.

  • darbele fonksiyonu darbelenen isminde bir parametre alır. sonuç değişkeninin değerinin 1 olması durumunda darbelenen rakip olur. Yok eğer sonuç değişkeninin değeri 2 ise, bu durumda darbelenen self olur.

  • darbele fonksiyonunun içinde darbelenen'in darbe sayısı 1 birim arttırılır, enerji özelliği ise 1 birim azaltılır. Eğer darbelenen kişinin darbe niteliğinin 5'e bölümünden kalan 0 ise, darbelenen tarafın can niteliği 1 birim azaltılır. Eğer darbelenen tarafın can niteliği, aldığı darbe sonucunda 1'in altına düşerse, darbelen tarafın enerji niteliği 0'a eşitlenir. Ve oyun biter.

Özetle aynı sınıftan iki tane örnek oluşturuyorsunuz ve sınıf içerisinde oluşturacağınız örneklerin birbirleriyle nasıl ilişki kuracağını tanımlıyorsunuz.

1 Beğeni

Doğrusu : time.sleep(3)

Neyin doğrusu?

>>> .3 == 0.3
True
1 Beğeni

kodun mantığı açısından sorun yok kafamı karıştıran başka bir durum var. Sanırım şöyle ifade etmek biraz daha doğru olacak;

siz = Oyuncu('Ahmet')
rakip = Oyuncu('Mehmet')

burada örneklememizi yapıyoruz. Ancak ;

  • siz.saldır(rakip)
    
  • self.darbele(rakip)
    
  • rakip.darbele(self)
    

yanlış anlamıyorsam bu satırlarda örnek metotlarının içine argüman olarak örnek isimleri gönderiyoruz. Bu benim kafamı karıştırıyor.

Evet, örnek metotlarının içine argüman olarak örnekleri gönderiyoruz. Daha basit olan aşağıdaki örneğe bakın isterseniz.

class Test:
    def __init__(self, x: int):
        self.x = x
        
    def topla(self, other: "Test"):
        return self.x + other.x
        
        
ornek1 = Test(x=10)
ornek2 = Test(x=20)

print(ornek1.topla(other=ornek2))

Not: Burada other parametresine isterseniz örneğin kendisini de verebilirsiniz.

print(ornek1.topla(other=ornek1))
1 Beğeni

Bir Mekatronik Müh. mezunu olarak sıfırdan programlama öğreniyorum. Her konuyu hemen hemen takılmadan zorlanmadan anlayabiliyorken, zaman zaman takıldığım yerlerde hep imdadıma yetişiyorsunuz. Bu basit örnek aydınlatıcı oldu teşekkür ederim. Klişe ile ;

Bilmemek ayıp değil, öğrenmemek ayıptır. Sorarak öğrenmeye devam :+1:

1 Beğeni

İyi çalışmalar. Kolay gelsin.

1 Beğeni

Örnek isimlerini değil, örneğin kendisini yolluyoruz. siz ve rakip birer oyuncu örneği. self’de metodu çağırılan örneği temsil ediyor.

2 Beğeni