Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- from collections import Counter
- # --- Konfiguracja Gry ---
- # c – czerwony, z – zielony, n – niebieski, ż – żółty, b – biały, k – czarny
- # KOLORY = ['c', 'z', 'n', 'ż', 'b', 'k']
- KOLORY = ['c', 'z', 'n', 'b']
- DLUGOSC_KODU = 4
- def generuj_tajny_kod():
- """Losuje tajny kod, który gracz będzie musiał odgadnąć."""
- return [random.choice(KOLORY) for _ in range(DLUGOSC_KODU)]
- def oblicz_kare(tajny_kod, proba_gracza):
- """
- Oblicza karę na podstawie próby gracza (analogia do Mastermind):
- - +1 punkt kary za każdy dobry kolor na złej pozycji,
- - +5 punktów kary za każdy nadmiarowy (lub nieistniejący) kolor.
- """
- kara = 0
- # Tworzymy liczniki (Counter) dla tajnego kodu i próby
- licznik_tajnych = Counter(tajny_kod)
- licznik_proby = Counter(proba_gracza)
- # ETAP 1: Usuń idealne trafienia (tak by ich nie liczyć ani do "dobrych na złe", ani do "nieobecnych")
- for i in range(DLUGOSC_KODU):
- if proba_gracza[i] == tajny_kod[i]:
- licznik_tajnych[proba_gracza[i]] -= 1
- licznik_proby[proba_gracza[i]] -= 1
- # ETAP 2: Dla pozostałych niedopasowanych kulek w próbie:
- # - policz, ile z nich można jeszcze dopasować do kolorów w tajnym kodzie (-> +1 punkt)
- # - pozostałe nalicz jako "kolory nieobecne" (-> +5 punktów)
- for kolor, cnt_pro in licznik_proby.items():
- if cnt_pro <= 0:
- continue # nie ma już tej kulki do rozpatrzenia
- cnt_taj = licznik_tajnych.get(kolor, 0)
- # Ile kulek proba_gracza nadal można uznać za "dobry kolor, ale zła pozycja"?
- dobre_na_zle = min(cnt_pro, cnt_taj)
- kara += dobre_na_zle * 1
- # Pozostałe, które nie znajdują pokrycia w liczniku_tajnych, traktujemy jako nieobecne
- nadmiarowe = cnt_pro - dobre_na_zle
- kara += nadmiarowe * 5
- return kara
- def pobierz_probe_gracza():
- """Pobiera od gracza próbę odgadnięcia kodu i ją waliduje."""
- while True:
- print("\n" + "=" * 40)
- print(f"Dostępne kolory: {', '.join(KOLORY)}")
- wejscie = input(f"Podaj swoją próbę ({DLUGOSC_KODU} pismiennych kodów oddzielonych spacją): ").lower().strip()
- proba = wejscie.split()
- if len(proba) != DLUGOSC_KODU:
- print(f"Błąd: Wprowadziłeś {len(proba)} kolorów, a wymagane są dokładnie {DLUGOSC_KODU}.")
- continue
- # Sprawdź, czy wprowadzono jedynie litery z listy KOLORY
- zle_kolory = [p for p in proba if p not in KOLORY]
- if zle_kolory:
- print(f"Błąd: Użyłeś niedozwolonych kodów kolorów: {', '.join(set(zle_kolory))}.")
- continue
- return proba
- def gra():
- """Główna pętla gry."""
- print("--- Witaj w grze 'Nauka przez Błędy' ---")
- print("Twoim celem jest odgadnięcie tajnego kodu złożonego z 4 kulek.")
- print("Po każdej próbie otrzymasz 'karę' (loss), która mówi, jak daleko jesteś od celu.")
- print("Twoim zadaniem jest zminimalizowanie kary do zera.")
- print("\nZasady obliczania kary:")
- print(" - +1 punkt za każdą kulkę, która ma dobry kolor, ale jest na złej pozycji.")
- print(" - +5 punktów za każdą kulkę, której kolor przekracza liczbę wystąpień w tajnym kodzie")
- print(" (albo w ogóle nie występuje).")
- print("Powodzenia!")
- tajny_kod = generuj_tajny_kod()
- # Aby przetestować: odkomentuj poniższą linię i zobacz na STARTIE, jaki kod został wylosowany
- # print(f"\n[DEBUG] Tajny kod to: {tajny_kod}")
- numer_proby = 0
- while True:
- numer_proby += 1
- proba_gracza = pobierz_probe_gracza()
- kara = oblicz_kare(tajny_kod, proba_gracza)
- print(f"\n>>> Próba nr {numer_proby}: {proba_gracza}")
- print(f">>> Twoja kara (loss): {kara}")
- if kara == 0:
- print("\n*** Gratulacje! Odgadłeś tajny kod! ***")
- print(f"Udało Ci się to w {numer_proby} próbach.")
- break
- else:
- print("--- Analizuj karę i spróbuj ponownie, aby ją zmniejszyć! ---")
- if __name__ == "__main__":
- gra()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement