Kirchenchor / textadventure

Learning project
GNU General Public License v3.0
0 stars 0 forks source link

Python-Frage zum Textadventure #5

Closed cseyda closed 5 years ago

cseyda commented 6 years ago

Robin asked:

Im Moment will ich vor allem verstehen, wie das "spätere Gameplay" funktioniert. Also wie sich die Person bewegt und wie sie mit Objekten interagieren kann. Also keine Inhalte/Story etc.

Grundlegende Frage: Wie bekomme ich aus einer Funktion einen Wert heraus, mit dem ich arbeiten kann?

user_pos_x = 0
user_pos_y = 0

def go_right():
    print('You go to the right side')
    x = user_pos_x + 1

# x will ich dann in user_pos_x übernehmen

user = input('Enter something: ')

if str(user) == 'right':
    go_right()

Ich will also, dass der User sagt wohin er geht (im dem Fall "right"). Dann soll die Funktion go_right den user_pos_x Wert nehmen, ihn addieren und wiederzurückgeben.

Wie funktioniert das mit dem Zurückgeben eines Wertes im def? Es existiert ja nur die lokale Variable in der def. Dass mit den Argumenten (go_right(argument_1, arg_2 etc.), hab ich nur als "Zusatz-Wert" verstanden (kann eine default-Nachricht sein oder ein Wert der mitgenommen werden soll ..), aber keine Ahnung, wie ich da einen Wert als globalen Wert zurückgeben kann. Mit Return gibt er auch keine Variable weiter (?)

Ja ein simples Problem, aber ich blicke es nicht.

cseyda commented 6 years ago
x = 0
y = 0

def go_right(x, y):
    print('You go to the right side')
    new_x = x + 1
    return new_x, y

# x will ich dann in user_pos_x übernehmen

user = input('Enter something: ')

if str(user) == 'right':
    x, y = go_right(x, y)

etwa sowas?

dazu dann noch eine loop, so dass man immer befehle eingeben kann, um entsprechend mit dem spiel zu interagieren.

burningox commented 6 years ago

Ja, das sieht sehr passend aus. Danke.

Ich hab auch ein wenig experimentiert und bin dann auf folgende, ähnliche aber etwas umständlichere Idee gekommen:

user_pos_x = 0
user_pos_y = 0

def get_movement():
    user = input('Where do you want to go? ')    
    if str(user) == 'left':
       x = user_pos_x - 1
       y = user_pos_y
       return x,y 
    elif str(user) == 'right':
       x = user_pos_x + 1
       y = user_pos_y
       return x,y
    elif str(user) == 'up':
       x = user_pos_x 
       y = user_pos_y + 1
       return x,y
    elif str(user) == 'down':
       x = user_pos_x 
       y = user_pos_y - 1
       return x,y         

choice = input('What do you want do do? move or interact? ')

if choice == str('move'):
    move = get_movement()    
if choice == str('interact'):
    interact = get_interaction()

user_pos = move

user_pos_x = user_pos[0]
user_pos_y = user_pos[1]

key_x = 1
key_y = 1

if user_pos_x and user_pos_y == key_x and key_y:
    print('You found a key')

Probleme hatte ich beim return: Anscheinend ist es schwer möglich, zwei Werten per return zurückzugeben. Daher hab ich dann sowohl x als auch y per Liste zurückgeschickt und lese diese dann jeweils aus. Dass ich die return values noch einmal in "move" zwischenspeichere, ist wohl unnötig, aber auf feinere Lösungen komme ich im Moment ad hoc nicht.

Inwiefern die Abfrage nach move oder interact Sinn macht, wird sich noch zeigen. Aber das ist zumindest dann schon foreshadowing auf andere Issues ... Aber erst einmal eins nach dem anderen. Das Movement muss ja noch im Loop "wiederverwendbar" sein.

Edit: Sollte jetzt formatiert sein

cseyda commented 6 years ago

formatting?

cseyda commented 6 years ago

du gibst doch fast überall mehrere werte per return zurück? wo / wann tritt deiner ansicht nach ein problem auf?

cseyda commented 6 years ago

anstatt

user_pos = move
user_pos_x = user_pos[0]
user_pos_y = user_pos[1]

kannst du auch einfach

user_pos = move
user_pos_x, user_pos_y = user_pos

machen.

cseyda commented 5 years ago

scheint geklärt zu sein?