Warum funktioniert das nicht?

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
GothicBanane
User
Beiträge: 1
Registriert: Montag 12. Februar 2024, 10:47

Hallo, ich bin gestern mit python eingestiegen, und habe nun ein script für ein spiel schreiben wollen. Nur funktioniert das nicht so ganz:

#Detektivstory mit mehreren räumen. (Auf deutsch)
import random
import time
def displayIntro():
print:('''Du bist ein Detektiv. In deinem neuesten Fall muss ein Mörder gefunden werden, der sich in einer Villa versteckt hat. Die Geschichte spielt im Juni 2010. Du musst den Mörder finden bervor er dich tötet.Aber Vorsicht ist geboten, da mit jeder falschen Antwort du ihm mehr Zeit gibst, dich zu töten.''')


def decision1():
decision1 = ' '
while decision1 != '1' and decision1 != '2' and decision1 != '3':
print('''Dieser Raum ist der Eingangsbereich der Villa. An der Decke hängt ein großer Kronleuchter und eine lange Treppe führt in den ersten Stock. Zu deiner linken un deiner rechten siehst du jeweils einen langen Gang.''')
print('Auf dem Boden liegt eine Notiz. Du gehst näher und hebst diese auf. Auf dem Zettel steht in unleserlicher Schrift: Die Binärzahl von 37 wird dir den Gang verraten.')
print('Welchen Gang nimmst du? nach links(1), nach oben(2) oder nach rechts(3)')
decision1 = input()

#Wir fangen an mit entscheidung 1_1. man hat also der ersten gang genommen, dieser wird in ein totes ende führen.

def decision1_1():
decision1_1 = ' '
while decision1_1 != '1' and decision1_1 != '2':
print('Du hast den linken Gang gewählt')
print('Du schaust dich um und siehst eine Tür mit einem Toilettenschild darauf.')
print('Gehst du hinein(1), oder gehst du zum Eingang zurück?(2)')
decision1_1 = input()

if decision1_1 == 1:
print('Du gehst in die Toiletten')
print('Du schaust dich um...')
time.sleep(2)
print('Du kannst keinen Hinweis erkennen und gehst zurück zum Eingang.')

return decision1

if decision1_1 == 2:

return decision1

#Der linke flur ist abgearbeitet. Nun kommt enscheidung 1_2 vom anfang

def decision1_2():
decision1_2 = ' '
print('Du steigst die mächtige Treppe hinauf...')
time.sleep(1)
print('Du zählst die Stufen')
time.sleep(2)
print('28 Stufen waren es. Nun bist du im ersten Stock und siehst ein Tor, welches allerdings mit Eisengittern gesichert wurde. Kein Durchkommen. Du gehst wieder nach unten.')

return decision1

#Aktuell ist oben noch verriegelt, wenn andere rätsel gelöst werden, wird der zugang im späteren verlauf frei

def decision1_3():
decision1_3 = ' '
while decision1_3 != '1' and decision != '2' and decision1_3 != '3':
print('Du gehst den rechten Flur entlang. Dir fallen 3 Türen auf, mit jeweils einem Gemälde daran.')
time.sleep(1)
print('Du gehst zur ersten Tür auf der linken Seite. Dort ist ein junges Mädchen abgebildet, unter dem Gemälde steht: Karolin Müller 1935-1962.')
print('Du weißt, dass sie an Cholera gestorben ist.')
time.sleep(2)
print('Du gehst zur nächsten Tür am Ende des Ganges.')
time.sleep(2)
print('An der Tür hängt ein bild eines Mannes, dieser ist offensichtlich groß und reich. Du erkennst den ehemaligen Besitzer dieser Villa.')
print('Unter dem Bild steht: Otto Müller 1897-1941')
print('Du weißt also, dass er vor 69 Jahren gestorben ist.')
print()
print('Du gehst zur nächsten Tür, auf der rechten Seite des Flures.')
time.sleep(2)
print('Dort siehst du ein Gemälde einer Frau, welche mit viel Gold geschmückt ist.')
print('Unter dem Bild steht Josefine Müller 1915-1958')
print('Du guckst dich weiter um und entdeckst Schrift an der Decke: Wie alt war die Mutter als sie die Tochter bekam geteilt durch 10, wird dir die Tür zeigen.')
print('Du siehst zudem ein großes T an der Decke. Durch welche Tür musst du gehen? Die erste vom Kind(1), die zweite vom Besitzer(2) oder die dritte von der Ehefrau(3)')
decision1_3 = input()

if decision1_3 == 1:
def decision1_3_1():
decision1_3_1 == ' '
while decision1_3_1 != '1' and decision1_3_1 != '2':
print('Du gehst in den Raum. Du hörst ein Klacken, drehst dich um und siehst, dass die Tür verperrt wurde. Du bist eingesperrt.')
time.sleep(4)
print('Möchtest du nochmal spielen? JA(1) NEIN(2)')

decision1_3_1 = input()

if decision1_3_1 == 1:
return decision1

if decision1_3_1 == 1:

return decision1



displayIntro()
decision1()
if decision1 == '1':
decision1_1()
if decision1 == '2':
decision1_2()
if decision1 == '3':
decision1_3()
Sirius3
User
Beiträge: 18054
Registriert: Sonntag 21. Oktober 2012, 17:20

"Funktioniert nicht" ist eine schlechte Fehlerbeschreibung. Was soll das Programm tun? Was macht es statt dessen?

Wenn man while-Schleifen nur dann starten kann, wenn man die Bedingungsvariable mit einem Dummy-Wert belegt, dann hat man eigentlich eine while-True-Schleife, die am Ende per if...-break abbricht.
In `decision1` hast Du eine Variable, die so heißt wie die Funktion, das sollte nicht sein. Die Funktion hat auch keinen Rückgabewert.

Code: Alles auswählen

def decision1():
    while True:
        print('''Dieser Raum ist der Eingangsbereich der Villa. An der Decke hängt ein großer Kronleuchter und eine lange Treppe führt in den ersten Stock. Zu deiner linken un deiner rechten siehst du jeweils einen langen Gang.''')
        print('Auf dem Boden liegt eine Notiz. Du gehst näher und hebst diese auf. Auf dem Zettel steht in unleserlicher Schrift: Die Binärzahl von 37 wird dir den Gang verraten.')
        print('Welchen Gang nimmst du? nach links(1), nach oben(2) oder nach rechts(3)')
        answer = input()
        if answer in ["1", "2", "3"]:
            break
    return answer
Im weiteren Programmverlauf machst Du auch nichts mit dem Rückgabewert.
In `decision1_1` gibst Du die Funktion `decision1` zurück. Ist das so gewollt? Mit dem Rückgabewert tust Du aber auch nichts. `input` gibt einen String zurück, der kann niemals gleich der Zahl 1 oder 2 sein.
Statt dessen endet die Funktion bei Eingabe von "1" einfach so, ohne Rückgabewert (also implizit None), das sollte nicht sein.
In `decision1_3` definierst Du eine Funktion `decision1_3`, aber man sollte keine Funktionen innerhalb von anderen Funktionen definieren (außer ein paar Ausnahmen für Wrapper oder interne kurze Funktionen).

Das `Hauptprogramm` macht auch relativ wenig. decision1 ist eine Funktion und die kann niemals gleich einem String sein.

Du solltest nochmal nachlesen, was Typen in Python sind und wie man z.B. Strings in Zahlen umwandelt.
Auch solltest Du Dir noch ein paar Beispiele anschauen, was Funktionen sind, und wie man sie verwendet, insbesondere was Rückgabewerte sind.
Benutzeravatar
__blackjack__
User
Beiträge: 13572
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das die Funktionsnamen durchnummeriert sind, ist auch ein Zeichen, dass da etwas komisch ist. Entweder will man sich bessere Namen überlegen die auch tatsächlich verraten was die Funktionen machen, oder man will hier eigentlich eher eine Datenstruktur verwenden um die Räume/Orte zu modellieren.

Funktionen werden üblicherweise nach der Tätigkeit benannt die sie durchführen, damit der Leser weiss was das ist. Also statt `decision1()` beispielsweise `visit_villa_entrance()`.
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Antworten