Grimoire Weiss 39

Yetkin
Katılım
6 Nisan 2025
Mesajlar
1.259
Makaleler
2
Çözümler
7
Beğeniler
705
Yer
Burdur
Instagram keşfetimde bir çiftin sürekli kağıt kullanarak bu oyunu oynadığını görüyordum. Ama ne oynayacak bir arkadaşım ne de kağıdım vardı... Ben de Gemini'yi ikna edip oyunu kendi istediğim şekilde dijitale döktüm! Sistem sanırım kodlama olarak Base64 kullanıyor. Daha önce GPT ile benzer oyunlar yaptığımda, skor ve isimler TXT dosyasında düz yazı olarak görünüyordu; bu sefer daha farklı oldu. Kodlar tamamen yapay zeka çıktısıdır, umarım hoşunuza gider.🥳

Kod:
import os
import random
import json
import base64
import sys
from pathlib import Path

# Belgeler klasörünün yolunu bulma ve dosya ayarları
DOCUMENTS_DIR = Path.home() / "Documents"
DOCUMENTS_DIR.mkdir(parents=True, exist_ok=True)
FILE_PATH = DOCUMENTS_DIR / "sayidata.txt"

def veri_yukle():
    """Dosyadan kullanıcı verilerini çözer ve yükler."""
    if not FILE_PATH.exists():
        return {}
    try:
        with open(FILE_PATH, 'r', encoding='utf-8') as f:
            encoded_data = f.read()
            if not encoded_data:
                return {}
            json_str = base64.b64decode(encoded_data).decode('utf-8')
            return json.loads(json_str)
    except Exception:
        return {}

def veri_kaydet(veriler):
    """Kullanıcı verilerini Base64 ile şifreleyerek kaydeder."""
    try:
        json_str = json.dumps(veriler)
        encoded_data = base64.b64encode(json_str.encode('utf-8')).decode('utf-8')
        with open(FILE_PATH, 'w', encoding='utf-8') as f:
            f.write(encoded_data)
    except Exception as e:
        print(f"\n[Hata] Veriler kaydedilemedi: {e}")

def kurallari_goster():
    print("\n" + "="*50)
    print("📜 SAYI BULMACA OYUNU KURALLARI 📜")
    print("="*50)
    print("- Her sayı tamamen rastgele oluşur ve kurala tabi değildir.")
    print("- Zorluğu sen belirlersin: 4 ile 15 basamaklı sayılar seçebilirsin.")
    print("- İpucu (Deneme) sayın, seçtiğin basamak sayısı + 1 kadardır (En fazla 10).")
    print("\n🔍 TAHMİN İPUÇLARI:")
    print("  [✅] Doğru Yerleşim : Rakam var ve yeri doğru. (Örn: 10_0)")
    print("  [🔀] Yeri Yanlış   : Rakam sayıda var ama başka basamakta.")
    print("  [❌] Yanlış        : Bu rakam hedef sayıda hiç yok.")
    print("\n💡 PUANLAMA:")
    print("  * Sayıyı doğru bilmek (Oyunu kazanmak) = 100 Puan")
    print("  * Kullanılmayan her tahmin hakkı = Ekstra 10 Puan")
    print("  * Her el sonrasında puanın otomatik kaydedilir.")
    print("\n⚠️ DİKKAT: İpucu hakkın biterse oyunu kaybedersin.")
    print("\n⌨️ KOMUTLAR:")
    print("  /k veya /kurallar  -> Bu kurallar menüsünü açar.")
    print("  /q                 -> Oyundan güvenli şekilde çıkar.")
    print("="*50 + "\n")

def girdi_kontrol(mesaj):
    """Kullanıcıdan girdi alır ve temel komutları kontrol eder."""
    while True:
        cevap = input(mesaj).strip().lower()
        if cevap == '/q':
            print("\nOyundan çıkılıyor... Hoşça kal!")
            sys.exit()
        elif cevap in ['/k', '/kural', '/kurallar']:
            kurallari_goster()
        else:
            return cevap

def oyunu_baslat():
    print("\n" + "*"*50)
    print(" "*10 + "🎲 SAYI BULMACA OYUNUNA HOŞ GELDİN! 🎲" + " "*10)
    print("*"*50)
 
    veriler = veri_yukle()
 
    isim = girdi_kontrol("Lütfen ismini gir (Çıkmak için /q): ").strip().title()
 
    if isim in veriler:
        toplam_skor = veriler[isim]
        print(f"\nTekrar hoş geldin, {isim}! Önceki toplam skorun: {toplam_skor} Puan")
    else:
        toplam_skor = 0
        print(f"\nMerhaba {isim}, yeni kaydın oluşturuldu!")
        veriler[isim] = toplam_skor
        veri_kaydet(veriler)
 
    oturum_skoru = 0
 
    while True:
        print("\n" + "-"*40)
        while True:
            zorluk_str = girdi_kontrol("Zorluk seviyesini seç (4-15 arası bir basamak sayısı gir, kurallar için /k): ")
        
            try:
                zorluk = int(zorluk_str)
                if 4 <= zorluk <= 15:
                    break
                else:
                    print("Lütfen 4 ile 15 arasında bir zorluk belirle.")
            except ValueError:
                print("Lütfen geçerli bir sayı gir.")
    
        max_ipucu = min(zorluk + 1, 10)
        kalan_ipucu = max_ipucu
    
        alt_sinir = 10**(zorluk - 1)
        ust_sinir = (10**zorluk) - 1
        hedef_sayi_str = str(random.randint(alt_sinir, ust_sinir))
    
        print(f"\n🎯 {zorluk} basamaklı sayın oluşturuldu! Doğru tahmin için toplam {max_ipucu} hakkın var.")
    
        el_kazanildi = False
    
        while kalan_ipucu > 0:
            tahmin_str = girdi_kontrol(f"\n[Kalan Hak: {kalan_ipucu}] Tahminin nedir? ")

            # Normal Girdi Doğrulaması
            if not tahmin_str.isdigit():
                print("Lütfen sadece sayılardan oluşan bir tahmin gir!")
                continue
            if len(tahmin_str) != zorluk:
                print(f"Dikkat! Hedef sayı {zorluk} basamaklı. (Sen {len(tahmin_str)} basamak girdin)")
                continue
        
            if tahmin_str == hedef_sayi_str:
                el_kazanildi = True
                break
            else:
                kalan_ipucu -= 1
            
                hedef_listesi = list(hedef_sayi_str)
                tahmin_listesi = list(tahmin_str)
            
                maske = ["_"] * zorluk
                yeri_yanlis = []
                yanlis = []
            
                # 1. Aşama: Doğru Yerleşim
                for i in range(zorluk):
                    if tahmin_listesi[i] == hedef_listesi[i]:
                        maske[i] = tahmin_listesi[i]
                        hedef_listesi[i] = None
                        tahmin_listesi[i] = None
                    
                # 2. Aşama: Yeri Yanlış ve Tamamen Yanlış   
                for i in range(zorluk):
                    if tahmin_listesi[i] is not None:
                        if tahmin_listesi[i] in hedef_listesi:
                            yeri_yanlis.append(tahmin_listesi[i])
                            hedef_listesi[hedef_listesi.index(tahmin_listesi[i])] = None
                        else:
                            yanlis.append(tahmin_listesi[i])
            
                maske_cikti = "".join(maske)
                yeri_yanlis_tekil = list(set(yeri_yanlis))
                yanlis_tekil = list(set(yanlis))
            
                print("\nAnaliz Sonucu:")
                print(f"✅ Doğru Yerleşim: {maske_cikti}")
                if yeri_yanlis_tekil:
                    print(f"🔀 Yeri yanlış sayılar: {', '.join(sorted(yeri_yanlis_tekil))}")
                if yanlis_tekil:
                    print(f"❌ Yanlış sayılar: {', '.join(sorted(yanlis_tekil))}")
    
        # El Sonu Değerlendirmesi
        if el_kazanildi:
            kazanilan_puan = 100 + (kalan_ipucu * 10)
            oturum_skoru += kazanilan_puan
            toplam_skor += kazanilan_puan
            veriler[isim] = toplam_skor
            veri_kaydet(veriler)
        
            print("\n" + "🌟"*15)
            print(f"TEBRİKLER! Sayıyı tam on ikiden vurdun: {hedef_sayi_str}")
            print(f"Kullanılmayan {kalan_ipucu} hak x 10 + 100 = Bu el {kazanilan_puan} Puan kazandın!")
            print(f"Güncel Skorun: {toplam_skor} Puan")
            print("🌟"*15)
        else:
            print("\n" + "💀"*15)
            print(f"OYUN BİTTİ! Hakların tükendi. Tutulan sayı şuydu: {hedef_sayi_str}")
            print(f"Bu oturumdaki başarın: {oturum_skoru} Puan")
            print(f"Sistemdeki Toplam Skorun: {toplam_skor} Puan")
            print("💀"*15)
            # Çökme hissini engelleyen satır: Ekranın anında kapanmasını durdurur.
            input("\n[Sistem] Ekranı kapatmak için Enter'a basın...")
            break

if __name__ == "__main__":
    oyunu_baslat()
 
Son düzenleme: