Sınıfı kendi içinde döndürmek

İyi günler. Kendi başıma uğraştığım bir kod var, aşağıda tamamen sadeleştirilmiş halde, sadece sorunun olduğu kısmı koydum. Yapmak istediğim şey şu; __lastNumber() fonksiyonu sayesinde kullanıcıdan bir sayı alsın ve __questions() fonksiyonu o sayıyı kullanarak 5 adet sayı yazdırsın. Basit bir while döngüsü istemiyorum çünkü işime yaramaz. Game sınıfını kendi içinde döndürerek kullanıcının verdiği tek bir sayı ile 5 adet random sayıyı nasıl alırım? (Soruyu bir kez daha sormuştum, forumu ilk kez kullandığım için kodları düzgün yazamamışım)

from random import randint
class Game:
    def __init__(self):
        self.wrong_counter= 0

    def __lastNumber(self):
        self.qst= input("=> ") ## her döngüde tekrar soruluyor
        return int(self.qst) ## başka bir fonksiyonda kontrol ediliyor

    def __questions(self):
        last = self.__lastNumber()
        self.first= randint(1,last)
        self.wrong_counter += 1 ## orjinalde buradan sonrası yok örnek olması için yazdım
        if self.wrong_counter == 5:
            quit()
        else:
            print(self.first)
            self.__questions()

a= Game()
print(a._Game__questions())

Merhaba, aramıza hoşgeldiniz.

Tam anlamadım ama istediğiniz şöyle birşey mi?:

from random import randint


class Game:
    def __init__(self):
        self.numbers = []

    def __lastNumber(self):
        self.qst = input("> ")
        return int(self.qst)

    def __questions(self):
        last = self.__lastNumber()
        for x in range(5):
            self.numbers.append(randint(1, last))

        return self.numbers


if __name__ == "__main__":
    game = Game()
    print(game._Game__questions())

Çıktı:

> 10
[5, 7, 6, 4, 4]

Aslında tam olarak bu şekilde değil. wrong_counter değişkenini ben her seferde 1 arttırdım ama artması şu şekilde oluyor, devamında soru falan soruyorum eğer yanlış cevap verirse artıyor. Yani kullanıcı 3 doğru 5 yanlış girerse 8 döngü olacak ve bu 8 sayıyı tek bir seferde kullanamam, aldığım her cevaptan sonra bir sayı gelmesi lazım. Hala yazdıklarım karışık ise tüm kodu bırakayım terminalde kendiniz denerseniz sorunu tam olarak anlarsınız.
(Tam olarak bitmedi ama çalışıyor. 5 yanlışa gelene kadar her soru için __lastNumber fonksiyonu çalışıyor)

from random import randint
class Game:
    def __init__(self):
        self.true_counter= 0
        self.wrong_counter= 0
        print("Between 1 and what numbers do you want to play: ")

    def __lastNumber(self):
        self.qst= input("=> ") # her soru için burayı tekrar soruyor
        self.__control(self.qst)
        if int(self.qst) < 2:
            print("xxx")
            self.__lastNumber()
        return int(self.qst) ## 1.'den sonra hep yalnızca burayı kullansın

    def __control(self, value):
        try:
            value = int(value)
        except ValueError:
            print("This is not a number")
            self.__lastNumber()

    def __symbols(self):
        self.symbol= randint(1,4)
        self.symbols = {1: "+", 2: "-", 3: "*", 4: "/"}
        return self.symbols[self.symbol]

    def __questions(self):
        last = self.__lastNumber()
        self.first= randint(1,last)

        self.symbol = self.__symbols()
        while True:
            self.first= randint(1,last)
            self.second= randint(1,last)
            if self.first < self.second:
                self.first, self.second = self.second, self.first
            if self.symbol == "/":
                if self.first % self.second != 0:
                    continue
            break
        return f"{self.first}{self.symbol}{self.second}"

    def outPut(self):
        self.qst = self.__questions()
        print(self.qst)
        self.user_response = self.solution()
        self.answer= int(eval(self.qst))
        if self.user_response == self.answer:
            print("True")
            self.true_counter += 1
        else:
            print("False")
            self.wrong_counter += 1
        self.end()

    def end(self):
        if self.wrong_counter == 5:
            print("false: 5")
            quit()
        else:
            self.outPut()

    def solution(self):
        self.answer = input("=> ")
        self.__control(self.answer)
        return int(self.answer)

Bunu yazmadaki amacım sınıflar konusu üzerinde pratik yapmak. Yapmaya çalıştığım bu kod daha önceden yapmış ve tamamen çalışır durumdaki şu kodların sınıf kullanarak yazılmış hali:

while True:
    while True:
        try:
            son_sayı = int(input("1'den hangi sayıya kadar olan sayılar ile oynamak istersin: "))
            print("")
        except ValueError:
            print("Bu bir sayı değil.")
            continue
        if 1< son_sayı <= 150: 
            print(f"1 ile {son_sayı} arasından sorumlusun.")
            break
        else:
            print("1 ile 150 arasından bir sayı yazabilirsin")

    toplam_doğru_sayacı= 0
    top_yanlış_sayacı= 0
    while True:
        import random as r
        sembol = r.randint(1,4)
        semboller = {1: "+", 2: "-", 3: "*", 4: "/"}

        while True:
            birinci = r.randint(1,son_sayı)
            ikinci = r.randint(1,son_sayı)
            if birinci< ikinci:
                birinci, ikinci = ikinci, birinci
            if semboller[sembol] == "/":
                if birinci % ikinci != 0:
                    continue
            sonuç= int(eval(f"{birinci} {semboller[sembol]} {ikinci}"))
            break

        while True:
            print(f"{birinci} {semboller[sembol]} {ikinci}")
            try:
                cevap= int(input("Cevabınız: "))
            except ValueError:
                print("Böyle bir cevap olamaz. \n")
                continue

            if cevap == sonuç:
                print("Tebrikler doğru.\n")
                toplam_doğru_sayacı += 1
                break

            else:
                top_yanlış_sayacı += 1
                print(f"Maalesef yanlış. Doğru cevap: {sonuç}")
                print("TOPLAM YANLIŞ:", top_yanlış_sayacı, end="\n"*2)
                break

        çıkış_sorusu= ""
        if top_yanlış_sayacı == 5:
            print(f"Oyun bitti. Toplam doğru sayısı: {toplam_doğru_sayacı}")
            print("\nEnter tuşuna basarak yeniden başlayabilirsin.")
            çıkış_sorusu= input("\"i\"ye basarak oyunu kapatabilirsin. ")
            print("")

        if toplam_doğru_sayacı == 20:
            print("\nŞu ana kadar 20 doğru yaptın.\n")
            print("Enter tuşuna basarak 5 yanlış yapana kadar devam edebilirsin. ")
            çıkış_sorusu= input("Çıkmak için \"i\"ye tekrar başlamak için \"r\"ye basınız. ")
            print("\n"*2)

        if çıkış_sorusu == "i":
            quit()
        elif çıkış_sorusu == "r":
            break

Fikir vermesi açısından şu dosyayı bir inceleyin
isterseniz:

Neden ise yaramaz?

__questions’da cok daha karmasik ve problem cikartabilecek olan ozyineleme (kendini cagirma) kullanilmis. Basit olan while dongusunu tercih etmek lazim.

Sinifi kendi icinde dondurmek nedir bilmiyorum ama 5 adet random sayi icin [random.randint(1, last) for _ in range(5)] kullanabilirsin. Veya yukaridaki cozumu.

Nesne tabanli olmayan kodun daha okunakli oldugunu soylemem lazim. Zaten bu program nesne tabanli yazilmasi gereken (veya yazildiginda kolay olacak) bir program degil.

Illa yazacaksan bile kontrol yapilarini tek bir fonksiyonda ve sinifin disinda tutman lazim. Boyle kendini ve birbirini cagiran metodlar OOP’nin mantigina aykiri.

1 Beğeni

Burada bahsettiğim basit while döngüsü şuydu:

from random import randint
a= 0
b= int(input("=> "))
while a<5:
    a+=1
    print(randint(1,b))

Sınıfı tamamen silip yerine bunu yazmak. __questions fonksiyonunda while döngüsünü nasıl kullanabileceğim hakkında yardımcı olabilirsen sevinirim, yapamadım ben.

Üstte verdiğim cevapta kodun tamamını atmıştım, eğer oraya bir göz gezdirirseniz bu yazdığınızı kullanabileceğim bir yer yok (veya ben nasıl kullanabileceğimi anlamadım).

Teşekkürler yardımın için.