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
Variablen in Python
Okay, also ich wollte so ein kleines Minigame programmieren.
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
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.
- __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:
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.
`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'
``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
__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:Diesen Unsinn machst Du noch ein paar mal.Code: Alles auswählen
In [315]: "y" or "Y" Out[315]: 'y'
``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. 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.