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

nadanie wartości zmiennej w programie głównym poprzez metodę z klasy

VPS Starter Arubacloud
0 głosów
249 wizyt
pytanie zadane 23 sierpnia 2018 w Python przez El Lirón Obywatel (1,350 p.)

Witajcie! Już opisuję, o co chodzi:
program składa się z dwóch plików, jeden zawiera klasy, a drugi (główny) to główna część programu. Chciałbym, aby wywołanie w programie głównym metody obiektu miało taki skutek, że ta metoda zmieni wartość zmiennej w programie głównym. Chodzi o to, żeby to pokonaniu przeciwnika zakończyła się pętla while. Oto kod programu głównego:

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")

 

komentarz 23 sierpnia 2018 przez El Lirón Obywatel (1,350 p.)

Zaś tu podaję kod drugiego pliku. Chciałbym, aby metoda die() jakoś ustawiała zmienną choice na wartość "0":

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:
            self.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:
            self.die()

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

 

2 odpowiedzi

+1 głos
odpowiedź 23 sierpnia 2018 przez izonik Stary wyjadacz (12,560 p.)
wybrane 27 sierpnia 2018 przez El Lirón
 
Najlepsza

Kilka uwag co do kodu:

Mieszanka językowa polski i angielski. JAK TO WYGLĄDA ?

wróg.attack(gracz)

Wiele razy importujesz random. Po co ?

W obu klasach metody się powtarzają. Polecam stworzyć klasę bazową i dziedziczyć z niej.

https://www.python.org/dev/peps/pep-0008/

_____________________________________________________________________________________________________

Aby rozwiązać twój problem najlepiej umieścić kod pętli w klasie, stworzyć parametr odpowiadający za wyjście z pętli, a następnie przekazać klasę ( czyli parametr self ) do klasy Player i Creature  i w metodzie die() ustawić wyjście z pętli. Strasznie zawiłe, lepiej spójrz na kod.

klasa główna

class Main:
    def __init__(self):
        self.go_out_loop = False
        self.player = Player(self)
        self.opponent = Creature(self)
        self.loop()

    def loop(self):
        while not self.go_out_loop:
            print("""
                0 - wyjście z gry
                1 - standardowy atak
                2 - atak specjalny (-20 energii)
                """)

            choice = input("Wybierasz: ")
            if choice == "0":
                self.go_out_loop = True
                print("Do widzenia")
            elif choice == "1":
                self.player.basic_attack(self.opponent)
            elif choice == "2":
                self.player.special_attack(self.opponent)
            else:
                print("Nie trafiłeś w klawisz? Przykro mi, tracisz kolejkę...")

        input("Wciśnij ENTER")


if __name__ == '__main__':
    loop = Main()

i w klasie Player

import random


class Player:
    def __init__(self, main_class_object, life=100, energy=100):
        self.main_class_object = main_class_object
        # Your code

    def die(self):
        self.main_class_object.go_out_loop = True
        # Your code

    # Your code 

 

Pozdrawiam.

 

 

komentarz 27 sierpnia 2018 przez El Lirón Obywatel (1,350 p.)
Dziękuję za wszystkie uwagi! :) Masz rację, to mieszanie języków głupio wygląda. Spróbuję z tą klasą-pętlą
+1 głos
odpowiedź 23 sierpnia 2018 przez RogerB Gaduła (3,370 p.)
Pobierasz w metodzie klasy zmienną globalną za pomocą global i zmieniasz jej wartość
komentarz 23 sierpnia 2018 przez izonik Stary wyjadacz (12,560 p.)
Też można ale używanie global nie jest polecane.

https://stackoverflow.com/questions/19158339/why-are-global-variables-evil

Podobne pytania

0 głosów
1 odpowiedź 341 wizyt
0 głosów
2 odpowiedzi 681 wizyt
pytanie zadane 29 grudnia 2018 w Java przez studenciak Nowicjusz (230 p.)
0 głosów
1 odpowiedź 122 wizyt
pytanie zadane 3 maja 2017 w C# przez Apacz700 Nowicjusz (150 p.)

92,973 zapytań

141,937 odpowiedzi

321,175 komentarzy

62,301 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...