Advertisement
drakon-firestone

Gra RPG

Mar 19th, 2023
798
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.18 KB | None | 0 0
  1. # zaimportuj funkcje randint oraz choice z biblioteki random
  2. from random import randint, choice
  3.  
  4. # ----------------------- POSTAC ----------------------------
  5.  
  6. # stwórz klasę Postac
  7. class Postac:
  8. # niech posiada ona konstruktor z zmiennymi w klasie:
  9. #   - nazwa
  10. #   - życie
  11. #   - max życie
  12.     def __init__(self, nazwa, zycie, max_zycie):
  13.         self.nazwa = nazwa
  14.         self.zycie = zycie
  15.         self.max_zycie = max_zycie
  16.  
  17.  
  18. # dodaj do klasy Postac metode atakuj() przyjmujaca jako parametr przeciwnika
  19. # niech metoda korzystając z losowania - funkcja randint(min, max) ustali siłę ataku
  20. # w przedziale 0-3. Jeśli wylosowano 0 oznacza to że przeciwnik uniknął ataku (trzeba
  21. # wyświetlić odpowiedni komunikat) - w przeciwnym przypadku zadajemy obrażenia i wypisujemy
  22. # odpowieni komunikat
  23.     def atakuj(self, przeciwnik):
  24.         atak = randint(0,3)
  25.  
  26.         # unik
  27.         if atak == 0:
  28.             print(f'{przeciwnik.nazwa} unika ataku {self.nazwa}')
  29.         else:
  30.             print(f'{self.nazwa} atakuje {przeciwnik.nazwa}, zadając {atak} obrażeń')
  31.             # przeciwnik.zycie = max(przeciwnik.zycie-atak, 0)
  32.             przeciwnik.zycie -= atak
  33.             if przeciwnik.zycie < 0:
  34.                 przeciwnik.zycie = 0
  35.  
  36.  
  37.  
  38.  
  39. # ----------------------- PRZECIWNIK ---------------------------
  40.  
  41. # stwórz klasę Przeciwnik dziedziczącą z klasy Postac
  42. class Przeciwnik(Postac):
  43.  
  44. # niech konstruktor przyjmuje jako argument postać gracza i losuje swoje życie w przedziale
  45. # między 1 a aktualne życie gracza
  46. # ponadto uruchom na początku konstruktor klasy bazowej
  47. # nazwa przeciwnika ma być również wylosowana z określonej listy przeciwników, np.
  48. # ['goblin', 'szkielet', 'zombie']
  49.     def __init__(self, gracz):
  50.         zycie = randint(1, gracz.zycie)
  51.         nazwa = choice(['goblin', 'szkielet', 'zombie'])
  52.         super().__init__(nazwa, zycie, zycie)
  53.  
  54.  
  55.  
  56. # ---------------------- GRACZ ----------------------------------
  57.  
  58. # stwórz klasę Gracz dziedziczącą z klasy Postac
  59. class Gracz(Postac):
  60.  
  61. # konstruktor niech uruchamia na początku konstruktor klasy bazowej
  62. # oraz niech ustala jakieś początkowe wartości max życia oraz życia
  63. # nazwa ma być podawana przez uzytkownika z konsoli (metoda input())
  64.     def __init__(self):
  65.         zycie = 10
  66.         nazwa = input('Podaj nazwę dla gracza: ')
  67.         super().__init__(nazwa, zycie, zycie)
  68.  
  69.  
  70. # stwórz metodę odpoczynek() umożliwiającą odzyskanie nieco życia (np. +1HP)
  71. # ogranicz życie gracza do maksymalnego (jeśli odpoczynek zwiększy życie powyżej
  72. # max zmniejszamy je do maksymalnego)
  73.     def odpoczynek(self):
  74.         # self.zycie = min(self.zycie+1, self.max_zycie)
  75.         self.zycie += 1
  76.         if self.zycie > self.max_zycie:
  77.             self.zycie = self.max_zycie
  78.         print(f'{self.nazwa} opoczywa, życie {self.zycie}/{self.max_zycie}')
  79.  
  80. # stwórz metodę walka() która przyjmie jako argument przeciwnika
  81. # niech walka trwa do tak długo aż nie nastąpi jeden z warunków:
  82. #   - gracz pokona przeciwnika
  83. #   - gracz zginie
  84. #   - gracz wybierze akcję ucieczki
  85. # metoda powinna dać graczowi dwie możliwości wyboru: (atak, uciekaj)
  86. #   - jeśli gracz wybierze akcję ucieczki tylko przeciwnik atakuje gracza
  87. #     a następnie walka natychmiastowo się kończy
  88. #   - jeżeli gracz wybierze akcję walki wówczas gracz najpierw atakuje przeciwnika
  89. #     sprawdzamy czy przecwinik został pokonany - jeśli tak to walka się kończy,
  90. #     jeśli nie - przeciwnik atakuje gracza
  91. # Po zakończeniu jednej rundy musimy sprawdzić czy gracz przetrwał ostatni atak wroga.
  92. # dodaj informacje o nieznanej akcji (nie 'atak' i nie 'uciekaj')
  93.     def walka(self, przeciwnik):
  94.         walka_trwa = True
  95.         while walka_trwa:
  96.             print(f'życie gracza: {self.zycie}')
  97.             print(f'życie {przeciwnik.nazwa}: {przeciwnik.zycie}')
  98.             akcja_walki = input('Akcja: (atak, uciekaj): ')
  99.             if akcja_walki == 'atak':
  100.                 #kod ataku
  101.                 self.atakuj(przeciwnik)
  102.                 if przeciwnik.zycie == 0:
  103.                     print(f'{self.nazwa} pokonuje {przeciwnik.nazwa}')
  104.                     return True
  105.                 przeciwnik.atakuj(self)
  106.                 pass
  107.             elif akcja_walki == 'uciekaj':
  108.                 #kod ucieczki
  109.                 print(f'Gracz {self.nazwa} próbuje uciec')
  110.                 przeciwnik.atakuj(self)
  111.                 walka_trwa = False
  112.                 pass
  113.             else:
  114.                 print('Niepoprawna akcja')
  115.            
  116.             if self.zycie == 0:
  117.                 print(f'{self.nazwa} ginie')
  118.                 # walka zakończona porażką
  119.                 return False
  120.         return True # ucieczka
  121.  
  122. # stwórz program testujący powyższe klasy
  123. # stwórz obiekt Gracz
  124. # dodaj pętlę gry
  125. # gra toczy się tak długo aż gracz nie zginie
  126. # dajemy graczowi do wyboru dwie akcje (zwiedzaj, odpocznij)
  127. #   - jeśli gracz wybrał opcję 'odpocznij' uruchamiamy jego metodę odpoczynek()
  128. #   - jeśli gracz wybrał opcję zwiedzaj losujemy jedną z dwóch opcji:
  129. #       -> jaskinia - piszemy tylko komunikat żę gracz odnalazł jaskinię
  130. #       -> walka - tworzymy nowego przeciwnika, informujemy o tym
  131. #          gracza i przeprowadzamy z nim walkę
  132. # dodaj zabezpieczenie z informacją o wyborze nieznanej opcji
  133.  
  134. gracz = Gracz()
  135.  
  136. gra_trwa = True
  137. while gra_trwa:
  138.     akcja_gry = input('akcja (zwiedzaj, odpocznij): ')
  139.     if akcja_gry == 'zwiedzaj':
  140.         # kod zwiedzania
  141.         los = randint(0,1)
  142.         if los == 0:
  143.             print(f'{gracz.nazwa} zwiedza jaskinię')
  144.         else:
  145.             przeciwnik = Przeciwnik(gracz)
  146.             print(f'{gracz.nazwa} trafia na {przeciwnik.nazwa}')
  147.             gra_trwa = gracz.walka(przeciwnik)
  148.         pass
  149.     elif akcja_gry == 'odpocznij':
  150.         # kod odpoczynku
  151.         gracz.odpoczynek()
  152.         pass
  153.     else:
  154.         print('Niepoprawna akcja')
  155.  
  156.  
  157.  
  158. # ZADANIA DODATKOWE
  159.  
  160. # ===== ZAD 1. Statystyka Szybkosc =====
  161. #
  162. # Dodaj do klasy Postac statystyke Szybkosc
  163. # ustaw ja w klasie gracza
  164. # klasa Przeciwnika ma losowac swoją Szybkosc
  165. # - niech bedzie w przedziale od 50% do 150% szybkosci gracza
  166. # szybkosc decyduje kto pierwszy zaatakuje w danej rundzie podczas walki
  167. # pierwsza atakuje postac z wieksza szybkoscia
  168. # w przypadku remisu w kazdej rundzie bedzie losowane kto pierwszy zaatakuje
  169. # szybkosc ma rowniez wplyw na ucieczke - jesli Gracz ma wieksza szybkosc niz Przeciwnik
  170. # ma szanse uciec bez obrazen. Szansa w% wynosi (1-szybkosc_przeciwnika/szybkosc_gracza)*100
  171. # (czyli tyle ile procentowo gracz ma wiecej szybkosci od przeciwnika).
  172.  
  173.  
  174.  
  175. # ===== ZAD 2. Klasa Lochy =====
  176. #
  177. # Zamień konstruktor Przeciwnika aby przyjmował swoją nazwę jako argument.
  178. #
  179. # Stwórz klasę Loch (Dungeon)
  180. #
  181. # Niech w konstruktorze będzie przekazywana w parametrze nazwa
  182. # oraz lista nazw przyciwników, których możemy spotkać w danym lochu.
  183. #
  184. # Dodaj metodę zwiedzaj(), która będzie zwiedzała dany loch. Jeśli loch nie ma
  185. # żadnego przeciwnika (lista jest pusta do spotkania niech wyświetla się
  186. # informacja o zwiedzaniu lochu.
  187. # Jeśli występują jacyś przeciwnicy, mamy wylosować nazwę jednego z nich,
  188. # stworzyć obiekt Przeciwnik z wybraną nazwą oraz zawalczyć z nim.
  189. #
  190. # W programie testowym dodaj liste lochow i przypisz im kilkoro przeciwników.
  191. # Niektore lochy moga okazać się puste (nie mają przeciwników - tak jak wcześniej jaskinia).
  192. # W glownej petli programu zamien akcje zwiedzania tak aby korzystala z listy dostepnych
  193. # lochow niech korzysta ona z metody zwiedzaj wybranego losowo z listy Lochu.
  194.  
  195.  
  196.  
  197. # ===== ZAD 3. Zloto/loot z mobów =====
  198. #
  199. # Dodaj do klasy Postac zmienna Zloto (Gold).
  200. # Niech w klasie przeciwnika bedzie ono oznaczalo liczbe zlota do zdobycia po jego pokonaniu
  201. # - niech wartość złota Przeciwnika będzie losowana w jego konstruktorze - niech będzie
  202. # proporcjonalne do życia przeciwnika.
  203. # W klasie Gracz niech zmienna Zloto oznacza ile gracz ma obecnie złota. Liczba zlota będzie
  204. # zwiększana po pokonaniu przeciwnika o tyle ile przeciwnik miał
  205. # ustawione w swojej zmiennej Zloto.
  206. #
  207. # W glownym programie podczas dopoczynku możliwość wyboru odpoczynku w stajni na sianie (darmowe)
  208. # który odnawia +1HP oraz pokoju dla VIP-ów, który odnawia całe życie i kosztuje 50 sztuk złota.
  209.  
  210.  
  211. # ===== ZAD 4. Akcja sklepu =====
  212. # Dodaj do akcji w grze (poza odpoczynkiem i zwiedzaniem) odwiedzenia sklepu.
  213. # Niech sklep oferuje Pióro Feniksa (niech będzie to zmienna bool - True/False, w klasie
  214. # Gracza) która będzie służyła jako pojedyncze odrodzenie w przypadku przegranej walki.
  215. # Jeśli gracz zginie posiadając pióro Feniksa, gra nie kończy się ale gracz trafia do "miasta"
  216. # (walka po prostu się kończy) a gracz przeżywa z 1HP.
  217. # Niech sklep oferuje także Miksturę lecznia - niech gracz może nosić przy sobie do
  218. # max 3 fiolek mistury leczenia (pole do dodania w klasie Gracz). Niech mikstura leczy
  219. # 30% życia gracza i będzie dodatkową opcją w czasie walki (poza ucieczką lub walką).
  220. # Pióro Feniksa niech kosztuje 100sztuk złota, a mistury leczenia po 15 sztuk złota każda.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement