Advertisement
gandalfbialy

Untitled

Jun 7th, 2025
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.17 KB | None | 0 0
  1. import random
  2. from collections import Counter
  3.  
  4. # --- Konfiguracja Gry ---
  5. # c – czerwony, z – zielony, n – niebieski, ż – żółty, b – biały, k – czarny
  6. # KOLORY = ['c', 'z', 'n', 'ż', 'b', 'k']
  7. KOLORY = ['c', 'z', 'n', 'b']
  8. DLUGOSC_KODU = 4
  9.  
  10.  
  11. def generuj_tajny_kod():
  12. """Losuje tajny kod, który gracz będzie musiał odgadnąć."""
  13. return [random.choice(KOLORY) for _ in range(DLUGOSC_KODU)]
  14.  
  15.  
  16. def oblicz_kare(tajny_kod, proba_gracza):
  17. """
  18. Oblicza karę na podstawie próby gracza (analogia do Mastermind):
  19. - +1 punkt kary za każdy dobry kolor na złej pozycji,
  20. - +5 punktów kary za każdy nadmiarowy (lub nieistniejący) kolor.
  21. """
  22.  
  23. kara = 0
  24. # Tworzymy liczniki (Counter) dla tajnego kodu i próby
  25. licznik_tajnych = Counter(tajny_kod)
  26. licznik_proby = Counter(proba_gracza)
  27.  
  28. # ETAP 1: Usuń idealne trafienia (tak by ich nie liczyć ani do "dobrych na złe", ani do "nieobecnych")
  29. for i in range(DLUGOSC_KODU):
  30. if proba_gracza[i] == tajny_kod[i]:
  31. licznik_tajnych[proba_gracza[i]] -= 1
  32. licznik_proby[proba_gracza[i]] -= 1
  33.  
  34. # ETAP 2: Dla pozostałych niedopasowanych kulek w próbie:
  35. # - policz, ile z nich można jeszcze dopasować do kolorów w tajnym kodzie (-> +1 punkt)
  36. # - pozostałe nalicz jako "kolory nieobecne" (-> +5 punktów)
  37. for kolor, cnt_pro in licznik_proby.items():
  38. if cnt_pro <= 0:
  39. continue # nie ma już tej kulki do rozpatrzenia
  40.  
  41. cnt_taj = licznik_tajnych.get(kolor, 0)
  42. # Ile kulek proba_gracza nadal można uznać za "dobry kolor, ale zła pozycja"?
  43. dobre_na_zle = min(cnt_pro, cnt_taj)
  44. kara += dobre_na_zle * 1
  45.  
  46. # Pozostałe, które nie znajdują pokrycia w liczniku_tajnych, traktujemy jako nieobecne
  47. nadmiarowe = cnt_pro - dobre_na_zle
  48. kara += nadmiarowe * 5
  49.  
  50. return kara
  51.  
  52.  
  53. def pobierz_probe_gracza():
  54. """Pobiera od gracza próbę odgadnięcia kodu i ją waliduje."""
  55. while True:
  56. print("\n" + "=" * 40)
  57. print(f"Dostępne kolory: {', '.join(KOLORY)}")
  58. wejscie = input(f"Podaj swoją próbę ({DLUGOSC_KODU} pismiennych kodów oddzielonych spacją): ").lower().strip()
  59.  
  60. proba = wejscie.split()
  61.  
  62. if len(proba) != DLUGOSC_KODU:
  63. print(f"Błąd: Wprowadziłeś {len(proba)} kolorów, a wymagane są dokładnie {DLUGOSC_KODU}.")
  64. continue
  65.  
  66. # Sprawdź, czy wprowadzono jedynie litery z listy KOLORY
  67. zle_kolory = [p for p in proba if p not in KOLORY]
  68. if zle_kolory:
  69. print(f"Błąd: Użyłeś niedozwolonych kodów kolorów: {', '.join(set(zle_kolory))}.")
  70. continue
  71.  
  72. return proba
  73.  
  74.  
  75. def gra():
  76. """Główna pętla gry."""
  77. print("--- Witaj w grze 'Nauka przez Błędy' ---")
  78. print("Twoim celem jest odgadnięcie tajnego kodu złożonego z 4 kulek.")
  79. print("Po każdej próbie otrzymasz 'karę' (loss), która mówi, jak daleko jesteś od celu.")
  80. print("Twoim zadaniem jest zminimalizowanie kary do zera.")
  81. print("\nZasady obliczania kary:")
  82. print(" - +1 punkt za każdą kulkę, która ma dobry kolor, ale jest na złej pozycji.")
  83. print(" - +5 punktów za każdą kulkę, której kolor przekracza liczbę wystąpień w tajnym kodzie")
  84. print(" (albo w ogóle nie występuje).")
  85. print("Powodzenia!")
  86.  
  87. tajny_kod = generuj_tajny_kod()
  88. # Aby przetestować: odkomentuj poniższą linię i zobacz na STARTIE, jaki kod został wylosowany
  89. # print(f"\n[DEBUG] Tajny kod to: {tajny_kod}")
  90.  
  91. numer_proby = 0
  92. while True:
  93. numer_proby += 1
  94. proba_gracza = pobierz_probe_gracza()
  95. kara = oblicz_kare(tajny_kod, proba_gracza)
  96.  
  97. print(f"\n>>> Próba nr {numer_proby}: {proba_gracza}")
  98. print(f">>> Twoja kara (loss): {kara}")
  99.  
  100. if kara == 0:
  101. print("\n*** Gratulacje! Odgadłeś tajny kod! ***")
  102. print(f"Udało Ci się to w {numer_proby} próbach.")
  103. break
  104. else:
  105. print("--- Analizuj karę i spróbuj ponownie, aby ją zmniejszyć! ---")
  106.  
  107.  
  108. if __name__ == "__main__":
  109. gra()
  110.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement