• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Krótka gierka nie działa/AttributeError

Object Storage Arubacloud
0 głosów
323 wizyt
pytanie zadane 17 sierpnia 2018 w Python przez El Lirón Obywatel (1,320 p.)

Witajcie! Zrobiłem krótką gierkę (bazę, którą chcę rozbudować). Jak we wszystkich eRPeGach trzeba stłuc tego trolla czy tam inne badziewie :) Gra zapisana w dwóch plikach (klasy oraz plik główny). Kompilator twierdzi, że:

Traceback (most recent call last):
  File "C:/Users/Michał/PycharmProjects/MojaGraRPG/glownarpg.py", line 19, in <module>
    gracz.basic_attack(wróg)
  File "C:\Users\Michał\PycharmProjects\MojaGraRPG\klasyrpg.py", line 18, in basic_attack
    target.__get_damange(hit)
AttributeError: 'Creature' object has no attribute '_Player__get_damange'

Co przeoczyłem? Jakoś źle odniesienia lub parametry ustawiłem? O co chodzi?

Oto kod pliku z klasami:
 

class Player(object):
    def __init__(self, life=100, energy=100):
        self.life = life
        self.energy = energy

    def __die(self):
        print("Zostajesz pokonany")

    def __get_damange(self, damange):
        self.life -= damange
        print("Otrzymujesz ",damange," obrażeń")
        if self.life <= 0:
            __die()

    def basic_attack(self, target):
        import random
        hit = random.randint(5,8)
        target.__get_damange(hit)
        print("Uderzasz wroga i zadajesz ",hit," obrażeń")

    def special_attack(self, target):
        if self.energy <= 19:
            print("Nie masz wystarczająco siły, aby zadać ten cios. Tracisz tę rundę...")
        else:
            import random
            hit = random.randint(26,32)
            target.__get_damange(hit)
            print("Uderzasz wroga i zadajesz ", hit, " obrażeń")
            self.energy -= 20

class Creature(object):
    def __init__(self):
        import random
        self.life = random.randint(40,70)

    def __die(self):
        print("Pokonujesz wroga")

    def __get_damange(self, damange):
        self.life -= damange
        if self.life <= 0:
            __die()

    def attack(self, target):
        import random
        hit = random.randint(7,10)
        target.__get_damange(hit)

 

1
komentarz 17 sierpnia 2018 przez izonik Stary wyjadacz (12,560 p.)
Mógłbyś dodać kod pliku "glownarpg.py" ?
komentarz 18 sierpnia 2018 przez El Lirón Obywatel (1,320 p.)

Już dodaję:
 

from klasyrpg import *

print("\nSpotykasz przeciwnika i rozpoczynasz walkę!")

gracz = Player()
wróg = Creature()

choice = None
while choice != "0":
    print("""
    0 - wyjście z gry
    1 - standardowy atak
    2 - atak specjalny (-20 energii)
    """)
    choice = input("Wybierasz: ")
    if choice == "0":
        print("Do widzenia")
    elif choice == "1":
        gracz.basic_attack(wróg)
    elif choice == "2":
        gracz.special_attack(wróg)
    else:
        print("Nie trafiłeś w klawisz? Przykro mi, tracisz kolejkę...")

    wróg.attack(gracz)

input("Wciśnij ENTER")

 

1 odpowiedź

+2 głosów
odpowiedź 17 sierpnia 2018 przez izonik Stary wyjadacz (12,560 p.)

Nie mam kodu pliku "glownarpg.py", więc strzelam.

 

Metody prywatne !

Odwołujesz się do metody prywatnej z poziomu obiektu.

"__" od tego zaczynamy prywatne metody, do których możemy się odwoływać, tylko poziomu klasy.

Oczywiście to python i jest metoda aby z poziomu obiektu odwołać się do metody prywatnej. Tylko po co? Skoro już stosujemy metody prywatne to powinniśmy mieć dosyć ważny powód. (w pythonie stosuje się je rzadziej niż w C ++).

Co możesz zrobić:

1. Zmień metody prywatne na publiczne ( usuń __ )

2. Tak jak napisałem wyżej, nie polecam, jest to głupie (w końcu po coś utworzyliśmy metody PRYWATNE) i tyko do informacji (ZABRANIAM KORZYSTAĆ!!!)

_target__get_damage(hit)

 

Pisałeś wcześniej w Javie, C, C++ ?

 

 

komentarz 18 sierpnia 2018 przez El Lirón Obywatel (1,320 p.)
Dziękuję, spróbuję znieść prywatność i zobaczę jak to podziała.

Owszem, zgadłeś - trochę się uczyłem C++ ;)

Podobne pytania

+3 głosów
1 odpowiedź 195 wizyt
pytanie zadane 31 maja 2016 w Nasze projekty przez Ehlert Ekspert (212,670 p.)
0 głosów
1 odpowiedź 156 wizyt
pytanie zadane 31 sierpnia 2018 w Python przez El Lirón Obywatel (1,320 p.)

92,566 zapytań

141,420 odpowiedzi

319,615 komentarzy

61,952 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...