Oyunumuz “Kolay – Orta – Zor ” aşamalarından oluşuyor. İsteyen oyuncu bunlardan birini seçip ad ve soyad girerek oyuna başlıyor. En kısa zamanda karşısına gelen listeden ve rastgele gelen sayının katını birer boşluk bırakarak giriyor. Bilen oyuncular arasından en kısa zamanda bilen oyunun sonunda çıkış denildiğinde rapor olarak sunuluyor.

5_b_Etkinlik.py
# "Sayının Katlarını Bul" Oyunu

from random import randint
import colorama

from datetime import datetime

class Ana:
    def __init__(self):
        self.calisma = True
        self.liste = []
        self.rastSayi = 0
        self.istatistik = {"zorluk" : [],"ad" : [],"soyad"  :[],"sure" : [],"sonuc" : []}

    def menuSecim(self):
        secim = 1
        try:
            secim = int(input("Lütfen Seçiminizi Giriniz [1-4] : "))
            while secim < 1 or secim > 4:
                secim = int(input("Seçiminiz geçerli değil. Lütfen kontrol edip yeniden deneyiniz [1-4] : "))
        except:
            print("Kolay seçimle devam ettiniz ! Kolay gelsin\n")

        return secim

    def menu(self):
        print(colorama.Fore.LIGHTYELLOW_EX)
        print("----------------------- KATLAR OYUNU -----------------------")
        print("1. Kolay\n2. Orta\n3. Zor\n4. Çıkış")
        aralik = 0
        secim = self.menuSecim()

        if secim == 1:
            self.istatistikKayit("Kolay")
            self.oyunBasla(6)
        elif secim == 2:
            self.istatistikKayit("Orta")
            self.oyunBasla(7)
        elif secim == 3:
            self.istatistikKayit("Zor")
            self.oyunBasla(8)
        else:
            self.istatistikDegerlendir()
            self.calisma = False

    def istatistikKayit(self,zorluk):
        self.istatistik["zorluk"].append(zorluk)
        self.istatistik["ad"].append(input("Adınızı giriniz : ").capitalize())
        self.istatistik["soyad"].append(input("Soyadınızı giriniz : ").capitalize())

    def oyunBasla(self,aralik):
        print(colorama.Fore.LIGHTWHITE_EX)
        self.liste = [int(randint(1, 100)) for x in range(1, aralik)]
        basZaman = datetime.now()

        self.tabloOlustur()
        kullanciCevaplari = input(f"\n{self.rastSayi} sayısının katlarını birer boşluk bırakarak yazınız : ").split(" ")

        # kullanıcıdan alınan cevapları sayısal değere çevirip yen bir listeye atıldı.
        self.kullanciCevaplariSayi = []
        for i in kullanciCevaplari:
            try:
                self.kullanciCevaplariSayi.append(int(i))
            except Exception as hata:
                print("Hata ! Girişlerinizi Kontrol ediniz . Kaybettiniz !")

        # Burada kullanıcıdan alınan cevaplar sıralanmaktadır.
        self.kullanciCevaplariSayi = self.listeSirala(self.kullanciCevaplariSayi)
        self.oyunSonuc(basZaman)

    def tabloOlustur(self):
        satirSay = 0
        for i in self.liste:
            satirSay += 1
            print(i,end="\t")
            if satirSay == 5:
                satirSay = 0
                print("\n")

        self.rastgeleSayiKatlar()
        self.calisma = False

    # Rastgele belirlenen sayı ve kullanıcıdan alınan cevap listesi sıralanmkatadır. Çünkü 2 liste karşılaştırılacaktır.
    def listeSirala(self,liste):
        temp = 0
        for i in range(0, len(liste)):
            for j in range(i + 1, len(liste)):
                if liste[i] > liste[j]:
                    temp = liste[i]
                    liste[i] = liste[j]
                    liste[j] = temp
        return liste

    def rastgeleSayiKatlar(self):
        self.katlar = []
        while len(self.katlar) == 0:
            self.rastSayi = randint(2, 10)
            for i in self.liste:
                if i % self.rastSayi == 0:
                    self.katlar.append(i)

        # Burada bulunan katlar sıralanmaktadır.
        self.katlar = self.listeSirala(self.katlar)

    # 1 ile 100 arasında rasgele blirlenen 5 6 ya da 7 sayı tablo haline getiriliyor.

    # Katlar tablosundan katı sorulan rastgele sayıyı doğru bilen self.istatistik değişkeninin sonuc anahtarına + eklenmektedir.
    def oyunSonuc(self,basZaman):
        if self.kullanciCevaplariSayi == self.katlar:
            print("Kutlarız ! Kazandınız. Oyunun sonunda sıralamayı bekleyiniz.")
            self.istatistik["sonuc"].append("+")
        else:
            print("Maalesef Elendiniz ! Sıralamaya giremediniz.")
            self.istatistik["sonuc"].append("-")
        self.istatistik["sure"].append(str(datetime.now() - basZaman))
        self.menu()

    def istatistikDegerlendir(self):
        print("ZORLUK\t\t\tAD\t\t\tSoyad\t\t\tSure\t\t\t\tSonuç")
        # Her zorluk derecesi ayrı ayrı kategorilenmektedir.
        kolayIsta = {"zorluk" : [],"ad" : [],"soyad"  :[],"sure" : [],"sonuc" : []}
        ortaIsta = {"zorluk": [], "ad": [], "soyad": [], "sure": [], "sonuc": []}
        zorIsta = {"zorluk": [], "ad": [], "soyad": [], "sure": [], "sonuc": []}

        for i in range(0,len(self.istatistik["sonuc"])):
            for anahtar in self.istatistik.keys():
                print(self.istatistik[anahtar][i],end="\t\t\t")
                if self.istatistik["sonuc"][i] == "+":
                    if self.istatistik[anahtar][i] == "Kolay":
                        kolayIsta["zorluk"].append(self.istatistik["zorluk"][i])
                        kolayIsta["ad"].append(self.istatistik["ad"][i])
                        kolayIsta["soyad"].append(self.istatistik["soyad"][i])
                        kolayIsta["sure"].append(self.istatistik["sure"][i])
                        kolayIsta["sonuc"].append(self.istatistik["sonuc"][i])
                    elif self.istatistik[anahtar][i] == "Orta":
                        ortaIsta["zorluk"].append(self.istatistik["zorluk"][i])
                        ortaIsta["ad"].append(self.istatistik["ad"][i])
                        ortaIsta["soyad"].append(self.istatistik["soyad"][i])
                        ortaIsta["sure"].append(self.istatistik["sure"][i])
                        ortaIsta["sonuc"].append(self.istatistik["sonuc"][i])
                    if self.istatistik[anahtar][i] == "Zor":
                        zorIsta["zorluk"].append(self.istatistik["zorluk"][i])
                        zorIsta["ad"].append(self.istatistik["ad"][i])
                        zorIsta["soyad"].append(self.istatistik["soyad"][i])
                        zorIsta["sure"].append(self.istatistik["sure"][i])
                        zorIsta["sonuc"].append(self.istatistik["sonuc"][i])

            print("\n")
        # Zorluk kategorisine göre en iyiler belirleniyor.
        if len(self.enkucukBul(kolayIsta)) > 0:
            birinci = self.enkucukBul(kolayIsta)
            print(colorama.Fore.CYAN)
            print(f"Zorluk Derecesi : ( {birinci[0]} ) Olan Yarışmanın Kazananı : {birinci[1]} {birinci[2]}, Derecesi : {round(float(birinci[3].split(':')[2]),2)} ")
        if len(self.enkucukBul(ortaIsta)) > 0:
            birinci = self.enkucukBul(ortaIsta)
            print(colorama.Fore.CYAN)
            print(f"Zorluk Derecesi : ( {birinci[0]} ) Olan Yarışmanın Kazananı : {birinci[1]} {birinci[2]}, Derecesi : {round(float(birinci[3].split(':')[2]), 2)} ")
        if len(self.enkucukBul(zorIsta)) > 0:
            birinci = self.enkucukBul(zorIsta)
            print(colorama.Fore.CYAN)
            print(f"Zorluk Derecesi : ( {birinci[0]} ) Olan Yarışmanın Kazananı : {birinci[1]} {birinci[2]}, Derecesi : {round(float(birinci[3].split(':')[2]), 2)} ")

    # Sonuçta en az sürede cevapları doğru veren kişi belirlenecek
    def enkucukBul(self,ista):
        enKucuk = []
        min = 100
        for i in range(0,len(ista["sonuc"])):
            if float(ista["sure"][i].split(":")[2]) < min:
                min = float(ista["sure"][i].split(":")[2])
                enKucuk.clear()
                enKucuk.append(ista["zorluk"][i])
                enKucuk.append(ista["ad"][i])
                enKucuk.append(ista["soyad"][i])
                enKucuk.append(ista["sure"][i])

        return enKucuk

ana = Ana()
while ana.calisma:
    ana.menu()