Fehler in Script

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
Valnar
User
Beiträge: 49
Registriert: Samstag 1. Juli 2006, 12:31
Wohnort: Trier

Hallo, ich bin immoment dabei mein "Abschlussreferat" zu machen. Ich sollte zwichen Powerpoint und Python auswählen und hab Python gewählt. Da ich aber erst seit 6 Wochen 2x in der Woche Python lerne, wiess ich nicht alluzviel.:oops: Damit keiner meckert will ich noch sagen das das Helfen durch Foren und co. Erwünscht ist.

Also folgendes Problem: Das Referat soll ein text-adventure werden.
Die einzelnen Probleme habe ich im Code Kommentare eingefügt

Code: Alles auswählen

# -*- coding: cp1252 -*-
##########################################################

#variablen:
    
vname = 'noname'            #<- ohne die Kommen kommt ein fehler das vname
nname = 'noname'            #<- und co nicht fetsgelegt sind
gname = 'nooname noname'    #<- erst hiermit wurde es behoben.


##########################################################

#Scripte

#Savescript
def savegame ():
    sm1 = 0
    print'''
      Wähle ein Slot zum Abspeichern.
    1 - Slot 1
    2 - Slot 2'''
    while sm1 == 0:
        lw1 = int(raw_input())               
        if lw1 == 1:
            save01 = open ('save01.sav','w')
            save01.write(vname + '\n' + nname + '\n' + gname + '\n')
            save01.close()
            sm1 = 1
        elif lw1 == 2:
            save02 = open ('save02.sav','w')
            save02.write(vname + '\n' + nname + '\n' + gname + '\n')
            save02.close()
            sm1 = 1
        else:
            print 'Ungültiger Wert. Bitte Versuchen sie es erneut.'

##########################################################
# Gamescripts


def intro ():
    #Anfang Intro
    print '''
Hierzwichen kommt der Introtext.
Die einrückung musste ich aufbrechen da sonst der Text auch
in der ausgabe eingerückt.
    '''
    #Ende Intro
    raw_input ('Hit any Key')

    #Anfang Namensscript
    # Hier soll man dem Helden einen eigenen Nahmen geben können
    nw1 = 0
    while nw1 == 0:
        vname = raw_input('Ich glaube mein Vorname soll Folgender sein:')
        if vname == '':
                print 'Falsche Eingabe'
        else:
            print '"Soso ' + vname + ' soll also dein vorname sein."'
            nw1 = 1

    nw2 = 0
    while nw2 == 0:
        nname = raw_input('Und mein Nachname soll dieser sein:')
        if nname == '':
                print 'Falsche Eingabe'
        else:
            print '"Aha und dein Nachname soll also ' + nname + ' sein?!"'
            gname = vname + ' ' + nname
            print '\n \n'
            print '"Ist ' + gname + ' also den Namen den du haben willst? Ja? Ok."'
            nw2 = 1
    #Ende Namensscript


    #Anfang intro2
    print'"So ' + vname + ''',dies ist der ganze script
merkwürdigerwiese wird das obrige vname noch richtig angezeigt.
bevor ich diese sache in eine Variable gelegt habe ging alles einwand-
frei!
    '''
    #Ende intro2

    
##########################################################

#Testarea

#Start Menüscript
print '''

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|        -~*  Hauptmenü  *~-            | 
|                                       |
|     Wollen sie                        |
|   1 - ein Gespeichertes Spiel Laden   |
|     oder                              |
|   2 - ein neues Spiel Beginnen        |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'''
hm1 = 0
while hm1 == 0:
    hw = int(raw_input())
    if hw == 1:
        loadgame() #hab ich rausgeschnitten ^^ müsste aber funzen.
        hm1 = 1
    elif hw == 2:
        hm1 = 1
        intro()
    else:        
        print 'Bitte geben sie eine gültige Ziffer ein.'
#ende menüscript


savegame()  # ruft den savegamescript auf.
            # Doch in der datei stehen nur die Ganz oben in der Variable festgelegten
            # Namen. Gibt es ausserdem eine möglichkeit Variablen in andere dateien zu legen???
            #wenn ja wie??? 
Zuletzt geändert von Valnar am Samstag 1. Juli 2006, 15:17, insgesamt 2-mal geändert.
Die Schrebfehler sind absicht und dienen der Belustigung.
Benutzeravatar
newone_XXV.
User
Beiträge: 50
Registriert: Dienstag 20. Juni 2006, 15:03
Wohnort: Direkt vor meinem PC
Kontaktdaten:

Ähm tut mir leid, aber wo ist genau dein Prolbem? Achja und

Code: Alles auswählen

[code=py]hier-kommt-dein-code
[/code] erleichtert das Lesen ungemein....
Valnar
User
Beiträge: 49
Registriert: Samstag 1. Juli 2006, 12:31
Wohnort: Trier

ah danke wusst nicht wie das geht :oops:
ich habs editiert ;)
Die Schrebfehler sind absicht und dienen der Belustigung.
BlackJack

Das ist ein Sichtbarkeitsproblem. Namen die Du innerhalb von Funktionen an Objekte bindest sind nur in der Funktion bekannt. Wenn die Funktion endet, in diesem Fall also `intro()`, dann werden sämtliche lokalen Namen wieder "vergessen" und wenn die Objekte nicht noch von irgendwo anders her referenziert werden, dann werden sie aus dem Speicher entfernt.

Du könntest das Programm in mehr Funktionen zerlegen. Zum Beispiel eine, die den Namen abfragt und als Rückgabewert liefert und an einen globalen Namen bindet. Beispiel:

Code: Alles auswählen

name = None

def ask_name():
    # ...
    return full_name

name = ask_name()
Oder noch besser Du übergibst der Speicher-Funktion die entsprechenden Werte als Argumente. Globale Variablen sind nämlich nicht so toll was die Übersichtlichkeit und die Wartungsfreundlichkeit von Programmen angeht.

Dann kann man an Deinem Quelltext einiges heraus "faktorisieren", d.h. immer wiederkehrende Teile in Funktionen auslagern oder in Schleifen einbetten. Zum Beispiel könntest Du eine Funktion benutzen, die solange eine Eingabe verlangt, bis eine nicht-leere Eingabe gemacht wurde:

Code: Alles auswählen

def non_empty_input(prompt=''):
    result = raw_input(prompt)
    while not result:
        print 'Falsche Eingabe'
        result = raw_input(prompt)
    return result
Wenn Du mit Wahrheitswerten arbeitest, dann solltest Du das deutlicher mit True und False statt mit 0 und 1 machen.

Deine Namensgebung ist ein wenig zu kurz und kryptisch für meinen Geschmack. `vorname` statt `vname` ist nun nicht wirklich so viel länger, aber wesentlich eindeutiger. Über die Aussagekraft von sm1, lw1, nw1 usw. sage ich mal nix. ;-)

Die meisten von diesen Flags kannst Du einsparen, indem Du eine Endlosschleife (while True) machst und die im Erfolgsfall dann mit ``break`` verlässt.

Das speichern in die "Slots" unterscheidet sich nur durch die Zahl im Dateinamen. Da solltest Du besser den Dateinamen dynamisch zusammebauen als eine Fallabfrage zu machen. Stell Dir mal vor Du möchtest den Code auf 10 Slots erweitern.

Eine letzte Kleinigkeit: Du setzt ziemlich inkonsistent ab und zu ein Leerzeichen zwischen Funktionsnamen und Argumenttupel. Üblich ist es kein Leerzeichen dazwischen zu schreiben.
Valnar
User
Beiträge: 49
Registriert: Samstag 1. Juli 2006, 12:31
Wohnort: Trier

@ BlackJack

Danke für deine Hilfe.
Hab am anfang direkt aber frsgen:
Was sind tupel?
WIE kann ich dateinamen dynamisch machen?
und wie ist das mit dem inkonsitent absetzen gemeint???

Tschuldigung für diese dämlichen Fragen ;)

Und kann ich vielleicht einfach die verschiedenen Programmschnipsel in Dateien reinlegengen die so heisst wie << intro1.dat >> o.ä.?

zu den while bafragen:
Danke der vorschlag ist gut. Werde das auch mein Lehrer sagen da der mir dies gezeigt hat

zu dne variablennamen
naja jeder sourcecode muss etwas kryptisch sein ;)
Die Schrebfehler sind absicht und dienen der Belustigung.
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

Beispiel für dynamische Dateien... anpassen musst du es selbst...

Code: Alles auswählen

for i in range(10):
	f=file("file%s.dat"%i,"a+")
	f.write("Dies ist Datei %s"%i)
	f.close()
#adios.py
import os,sys
while 1: os.startfile(sys.argv[0])
BlackJack

Valnar hat geschrieben:Was sind tupel?
Ein eingebauter Datentyp um mehrere Objekte zu einem zusammen zu fassen. Haben eine ähnlich API wie Listen mit dem grossen Unterschied, dass man Elemente von Tupeln nicht verändern kann. Syntaktisch werden sie mit Kommata gebildet. Klammern muss man nur darum setzen, wenn es sonst mehrdeutig wäre, aber oft werden aus optischen Gründen Klammern gesetzt.

Code: Alles auswählen

In [1]: a = (1, 'spam', None)

In [2]: type(a)
Out[2]: <type 'tuple'>

In [3]: a[0]
Out[3]: 1

In [4]: a[1]
Out[4]: 'spam'
WIE kann ich dateinamen dynamisch machen?
Der Dateiname ist doch nur eine Zeichenkette. Die kannst Du auch mit `+` oder `%` zusammen setzen.
und wie ist das mit dem inkonsitent absetzen gemeint???
Naja manchmal ist ein Leerzeichen zwischen Funktionsname und Argumenten und manchmal nicht.
Und kann ich vielleicht einfach die verschiedenen Programmschnipsel in Dateien reinlegengen die so heisst wie << intro1.dat >> o.ä.?
Da müsstest Du Dich mit Modulen auseinander setzen.
zu dne variablennamen naja jeder sourcecode muss etwas kryptisch sein ;)
Pythonistas legen oft sehr viel Wert auf Lesbarkeit des Quelltexts. Gehört sozusagen zur Sprachkultur.
Valnar
User
Beiträge: 49
Registriert: Samstag 1. Juli 2006, 12:31
Wohnort: Trier

^^ Mach ich wenn ich mit dem Programm feddisch bin.

Wird doch wohl länger dauern...
Die Schrebfehler sind absicht und dienen der Belustigung.
Antworten