Warum Funktioniert mein Python Programm nicht, obwohl es fehlerfrei ist?
Hallo,
ich möchte so ein Wahl spiel in Python machen, wo das Programm dir Antworten vorschlägt und du sie dann eingeben musst usw. ...
Das Problem aber ist das das Programm nicht ausgeführt wird, obwohl es Fehlerfrei ist. Es kommt übrigens auch keine Fehlermeldung.
das Programm wird einfach gekillt, nachdem ich bei Laserschneider die 1 eingebe.(Die 1 steht ja auch für den Laserschneider)
Übrigens: was ep1wam1 und so weiter bedeutet, steht ganz am Anfang des Codex.
Vielen Dank im voraus!
FormulaSun12
Der Codex:
# ep = Episode
# wam = wahlmöglichkeiten
# wa = Wahl
# er = erneut
# sf = sicherheitsnachfrage
from time import sleep
episode1 = True
episode2 = False
def ep1wam1():
ep1wam1 = int(input ("Laserschneider; Jet Pack; Untererde-Loch-graber-Maschiene; Einfach an der Tür Klopfen (1=Laserschneider)"))
# Begrüßung
name = input ("Name?") # Frägt nach Namen
print ("Wilkommen", name, ",")
print ("Beantworte die Fragen mit den angegebenen Antworten. Die angegebenen Antworten sind in Klammern")
sleep (1.0)
input ("Drücken sie eine Taste um fortzufahren!")
print ("Spiel Ladet, bitte warten...")
sleep (3.0)
# Episodenauswahl
episode = int(input ("Episodenauswahl, bitte wählen sie einen Episod! (1);(2)"))
# Wenn Episode 1 wurde ausgewählt und episode1 ist True dann:
if episode1 == True and episode == 1:
print ("EPISODE 1")
sleep (1.5)
print ("20. JUNI 2022")
sleep (1.5)
print ("DU STEHST VOR EINEM RIESEGNEN, GUT BEWACHTEN GELDSPEICHER WO DU EINBRECHEN WILLST!")
sleep (1.5)
print()
print ("WÄHLE EINEN DIESER SACHEN UND PROBIERE REINZUKOMMEN! ABER PASS AUF! DAS GEBÄUDE WIR SEHR STRENG ÜBERWACHT! VIEL GLÜCK!")
print ()
sleep (1.5)
ep1wam1()
# Wenn der Laserschneider ausgewählt wurde:
if ep1wam1 == 1:
print ("Die Maschine schneidet einen großen Loch in die Wand.")
sleep(1.5)
print ("Das hätte prima funktioniert wenn das ausgeschneidete Teil nicht auf dich draufgefallen wäre :/")
sleep(1.5)
print ("FAIL!")
ep1wam1wa1er = int(input ("Erneut versuchen? (1 für ja);(2 für nein)"))
if ep1wam1wa1er == 1:
ep1wam1()
elif ep1wam1wa1er == 2:
ep1wam1wa1sf = int (input ("Das Spiel hört hier auf. Bist du sicher das du verlassen möchtest? Das Spiel Speichert NICHT! (1=ja);(2=nein)"))
if ep1wam1wa1sf == 1:
ep1wam1()
elif ep1wam1wa1sf == 2:
quit()
# Wenn Episode 2 noch nicht freigeschalten ist dann:
elif episode2 == False and episode == 2:
print ("Diese Episode ist noch gesperrt! Schliese erst die Anderen ab!")
5 Antworten
Ich denke, es funktioniert deswegen nicht, denn
def ep1wam1():
ep1wam1 = int(input ("Laserschneider; Jet Pack; Untererde-Loch-graber-Maschiene; Einfach an der Tür Klopfen (1=Laserschneider)"))
die Variable ep1wam1 ist eine locale Variable und wird unten nicht erkannt. Eigentlich müsste eine Fehler rauskommen...
vor dem def schreib sowas wie ep1wam1 = 0, damit diese Variable im Hauptverlauf einmal definiert wird.
Tut mir leid, aber es klappt immer noch nicht.
Ich habe es so eingetippt:
ep1wam1 = 0
def ep1wam1():
ep1wam1 = int(input ("Laserschneider; Jet Pack; Untererde-Loch-graber-Maschiene; Einfach an der Tür Klopfen (1=Laserschneider)"))
Muss man in Python nicht beim Deklarieren/Verändern einer Variable das Schlüsselwort global benutzen, wenn man die globale Variable ansprechen möchte, statt einer lokalen zu erzeugen?
Man kann globale Variablen zwar abfragen ohne das Schlüsselwort, aber keine Werte zuweisen, sonst wird eine lokale erstellt.
ep1wam1 = 0
def ep1wam1():
global ep1wam1
ep1wam1 = int(input ("Laserschneider; Jet Pack; Untererde-Loch-graber-Maschiene; Einfach an der Tür Klopfen (1=Laserschneider)"))
genau das wollte ich auch schreiben!
Und schreibe bitte (übersichtshalber) unterschiedliche Namen für eine Funktion und eine Variable, aber GuteAntwort2021 hat recht und somit funktioniert es auch!
Vielen Dank! So Funktioniert es wirklich. Blöd ist: Wenn ich bei Erneut versuchen auf die 1 klicke dann Passiert das gleiche wie vorhin. Warum???
Du musst auf den Zeileneinzug etc. achten.
In Python ist:
if True:
if False:
print("Falsch")
if True:
print("Wahr")
etwas anderes als
If True:
if False:
print("Falsch")
if True:
print("Wahr")
Ansonsten beherzige den Tipp von pushido und nenn die Funktion anders.
# ep = Episode
# wam = wahlmöglichkeiten
# wa = Wahl
# er = erneut
# sf = sicherheitsnachfrage
from time import sleep
episode1 = True
episode2 = False
ep1wam1 = 0
def func_ep1wam1():
global ep1wam1
ep1wam1 = int(input ("Laserschneider; Jet Pack; Untererde-Loch-graber-Maschiene; Einfach an der Tür Klopfen (1=Laserschneider)"))
# Begrüßung
name = input ("Name?") # Frägt nach Namen
print ("Wilkommen", name, ",")
print ("Beantworte die Fragen mit den angegebenen Antworten. Die angegebenen Antworten sind in Klammern")
sleep (1.0)
input ("Drücken sie eine Taste um fortzufahren!")
print ("Spiel Ladet, bitte warten...")
sleep (3.0)
# Episodenauswahl
episode = int(input ("Episodenauswahl, bitte wählen sie einen Episod! (1);(2)"))
# Wenn Episode 1 wurde ausgewählt und episode1 ist True dann:
if episode1 == True and episode == 1:
print ("EPISODE 1")
sleep (1.5)
print ("20. JUNI 2022")
sleep (1.5)
print ("DU STEHST VOR EINEM RIESEGNEN, GUT BEWACHTEN GELDSPEICHER WO DU EINBRECHEN WILLST!")
sleep (1.5)
print()
print ("WÄHLE EINEN DIESER SACHEN UND PROBIERE REINZUKOMMEN! ABER PASS AUF! DAS GEBÄUDE WIR SEHR STRENG ÜBERWACHT! VIEL GLÜCK!")
print ()
sleep (1.5)
func_ep1wam1()
# Wenn der Laserschneider ausgewählt wurde:
if ep1wam1 == 1:
print ("Die Maschine schneidet einen großen Loch in die Wand.")
sleep(1.5)
print ("Das hätte prima funktioniert wenn das ausgeschneidete Teil nicht auf dich draufgefallen wäre :/")
sleep(1.5)
print ("FAIL!")
ep1wam1wa1er = int(input ("Erneut versuchen? (1 für ja);(2 für nein)"))
if ep1wam1wa1er == 1:
func_ep1wam1()
elif ep1wam1wa1er == 2:
ep1wam1wa1sf = int (input ("Das Spiel hört hier auf. Bist du sicher das du verlassen möchtest? Das Spiel Speichert NICHT! (1=ja);(2=nein)"))
if ep1wam1wa1sf == 1:
func_ep1wam1()
elif ep1wam1wa1sf == 2:
quit()
# Wenn Episode 2 noch nicht freigeschalten ist dann:
elif episode2 == False and episode == 2:
print ("Diese Episode ist noch gesperrt! Schliese erst die Anderen ab!")
Aber: Du hast keinerlei Schleifenmechanik implementiert. Es läuft also quasi von oben nach unten durch. Es wird dann zwar erneut die Funktion abgerufen, aber das Programm springt dann nicht zu dem Funktionsaufruf oder so. Es führt die Funktion aus und läuft dann von dem Punkt weiter.
Also führt es:
if ep1wam1wa1er == 1:
func_ep1wam1()
aus und danach ist Ende.
Die Variable "ep1wam1" existiert nur im lokalem Scope deiner Funktion "ep1wam1", da sie dort erstmalig verwendet wird.
Da, wo du die gleichnamige Variable prüfst, greifst du aber auf eine gleichnamige Variable im globalem Scope zu, die noch keinen Wert hat, deshalb evaluiert die if-Abfrage zu "false".
Zum lösen musst du entweder "ep1wam1" vor deiner Funktion deklarieren oder den Wert der Abfrage anderweitig (beispielsweise als Rückgabewert) aus deiner Funktion hinaus propagieren.
Habe nur mal kurz darüber geschaut. Nenne die Variablen und Funktionen nicht gleich. Eventuell ist der Fehler da. Ich bin kein Python Experte, aber das sieht falsch aus. Probiere es mal und gib dann gerne eine Rückmeldung, ob es das war
Sorry, bin auch kein Python Experte aber wenn ich das jetzt richtig verstanden habe dann muss ich den
def ep1wam1():
ep1wam1 = int(input ("")
nicht zwischen die True und False Variablen hintun?
Nein, meine Idee war, die Variable nicht so zu nennen, wie die Funktion.
def ep1wam1(): und ep1wam1 heißen gleich. Benenne einen der beiden um
Nein klappt leider auch nicht. Aber trotzdem Danke!
obwohl es fehlerfrei ist?
Offensichtlich ist es nicht fehlerfrei, sonst würde es ja funktionieren.
Naja damit meine ich das es keine Fehlermeldung gibt.
Ja, aber wie du spätestens jetzt gelernt hast: Nicht jedes Programm, das keine Syntaxfehler hat und auch zur Laufzeit nicht abstürzt, macht was es soll. Das sind dann die logischen Fehler, die meist viel schwerer zu finden sind.
müsste schon bei
"name = input ("Name?")"
ein prompt anzeigen und auf Eingabe warten.
Also stimmt vermutlich irgendetwas mit entweder
dem Aufruf des Scriptes nicht, oder mit deiner
Python Installation.
Sorry. ich hab Stückel gequotet, und
bekomme jetzt das quote attribut vom Text nicht weg.
Tut mir Leid aber Irgendwie glaube ich das es hier nicht der Fall ist. Falls doch, dann Melde ich mich nochmal.
Aber vielen Dank für die Antwort!
Also mal probiert: http://snap.scarydevilmonastery.net/1657715947718259451d.png
Schauen schlägt glauben.
biddewas? dasselbe? nee - der screenshot zeigt doch, dass es ausgeführt wird - da wird das Prompt nach Name doch angezeigt. Ohne dass der Script abgearbeitet würde, könnte doch auch das Prompt nicht angezeigt werden.
Also nicht dasselbe, sondern anderes, weil bei dir: "das Programm nicht ausgeführt wird"
Entschuldigung, aber irgendwie kapier ich das irgendwie nicht richtig. Also was ist der unterschied statt es im Python Shell laufen zu lassen?
Sollte kein Unterschied sein. Bei Unixoiden würdest du aber auf der ersten Zeile noch ein hashbang aka shebang zufügen wollen, in dem angegeben wird, mit welchem Programm der Script zu öffnen ist. Ausserdem würdest du execute-permission setzen wollen. Aber ohne Meldung abbrechen würde Fehlen von keinem der beiden machen.
Gesehen dass da weder ein hashbang drinsteht noch ich execute permission gesetzt hatte, hab ich darum den Namen der Datei des Scripts als Argument an den Aufruf des Interpreters mitgegeben.
Und was kann ich dagegen tun?