Problem mit Funktion

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
Methatox
User
Beiträge: 2
Registriert: Freitag 29. März 2019, 10:26

Schönen guten Tag liebe Community,

Ich bin neu in diesem Forum und auch ein Neuling in Sachen Python. Die Grundlegenden Dinge habe ich aber denke ich verstanden und Wittme mich grade meinem ersten Projekt, einem Textbassierten Abenteuerspiel.

Nun komme ich zu meinem Problem.
Ich möchte gerne das mein Charakter Stats bekommt wie Leben, Stärke und Rüstung.
Es soll wie folgt aufgebaut sein (Code wurde zu Vereinfachung gekürzt)

Import time
Import os

def intro():
print("Willkommen zu Dragonborn!")
time.sleep(2)
print("Wie heißt du?")
username = input(">")
print("Hallo",username,"bist du bereit für ein Abenteuer?")
print("Gebe 'Ja' ein um zu starten")
print("Gebe 'Nein' ein zum Beenden")
weg = input(">")
if weg == "Ja" or weg == "ja":
print("Dann lasse mich zuerst die Geschichte erzählen",username,)
showstory()
if weg == "Nein" or weg == "nein":
os.system('clear')

def showstory():
#an dieser Stelle gekürzt
print("Für welchen Gegenstand entscheidest du dich")
print("1> Schwert")
print("2> Kettenhemd")
choseitem = input(">")
if choseitem == "1":
print("Eine gute Entscheidung, deine Stärke beträgt nun",Stärke + 10,"!")
dungeon()
if choseitem == "2":
print("Du kannst dich nun sicherer fühlen, deine Rüstung beträgt nun",Rüstung + 15,"!")
dungeon()

def dungeon ():
print("Du stehst vor einer Abzweigung, welchen Weg wählst du?")
print("1>Den linken Weg Richtung Wald")
print("2>Den rechten Weg Richtung Berg")
path = input (">")
if path == "1":
print("Ein Wolf fällt dich von der Seite an, du verlierst Leben, du hast nun noch",Leben - 15,"Lebenspunkte")
print("Willst du ausweichen oder zückst du dein Schwert")
chose = input(">")

intro()

#Ich denke der Grundgedanke sollte klar sein. Nun weiß ich nicht wie ich dir Stats wie HP usw. definieren kann, so das sie sich von Etappe zu Etappe ändern lassen und in die neuen "level" übertragen kann.
Ich hab es schon mit Global versucht, gegoogelt und festgestellt das dies wohl der Falsche Weg ist.
Ich wäre euch dankbar wenn mir jemand da auf die Sprünge helfen kann.
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Methatox: Beim kürzen hast Du Syntaxfehler eingebaut. ``import`` schreibt man klein und an einer Stelle ist ein Einrückungsfehler.

Dann solltest Du mal einen Blick in den Style Guide for Python Code werfen was beispielsweise Namenschreibweisen, und Leerzeichensetzung angeht.

Bei den Namen sollte man auch noch dazu sagen das Funktionen und Methoden üblicherweise nach der Tätigkeit benannt werden die sie durchführen. `dungeon` ist keine Tätigkeit.

Funktionen sind zudem keine Sprungmarken und Aufrufe kein GOTO. Mir scheint das Du da in jeder Funktion immer die die nächste Funktion aufrufen willst und damit eine immer längere Kette von Funktionsaufrufen entsteht und sich so immer mehr angefangene aber nicht zuende abgarbeitete Funktionsaktivierungen ansammeln. Eine Funktion sollte in der Regel so geschrieben sein, das sie aufgerufen wird, ihren Job erledigt, und dann zum Aufrufer zurück kehrt. Nur auf diese Weise kann man beispielsweise auch mal einzelne Funktionen isoliert testen um zum Beispiel fehler zu finden.

Wenn eine Funktion entscheiden können soll welche andere Funktion als nächstes aufgerufen wird, kann man beispielsweise die Folgefunktion als Rückgabewert an den Aufrufer zurück geben. Dann hat man eine Hauptfunktion die immer eine Funktion aufruft, die beispielsweise einen Ort im Adventure abarbeitet, und diese Funktion gibt dann an die Hauptfunktion die Folgefunktion zurück, für den Ort der als nächstes besucht werden soll.

Globale Variablen sind in der Tat nicht gut. Dafür haben Funktionen die Möglichkeit Argumente entgegen zu nehmen und Rückgabewerte an den Aufrufer zurück zu geben.

Man könnte dann jeder Ortsfunktion den Zustand der Welt als Argument übergeben und den veränderten Zustand als Rückgabewert zurück geben. Da der Zustand der Welt/des Spielers aus mehreren Werten besteht, sind wir aber im Grunde schon dabei Klassen zu benötigen, denn man will sicher nicht all die Einzelwerte immer übergeben/zurückgeben, sondern Werte zu Objekten zusammenfassen. Wenn es Datenklassen geht, ist das externe Package `attr` einen Blick wert. Wenn man funktional bleiben möchte, dann kann man auch Datenklassen mit `frozen=True` erstellen und die `attr.evolve()`-Funktion um Werte zu ”ändern”.

Du hast sehr oft Auswahlen zwischen mehreren Möglichkeiten für den Benutzer im Programm, die im Grunde immer aus sehr ähnlichem Code bestehen – das sollte man in eine Funktion auslagern. Die sollte sich dann auch darum kümmern, dass der Benutzer gezwungen wird eine gültige Eingabe zu machen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Methatox
User
Beiträge: 2
Registriert: Freitag 29. März 2019, 10:26

@__blackjack__
Das mit dem syntaxfehler ist mir im nachhinein auch aufgefallen und das import groß geschrieben war, lag leider an der Autokorrektur.

An deiner Antwort merke ich grade mal wie sehr ich noch am Anfang stehe :D Ich wollte halt schauen wie weit ich mit meinem Wissen komme wenn ich ein kleines adventure game programmieren möchte und mir zusätzliches wissen per google und learning by doing aneignen. Aber gut, das führt mir vor Augen das ich mir mal eine Ausführliche Lektüre schnappen muss und mich komplett einlesen muss bevor ich so ein Projekt starte. Gibt es da etwas empfehlenswertes oder ein must-have an Lektüre? Gerne auch freie PDF's auf deutsch oder englisch.

Ich danke dir für deine Antwort. Auch wenn sie mir nicht mit meinem Projekt hilft, hilft sie mir mit meiner persönlichen Entwicklung.
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Methatox: Für Python lohnt es sich IMHO das Tutorial aus der Python-Dokumentation mal durchgearbeitet zu haben.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten