Python Neuling benötigt hilfe bei kleinem Textadventure

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
dtd1972
User
Beiträge: 1
Registriert: Freitag 13. Juli 2018, 13:35

ich habe in einer roomlist.py alle Räume in einem mehrdimensionalen Dictionary (rooms).

13 : { "name" : "13" ,
"north" : 7,
"south" : 19 } ,

14 : { "name" : "14" ,
"north" : 8,
"south" : 20,
"east" : 15,
"info" : "spinne",
"enemy_name" : "höhlenspinne",
"enemy_hp" : 70,
"enemy_ap" : 10,
"enemy_inv" : "gift",
"solved" : False} ,

ich navigiere mit:

move = input(">").lower().split()
move.append("EOI")
if move[0] == "go":
if move[1] in rooms[currentRoom]:
currentRoom = rooms[currentRoom][move[1]]

die komplette Steuerung funktioniert einwandfrei auch meine get Anweisungen sowie meine Kanmpf Funktion klappen prima.
Nur bei einer Sache komme ich nicht weiter und vielleicht kann mir hier jemand weiterhelfen.
Folgendes hatte ich mir gedacht und gewünscht: Wenn in meinem Raum 8 eine Aufgabe erledigt wurde kann ich dort "solved" auf True stellen (das bekomme ich auch hin), wenn ich nun in currentRoom = 14 bin und von dort mit go east nach Raum 15 wechseln möchte soll dies erst möglich sein wenn die Quest in Raum 8 erledigt ist. Jetzt bitte nicht auslachen bin wirklich noch ganz frisch dabei.

ich hatte es versucht über:
if (rooms[currentRoom] == 14 and (rooms[8] not in solved_rooms) and (move[0] == "go" and (move[1] in rooms[currentRoom]):
dann ein print(".....")
dies und andere Dinge habe ich schon probiert alles erfolglos egal was ich mache, der Raumwechsel wird trotzdem durchgeführt

Hoofe das dies (mein erster Post) nicht zu banal ist und mir jemand weiterhelfen kann.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Willst Du jetzt ein "solved" auf True setzen oder eine Variable solved_room benutzen? Und warum sollte man nur von Raum 14 nach Raum 15 kommen, wenn man in Raum 8 war? Diese Abhängigkeiten solltest Du auch in Deiner Datenstruktur widerspiegeln.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also an dem Beispiel kann ``rooms[currentRoom] == 14`` ja schon niemals wahr sein, also kann die dort angeführte Bedingung insgesamt nie wahr werden.

Ausserdem passen beschriebene Datenstruktur und die gezeigte Bedingung nicht zusammen. In der Datenstruktur gibt es im Raum einen 'solved'-Schlüssel, also dort ist der Zustand pro Raum kodiert. In der Bedingung hingegen gibt es plötzlich ein `solved_rooms`, wo der Zustand also für alle Räume drin steht. Was denn nun? Du solltest Dich für eins von beiden entscheiden.

Wenn Du von Raum a nach Raum b nur gehen willst, wenn Raum c gelöst ist, dann müsstest Du das auch erst einmal irgendwie in den Daten kodieren. Sonst hast Du das im Programmcode in den ``if``\s fest drin stehen und man kann nicht mehr beliebige Karten als Daten verwenden. Beispielsweise ein Wörterbuch das (a, b) auf c abbildet und wo vor jedem tatsächlichen Ausführen von 'go' geprüft wird, ob aktuelle Raum-ID a und Zielraum-ID b enthalten sind und falls ja ob der Raum mit der ID c gelöst ist.

Namensschreibweise in Python ist klein_mit_unterstrichen für alles ausser Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Zudem würde ich `currentRoom` treffender `current_room_id` nennen, denn der Code kann wahrscheinlich davon profitieren wenn man `current_room` tatsächlich an den aktuellen Raum bindet. Ebenfalls an einen Namen binden würde ich `move[0]` und `move[1]`, es liest sich einfach besser wenn da statt kryptischer Zahlen sinnvolle Namen stehen. Ich finde das jedenfalls lesbarer:

Code: Alles auswählen

    current_room_id = current_room[direction]
    current_room = rooms[current_room_id]
Warum wird 'EOI' an das Ende der Eingabeliste gehängt?

Ohne jetzt mehr Code von Dir gesehen zu haben, habe ich trotzdem das Gefühl, dass es wichtig ist Dich dazu zu ermuntern mehr Funktionen zu schreiben und denen gute Namen zu geben. Das degradiert sonst bei solchen verschachtelten Datenstrukturen schnell zu kryptischen Index/Schlüsselzugriffs-„train wrecks“.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten