Variablen in Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
raffyn
User
Beiträge: 3
Registriert: Dienstag 26. Januar 2021, 19:10

Hallo,
ich habe mich entschieden mit Python zu beginnen und habe mich mal so probiert.
Ich habe bereits mit FreePascal gearbeitet und wollte diesbezüglich fragen wie folgendes Problem in Python funktioniert.

In FPC kann man z.B eine Variable definieren i:= 0
und anschließend im folgenden Code überschreiben also i:= i - 1;
Ich habe das in Python versucht, aber dort sagt er mir immer, dass die Variable nicht definiert ist. "NameError: name 'var_test' is not defined"

In dem Programm, welches ich geschrieben habe sollte meine variable durch einen Wert verändert werden und als geänderte Variable dort ausgegeben werden, wo diese zuvor unverändert war.

Danke für Eure Hilfe.
MfG raffyn
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das geht so schon, = statt :=. Warum es also bei dir nicht geht liegt an deinem konkreten Code. Den bitte zeigen.
raffyn
User
Beiträge: 3
Registriert: Dienstag 26. Januar 2021, 19:10

Okay, also ich wollte so ein kleines Minigame programmieren.

Code: Alles auswählen

import random

print("Wilkommen im Pfadspiel")
print("Du läufst durch die Gegend auf der Suche nach Gegnern")
print("Bist du bereit? Y: Ja N: Nein")
ch1 = str(input())
pro = "y" or "Y"

def var_re(x,y):
    return x - y


if ch1 == pro:
    print("Gut, lass uns losgehen!")
    print()
    n = 0
    r = n
    traenke = 3

    while True:
        while True:
            print("Du durchschreitest den Wald auf der Suche nach Monstern...")
            randomnum = random.sample(range(1, 20), 1)  # Zufällige Nummer
            random_num2 = [10]
            if randomnum < random_num2:
                print('Du bist einem Monster begegnet!')


            else:
                print("Du bist keinem Monster begegnet und dringst nun tiefer in den Wald ein.")
            if randomnum < random_num2:
                break


            hp_monster = random.randint(5, 30)  # HP Monster
            hp_monster_tod = 0  # Monster tod
            hp_spieler_tod = 0  # Spieler tod
            hp_spieler = random.randint(5, 45)  # HP Spieler
            angs = random.randint(1, 9)  # Angriff Spieler
            angm = random.randint(1, 9)  # Angriff Monster
            auS = random.randint(1, 20)  # Asuweichen Spieler
            auS1 = 11
            auM = random.randint(1, 20)  # Ausweichen Monster
            auM1 = 11
        while True:
            print("Was möchtest du tun?")
            print("HP Spieler: " + str(hp_spieler) + "  HP Monster: " + str(hp_monster))
            print("A: Angreifen B: Blocken C: Heilen (" + str(traenke) + " Verfügbar)")
            con1 = "a" or "A"
            con2 = "b" or "B"
            con3 = "c" or "C"
            ans = str(input())
            if ans == con1:
              print("Du greifst mit deiner Waffe an.")
              if auM < auM1:
                print("Du hast das Monster getroffen!")

                print("Dein Angriff macht " + str(angs) + " Schaden.")

                print("Das Monster hat noch " + str(var_re(hp_monster,angs)) + " HP übrig.")

              elif auM >= auM1:
                print("Das Monster ist ausgewichen!")
                print("Du richtest keinen Schaden an.")
                print("Was Monster greift dich an!")
                ause = 11

                if auS < ause:
                  print("Du bist erfolgreich ausgewichen.")
                elif auS >= ause:
                  print("Du wurdest getroffen!")
                  hp_spieler = hp_spieler - angm
                  print("Deine HP sind um " + str(angm) + " gesunken.")

            if ans == con2:
              print("Du blockst, die Chance den Angriff abzuschwächen ist höher.")
              ausB = random.randint(1, 20)
              blockenS = 16
              angmb = random.randint(1, 5)  # Angriff Monster Block
              angsb = random.randint(1, 4)
              print("Du greifst mit deiner Waffe an.")
              if auM < auM1:
                print("Du hast das Monster getroffen!")

                print("Dein Angriff macht " + str(angsb) + " Schaden.")
                hp_monster = hp_monster - angsb
                print("Das Monster hat noch " + str(hp_monster) + " HP übrig.")

              elif auM >= auM1:
                print("Das Monster ist ausgewichen!")
                print("Du richtest keinen Schaden an.")
              print("Was Monster greift dich an!")
              if ausB < blockenS:
                print("Du hast den Schaden vollständig geblockt.")
              elif ausB >= blockenS:
                print("Du hast den Angriff geschwächt")
                print("Du erleidest " + str(angmb) + " HP Schaden")
            if ans == con3:

             trank_m = 0
             if traenke > trank_m:
                print("Du holst einen Heilungstrank aus der Tasche und trinkst ihn.")
                heal = random.randint(1, 12)
                print(str(heal) + " HP wurden wieder hergestellt.")
                hp_spieler = hp_spieler + heal
                traenke = traenke - 1

             elif traenke <= trank_m:
                print("Du hast bereits alle Tränke ausgebraucht.")

             if hp_monster <= hp_monster_tod:
              print("Du hast das Monster besiegt!")
              n += 1
              break

             if hp_spieler <= hp_spieler_tod:
                 break







             print("Du bist gestorben!")
             print("Du hast " + str(n) + " Monster vor deinem Tod besiegt.")
             if r < n:
              print("Dies ist dein neuer Rekord!")






elif ch1 != pro:
    print("Dann komm wieder, wenn du es dir anders überlegt hast.")
    exit()








             print("Du bist gestorben!")
             print("Du hast " + str(n) + " Monster vor deinem Tod besiegt.")
             if r < n:
              print("Dies ist dein neuer Rekord!")






elif ch1 != pro:
    print("Dann komm wieder, wenn du es dir anders überlegt hast.")
    exit()

Fehlercode:
line 47, in <module>
print("HP Spieler: " + str(hp_spieler) + " HP Monster: " + str(hp_monster))
NameError: name 'hp_spieler' is not defined


Habe versucht eine Funktion zu benutzen hat nicht so geklappt, aber "hp_spieler = hp_spieler - angm" ist genau was ich meine
Zuletzt geändert von raffyn am Dienstag 26. Januar 2021, 19:43, insgesamt 2-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Kannst du bitte deinen Code zwischen Code-Tags setzen (die erscheinen automatisch, wenn du im "vollständigen Editor" den </>-Button drückst.
Und zeig bitte die Fehlermeldung, die du bekommst.
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@raffyn: Der Quelltext kommt so nicht am Compiler vorbei weil die Einrückung inkonsistent ist. Eingerückt wird in Python mit vier Leerzeichen pro Ebene.

`hp_spieler` existiert nur wenn in der ``while``-Schleife davor der Programmablauf auch tatsächlich bis zur Definition dieses Namens gekommen ist. Falls die Schleife vorher durch das ``break`` im ersten Durchlauf schon abgebrochen wird, existiert der Name natürlich nicht.

Du hast da einen Haufen schlechte Namen. Immer wenn Du eine Abkürzung hast wo danach in einem Kommentar erklärt wird was das heissen soll, solltest Du einen vernünftigen Namen verwenden, der den Kommentar überflüssig macht. Kryptische Abkürzungen in Namen sind schlecht und nummerierte Namen auch. Einbuchstabige Namen in der Regel ebenfalls.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Wobei das alles für *eine* Funktion auch zu viel ist. Das lässt sich sinnvoll auf mehrere Funktionen aufteilen.

`input()` gibt bereits eine Zeichenkette zurück, es macht also keinen Sinn das an `str()` zu übergeben.

``"y" or "Y"`` ist das gleiche wie "y" weil das bereits ”wahr” ist:

Code: Alles auswählen

In [315]: "y" or "Y"                                                            
Out[315]: 'y'
Diesen Unsinn machst Du noch ein paar mal.

``random.sample()`` um *eine* Zufallszahl zu erzeugen und die dann mit einer festen Zahl vergleichen in dem man diese feste Zahl in eine Liste steckt? Warum?

Das zusammenstückeln von Zeichenketten und Werten mittels ``+`` und `str()` ist eher BASIC als Python. Dafür gibt es die `format()`-Methode auf Zeichenketten und f-Zeichenkettenliterale.

Wenn man im einem ``elif`` genau das Gegenteil vom ``if`` testet, wollte man eigentlich ein ``else`` verwenden.

`exit()` gibt es eigentlich gar nicht. Das existiert eher zufällig. Falls man das braucht sollte man es auch `sys` importieren. Allerdings sollte man das nur verwenden wenn man mindestens potentiell einen anderen Rückgabecode als 0 an das aufrufende Programm übermitteln will. Ansonsten sollte man den Code so schreiben, dass er zu einem ”natürlichen” Ende kommt, ohne Abkürzungen zu nehmen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
raffyn
User
Beiträge: 3
Registriert: Dienstag 26. Januar 2021, 19:10

__blackjack__ hat geschrieben: Dienstag 26. Januar 2021, 20:31 @raffyn: Der Quelltext kommt so nicht am Compiler vorbei weil die Einrückung inkonsistent ist. Eingerückt wird in Python mit vier Leerzeichen pro Ebene.

`hp_spieler` existiert nur wenn in der ``while``-Schleife davor der Programmablauf auch tatsächlich bis zur Definition dieses Namens gekommen ist. Falls die Schleife vorher durch das ``break`` im ersten Durchlauf schon abgebrochen wird, existiert der Name natürlich nicht.

Du hast da einen Haufen schlechte Namen. Immer wenn Du eine Abkürzung hast wo danach in einem Kommentar erklärt wird was das heissen soll, solltest Du einen vernünftigen Namen verwenden, der den Kommentar überflüssig macht. Kryptische Abkürzungen in Namen sind schlecht und nummerierte Namen auch. Einbuchstabige Namen in der Regel ebenfalls.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Wobei das alles für *eine* Funktion auch zu viel ist. Das lässt sich sinnvoll auf mehrere Funktionen aufteilen.

`input()` gibt bereits eine Zeichenkette zurück, es macht also keinen Sinn das an `str()` zu übergeben.

``"y" or "Y"`` ist das gleiche wie "y" weil das bereits ”wahr” ist:

Code: Alles auswählen

In [315]: "y" or "Y"                                                            
Out[315]: 'y'
Diesen Unsinn machst Du noch ein paar mal.

``random.sample()`` um *eine* Zufallszahl zu erzeugen und die dann mit einer festen Zahl vergleichen in dem man diese feste Zahl in eine Liste steckt? Warum?

Das zusammenstückeln von Zeichenketten und Werten mittels ``+`` und `str()` ist eher BASIC als Python. Dafür gibt es die `format()`-Methode auf Zeichenketten und f-Zeichenkettenliterale.

Wenn man im einem ``elif`` genau das Gegenteil vom ``if`` testet, wollte man eigentlich ein ``else`` verwenden.

`exit()` gibt es eigentlich gar nicht. Das existiert eher zufällig. Falls man das braucht sollte man es auch `sys` importieren. Allerdings sollte man das nur verwenden wenn man mindestens potentiell einen anderen Rückgabecode als 0 an das aufrufende Programm übermitteln will. Ansonsten sollte man den Code so schreiben, dass er zu einem ”natürlichen” Ende kommt, ohne Abkürzungen zu nehmen.

Okay, klingt danach, als hätte ich noch viel zu lernen. :shock: Könnte ich bitte noch eine kleine Checkliste bekommen, was ich nun verändern soll / wie es besser ist? Darüber würde ich sehr freuen, danke.
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte nicht den gesamten Post davor nochmal zitieren. Der steht doch da. Und da sind doch eine Menge konkreter Hinweise
Antworten