Warum läuft dieser Code nicht?

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
paratus
User
Beiträge: 3
Registriert: Montag 15. Januar 2018, 13:53

Ich muss für die Uni für ein Seminar ein Spiel schreiben und habe mich da für ein Text RPG entschieden. Da ich beim Programmieren ein absoluter Neuling bin, habe ich mich für die Erstellung des Codes sehr stark an das Tutorial von Bryan Tong gehalten ( https://www.youtube.com/channel/UC5akxk ... bQQ/videos ). Allerdings funktioniert der Code bei mir nicht, da er lediglich
runfile('C:/Users/#/Desktop/game.py', wdir='C:/Users/#/Desktop') ausgibt. Ich verstehe nicht, warum es nicht läuft und wäre wirklich dankbar für Hilfe.

Code: Alles auswählen

import cmd
import textwrap
import sys
import os
import time 
import random

screen_width = 100

#### Player Setup ####

class player:
        def __init__(self):
            self.name = ''
            self.job = ''
            self.hp = 0
            self.geld = 0
            self.status_effects = []
            self.location = 'd4'
            self.game_over = False
myPlayer = player() 
    
    #### Titelbild ####
def title_screen_selections():
        option = input("> ")
        if option.lower() == ("Spiel starten"):
            setup_game() #Platzhalter, bis es geschrieben ist
        elif option.lower() == ("Hilfe"):
            help_menu()
        elif option.lower() == ("Spiel verlassen"):
            sys.exit()
        while option.lower() not in ['Spiel starten', 'Hilfe', 'Spiel verlassen']: 
            print("Bitte einen gültigen Befehl eingeben.")
            option = input("> ")
            if option.lower() == ("Spiel starten"):
                setup_game() 
            elif option.lower() == ("Hilfe"):
                help_menu()
            elif option.lower() == ("Spiel verlassen"):
                sys.exit()
        
def title_screen():
    os.system('clear') 
    print('#############################')
    print('#  Willkommen im Text RPG!  #')
    print('#############################')
    print('      - Spiel starten -      ')
    print('      -     Hilfe     -      ')
    print('      -Spiel verlassen-      ')
    title_screen_selections()
    
def help_menu():
    print('#############################')
    print('#  Willkommen im Text RPG!  #')
    print('#############################')
    print('Nutze oben, unten, links, rechts um dich zu bewegen')
    print('Tippe deine Befehle ein, um sie auszuführen')
    print('Nutze "angucken" um etwas zu untersuchen') 
    print('Viel Spaß!')
    title_screen_selections()
    
            
        
    #### Karte ####
#    """
#      1   2   3   4
#    -----------------
#    |   |   |   |   |  a
#    -----------------
#    |   |   |   |   |  b
#    -----------------
#    |   |   |   |   |  c
#    -----------------
#    |   |   |   |   |  d
#    -----------------
#    """

# Spieler startet auf d4 (Hoersaal 4)    
    
    ZONENAME = ' '
    DESCRIPTION = 'beschreibung'      #Strings zur Orientirung auf der Karte
    EXAMINATION = 'umgebung'
    SOLVED = False                     #bolean fuer geloeste Raetsel
    UP = 'oben' , 'norden'
    DOWN = 'unten' , 'süden'
    LEFT = 'links' , 'westen'
    RIGHT = 'rechts' , 'osten'
    
    solved_places = {'a1': False, 'a2': False, 'a3': False, 'a4': False, #dictornary für alle gelösten Rätsel der Orte
                    'b1': False, 'b2': False, 'b3': False, 'b4': False, #Festlegung der Anfangswerte durch boolean false
                    'c1': False, 'c2': False, 'c3': False, 'c4': False, #(noch kein Rätsel gelöst)
                    'd1': False, 'd2': False, 'd3': False, 'd4': False,
                    }
    
    ZONEMAP = {
       'a1':{
           ZONENAME: "Mensa",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: '',
           DOWN: 'b1',
           LEFT: '',
           RIGHT: '',
                },
       'a2':{
           ZONENAME: "Fahrradstaender",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: '',
           DOWN: '',
           LEFT: '',
           RIGHT: '',
                },
       'a3':{
           ZONENAME: "Cafe 9",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: '',
           DOWN: 'b3',
           LEFT: '',
           RIGHT: '',
                }, 
       'a4':{
           ZONENAME: "Fahrradstaender",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: '',
           DOWN: '',
           LEFT: '',
           RIGHT: '',
                }, 
       'b1':{
           ZONENAME: "Weg zur Mensa Nordteil",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: 'a1',
           DOWN: 'c1',
           LEFT: '',
           RIGHT: '',
                },
       'b2':{
           ZONENAME: "Hoersaal 2",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: '',
           DOWN: '',
           LEFT: '',
           RIGHT: 'b3',
                }, 
       'b3':{
           ZONENAME: "Hoersaalgang Nord",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: 'a3',
           DOWN: 'c3',
           LEFT: 'b2',
           RIGHT: 'b4',
                }, 
       'b4':{
           ZONENAME: "Hoersaal 1",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: '',
           DOWN: '',
           LEFT: 'b3',
           RIGHT: '',
                },     
       'c1':{
           ZONENAME: "Weg zur Mensa Mitte",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: 'b1',
           DOWN: 'd1',
           LEFT: '',
           RIGHT: 'c2',
                }, 
       'c2':{
           ZONENAME: "Raucherbereich Ausgang Hoersaalgang Mitte",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: '',
           DOWN: '',
           LEFT: 'c1',
           RIGHT: 'c3',
                }, 
       'c3':{
           ZONENAME: "Hoersaalgang Mitte",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: 'b3',
           DOWN: 'd3',
           LEFT: 'c2',
           RIGHT: '',
                }, 
       'c4':{
           ZONENAME: "Fahrradstaender",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: '',
           DOWN: '',
           LEFT: '',
           RIGHT: '',
                }, 
       'd1':{
           ZONENAME: "Weg zur Uni Sued",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: 'c1',
           DOWN: '',
           LEFT: '',
           RIGHT: '',
                }, 
       'd2':{
           ZONENAME: "Hoersaal 3",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: '',
           DOWN: '',
           LEFT: '',
           RIGHT: 'd3',
                }, 
       'd3':{
           ZONENAME: "Hoersaalgang Sued",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: 'c3',
           DOWN: '',
           LEFT: 'd2',
           RIGHT: 'd4',
                }, 
       'd4':{
           ZONENAME: "Hoersaal 4",
           DESCRIPTION: 'beschreibung',
           EXAMINATION: 'umgebung',
           SOLVED: False,
           UP: '',
           DOWN: '',
           LEFT: 'd3',
           RIGHT: '',
                }, 
            }
        
    #### Spiel-Interaktionen #### 
    
    def print_location():
        print('\n' + ('#' * (4 + len(myPlayer.location))))
        print('# ' + myPlayer.location.upper() + ' #')
        print('# ' + zonemap[myPlayer.location][DESCRIPTION] + ' #')
        print('\n' +('#' * (4 + len(myPlayer.location))))
        
    def prompt():
        print('\n' + "==================================")
        print("Was würdest Du gerne machen?")
        action = input("> ")
        acceptable_actions = ['gehe', 'laufe', 'benutze', 'gucke', 'untersuche', 'Spiel verlassen', 'beschreibung']
        while action.lower() not in acceptable_actions:
            print("unbekannter Befehl, gebe bitte einen anderen Befehl ein.\n")
            action = input("> ")
        if action.lower() == 'Spiel verlassen':
                sys.exit()
        elif action.lower() in ['gehe', 'laufe']:
            player_move(action.lower())
        elif action.lower() in ['benutze', 'gucke', 'untersuche', 'beschreibung']:
            player_examine(action.lower())

    def player_move(myAction):
        ask = "wo würdest Du gerne hingehen?\n"
        dest = input(ask)
        if dest in ['oben' , 'norden']:
            destination = zonemap[myPlayer.location][UP]
            movement_handler(destination)
        elif dest in ['unten' , 'süd']:
            destination = zonemap[myPlayer.location][DOWN]
            movement_handler(destination)
        elif dest in ['links' , 'westen']:
            destination = zonemap[myPlayer.location][LEFT]
            movement_handler(destination)
        elif dest in ['rechts' , 'osten']:
            destination = zonemap[myPlayer.location][RIGHT]
            movement_handler(destination)

            
    def movement_handler(destination):
            print("Du bist zum" + destination + "gegangen.")
            myPlayer.location = destination
            print_location()
        
    def player_examine(action):
        if zonemap[myPlayer.location][SOLVED]:
            print("Du hast bereits alle Aufgaben in diesem Bereich erledigt!")
        else: 
            print("Du hast hier noch etwas zu erledigen!")
        
    #### Spielfunktionen ####
    
    def main_game_loop():
        while myPlayer.game_over is False:
            prompt()
        
    def setup_game():
        os.system('clear')
        
        #### Namensgebung Spieler      
        question1 = "Hallo, wie ist Dein Name?\n"
        for character in question1:
            sys.stdout.right(character)
            sys.stdout.flush()
            time.sleep(0.05)
        player_name = input("> ")
        myPlayer.name = player_name
 
        #### Status Auswahl
        question2 = "Hallo, " + myPlayer.name +  " wie ist dein Status an der Uni?\n"
        question2added = "(Du kannst zwischen Professor, Erstsemester, Drittsemester und Altstudent wählen.)\n"
        for character in question2:
            sys.stdout.write(character)
            sys.stdout.flush()
            time.sleep(0.05)
        for character in question2:
            sys.stdout.write(character)
            sys.stdout.flush()
            time.sleep(0.01)      
        player_job = input("> ")
        valid_jobs = ['Professor', 'Erstsemester', 'Drittsemester', 'Langzeitstudent']
        if player_job.lower() in valid_jobs:
            myPlayer.job = player_job
            print("Aha, du bist also ein " + player_job + "!\n")
            while player_job.lower() not in valid_jobs:
                player_job = input("> ")
            if player_job.lower() in valid_jobs:
                myPlayer.job = player_job
                print("Aha, du bist also ein " + player_job + "!\n")        

#### Statuswerte der Rollen ####
                
            if myPlayer.job is 'Professor':
                self.hp = 40
                self.geld = 200
            elif myPlayer.job is 'Erstsemester':
                self.hp = 100
                self.geld = 10 
            elif myplayer.job is 'Drittsemester':
                self.hp = 80
                self.geld = 0
            elif myPlayer.job is 'Langzeitstudent':
                self.hp = 60
                self.geld = 50

           
            ####Einleitung
            question3 = "Sei willkommen " + player_job + player_name + "!\n"
            for character in question3:
                sys.stdout.write(character)
                sys.stdout.flush()
                time.sleep(0.05)
            player_name = input("> ")
            myPlayer.name = player_name

            speech1 = "Willkommen in der magischen Welt der Leuphana!\n"
            speech2 = "Wollen wir hoffen, dass Du sie unbeschadet überstehst.\n"
            speech3 = "Verpflegung findest Du in der Mensa.\n"
            speech4 = "Solltest Du soweit kommen...\n"
            speech5 = "Hehehehe....\n"

            for character in speech1:
                sys.stdout.write(character)
                sys.stdout.flush()
                time.sleep(0.03)
            for character in speech2:
                sys.stdout.write(character)
                sys.stdout.flush()
                time.sleep(0.03)
            for character in speech3:
                sys.stdout.write(character)
                sys.stdout.flush()
                time.sleep(0.03)
            for character in speech4:
                sys.stdout.write(character)
                sys.stdout.flush()
                time.sleep(0.2)
            for character in speech5:
                sys.stdout.write(character)
                sys.stdout.flush()
                time.sleep(0.3)

            os.system('clear')
            print("######################")
            print("# Lass uns anfangen! #")
            print("######################")
            main_game_loop()
                
    title_screen()
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Deine Einrückungen sind falsch. Alles unterhalb von def help_menu(): ist in deinem Code Teil der Funktion help_menu.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@paratus: Auch an anderen Stellen stimmt die Einrückung, bzw. die Logik nicht. Ich glaube nicht, dass die Aufgabe darin besteht, in Fleißarbeit irgendwo 400 Zeilen Code abzutippen. Hast Du auch verstanden was Du da geschrieben hast?

Eingerückt wird immer mit 4 Leerzeichen pro Ebene. Vermeide Code-Dopplungen wie z.B. in `title_screen_selections`. Benutze keine globalen Variablen, wie z.B. myplayer (wobei das my ein unsinniges Präfix ist, wie alle Variablen irgendwie Dir gehören). Konstanten sollten am Anfange des Programms definiert werden. `solved_places` sollte aus ZONEMAP initialisiert werden.

Code: Alles auswählen

solved_places = dict.fromkeys(ZONEMAP, False)
`sys.stdout.right` gibt es nicht. Zeile 351ff: `is` ist der falsche Vergleichsoperator, nimm `==`. Zeile 367ff, 380ff: für wiederholenden Code schreibt man Funktionen.
paratus
User
Beiträge: 3
Registriert: Montag 15. Januar 2018, 13:53

Durch die Anpassung der Einrückungen startet das Spiel jetzt zwar, aber die Befehle, um aus dem Startmenü weiter zu kommen werden nicht erkannt, obwohl sie doch im Code klar definiert sind.
Ich weiß, diese Fragen klingen vermutlich recht lächerlich für Fortgeschrittene, aber für mich ist das der erste richtige Code mit dem ich arbeite.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@paratus: unter welcher Bedingung ist `option.lower()` gleich dem String "Spiel starten"? Oder noch genauer, was macht `lower`?
paratus
User
Beiträge: 3
Registriert: Montag 15. Januar 2018, 13:53

@Sirius3

Also so wie ich das verstanden habe kann man in Python keine Strings verändern. Die sind starr. 'lower' macht eine Kopie des Strings und sortiert diese um. Ich denke mal um die Inhalte zu checken
Also ich meine das wenn man Spiel starten (also mit Großbuchstaben) schreiben will, im String aber nur kleine Buchstaben gegeben sind, kann man sie trotzdem groß ausgeben.
Aber soweit geht er ja gar nicht, er sagt immer direkt 'Bitte einen gültigen Befehl eingeben.', was er ja eigentlich nur ausgeben soll, wenn die Eingabe nicht mit den definierten Befehlen übereinstimmt.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
'lower' macht eine Kopie des Strings und sortiert diese um.
Sortiert wird da nichts - was auch? `lower()` macht, was der Name der Methode halt sagt - er liefert den String, auf den die Methode angewendet wird, komplett in Kleinbuchstaben zurück. Der String wird dabei in der Tat nicht verändert.

Gruß, noisefloor
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@paratus: statt 400 Zeilen am Stück zu schreiben und Dich dann zu wundern, dass es nicht tut, solltest Du das Programm Stück für Stück entwickeln, und immer prüfen, ob der Code auch das macht, was Du denkst, was er tut, indem Du zum Beispiel Zwischenergebnisse per `print` ausgibst. Was gibt z.B. `option.lower()`?
Antworten