• 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
176 wizyt
pytanie zadane 23 sierpnia 2018 w Python przez El Lirón Obywatel (1,320 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,320 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,320 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ź 313 wizyt
0 głosów
2 odpowiedzi 550 wizyt
pytanie zadane 29 grudnia 2018 w Java przez studenciak Nowicjusz (230 p.)
0 głosów
1 odpowiedź 108 wizyt
pytanie zadane 3 maja 2017 w C# przez Apacz700 Nowicjusz (150 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...