Seite 2 von 2

Re: [Spiel] CityXXL - Hilfe bei Level System

Verfasst: Donnerstag 1. März 2012, 23:36
von jtschoch
Verstehe ich noch nicht ganz.
In meinen Test-Skript hat es nicht Funktioniert!

Code: Alles auswählen

#!/usr/bin/python

def test_1():
    print "1"

def test_2():
    print "2"

eingabe = raw_input(">")
liste = {1:``test_1()``,2:``test_2()``}
liste[int(eingabe)]
Wenn ich 1 eingebe ruft er beide auf, also Ausgabe 1 und 2.

Re: [Spiel] CityXXL - Hilfe bei Level System

Verfasst: Donnerstag 1. März 2012, 23:46
von BlackJack
@jtschoch: Python macht hier genau das was Du im Quelltext sagst. Du erstellst ein Wörterbuch, das Zahlen auf die *Rückgabewerte* von den Funktionen abbildet, die Du *aufrufst*. Genau das hatte ich doch beschrieben: Ein Aufruf ist ein Ausdruck der zu einem aufrufbaren Objekt ausgewertet wird mit Klammern rechts daneben, die dann diesen Aufruf ausführen. Du willst aber nicht den Rückgabewert der Funktion im Wörterbuch sondern die Funktion. Und aufrufen willst Du die erst *nachdem* der Benutzer etwas eingegeben hat und auf Basis dieser Eingabe die entsprechende Funktion aus dem Wörterbuch geholt wurde. Dann musst Du das aber auch *so* hinschreiben.

Ein Wörterbuch an den Namen `liste` zu binden ist übrigens ungünstig.

Re: [Spiel] CityXXL - Hilfe bei Level System

Verfasst: Donnerstag 1. März 2012, 23:51
von jtschoch
Das verstehe ich irgendwie trotzdem nicht ganz richtig,
könntest du vielleicht ein kleines Beispiel machen? Dann versehe ich das besser.
Mir fällt es schwer das was du Beschreibst herauslesen. Das mit der Liste war ja nur zum Test, das teil habe ich noch nicht in den Richtigen Code eingebaut.
Ich habe auch versucht die

Code: Alles auswählen

 (``funktion()``)
einzubauen, aber es ging nicht. Ich kapiere das nicht wie ich den Funktionsname geben soll.

Re: [Spiel] CityXXL - Hilfe bei Level System

Verfasst: Freitag 2. März 2012, 00:06
von cofi
``function`` ist nichts anderes als eine Syntax um anzuzeigen, dass es sich hier um Code handeln soll, wie es zum Beispiel in ReST der Fall ist.

Dein Beispiel korrigiert:

Code: Alles auswählen

def test_1():
    print "1"

def test_2():
    print "2"

eingabe = raw_input(">")
menue = {1: test_1 , 2:test_2}
menue[int(eingabe)]()
Du ordnest hier Zahlen Funktionsobjekten zu, Funktionsobjekte koennen sich hinter allem verstecken (BlackJack hat das ja beschrieben), aber egal wie man darauf zugreift: mit ``(hier, kommen, die, argumente, hin)`` nach dem Funktionsobjekt ruft man sie auf.

Wenn du ``menue[int(eingabe)]`` ausfuehrst bekommst du das Funktionsobjekt das zu der Zahl gehoert, mit den Klammern dahinter rufst du sie auf.

P.S. Die Backtick (`) Syntax (z.B. `u'ä'`) ist aequivalent zu repr (also ``repr(u'ä')``), aber deprecated, d.h. man soll es nicht benutzen.

Re: [Spiel] CityXXL - Hilfe bei Level System

Verfasst: Freitag 2. März 2012, 13:24
von Hyperion
Man sollte mal eine wiki-Seite über das Thema "Menüs via Dispatching" erstellen - so oft, wie das hier benötigt wird...

Re: [Spiel] CityXXL - Hilfe bei Level System

Verfasst: Freitag 2. März 2012, 20:25
von jtschoch
Vielen Dank, jetzt weiß ich es wie das geht.
Hyperion hat geschrieben:Man sollte mal eine wiki-Seite über das Thema "Menüs via Dispatching" erstellen - so oft, wie das hier benötigt wird...
Kannst du doch schreiben, dies wäre wirklich nützlich.

Re: [Spiel] CityXXL - Hilfe bei Level System

Verfasst: Freitag 2. März 2012, 20:54
von jtschoch
Ist das so schon besser?

Code: Alles auswählen

    def Programm(self):
        funktionen = {1:self.Status, 2:self.SpielBank, 3:self.Supermarkt, 4:self.Arbeiten, 5:self.Schlafen,\
                 6:self.Sichern, 7:self.Exit}
        while self.Gesundheit['essen'] > 0 and self.Gesundheit['trinken'] > 0:
            print "\n".join(["1 = Status", "2 = Bank", "3 = Einkaufen", "4 = Arbeiten", "5 = Schlafen", "6 = Save/Load", \
            "7 = Exit"])
            eingabe=raw_input("> ")
            try:
                funktionen[int(eingabe)]()
            except:
                print "Du hast keine Zahl eingegeben!"
                
    def eingabe(self, text, typ = "int"):
        if typ == "int":
            frage = int(raw_input(text))
        else: 
            frage = raw_input(text)
        return frage
    
    def SpielBank(self):
        ##################################~Spielbank~########################
        def Konto(auswahl):
            ######################~Konto~#######################
            try:
                Bank = {1:["bargeld", "eingezahlt"], 2:["bankkonto", "ausgezahlt"]}
                summe = float(raw_input("Wie viel? "))

                if summe > self.Geld['bargeld']:
                    print "So viel Geld hast du noch nicht!.\n"
                else:
                    if Bank[auswahl][1] == "einzahlung":
                        self.Geld['bankkonto'] += summe
                        self.Geld['bargeld'] -= summe
                    else:
                        self.Geld["bankkonto"] -= summe
                        self.Geld["bargeld"] += summe

                    print "Bargeld: %s" % self.Geld['bargeld']
                    print "Konto: %s\n" % self.Geld['bankkonto']
                    print "Ihr Geld wurde {0}.\n".format(Bank[auswahl][1].title())
                    raw_input()

            except:
                print "Du hast keine Zahl eingegeben!\n"

        print "=============SpielBank=============\n"
        print "Dein Kontostand beträgt: %s" % self.Geld['bankkonto']
        print "Dein Bargeld: %s" % self.Geld['bargeld']
        print "Zinsen: %s" % self.Geld['zinsen']
        
        auswahl = self.eingabe(text = "Einzahlen (1) oder Auszahlen (2)?\n0 Abbrechen\n")
        if auswahl > 0:
            if auswahl < 3:
                Konto(auswahl)          
        else:
            print "Unbekannte Option!\n"
        
Ich muss das mir nur noch mit den Ausgaben überlegen.

Re: [Spiel] CityXXL - Hilfe bei Level System

Verfasst: Freitag 2. März 2012, 21:14
von mutetella
1. Dein try...except... ist nach wie vor Murks. Geb' doch mal eine 8 ein... was dann?
2. Du definierst eine Funktion 'eingabe()' zur Eingabe von Werten, an sich keine schlechte Idee, aber: Bevor Du diese Funktion benutzt, bindest Du an den Namen dieser Funktion eine andere Funktion. Wenn Du also 'eingabe()' aufrufst, rufst Du nicht Deine extra dafür erstellte Funktion auf...
3. Du möchtest, dass Deine 'eingabe()' zwischen integer und anderen typen (welchen eigentlich? unterscheiden soll. Das gehört dann aber auch 'vor Ort' validiert...

Weiter habe ich jetzt noch nicht geschaut...

mutetella

Re: [Spiel] CityXXL - Hilfe bei Level System

Verfasst: Freitag 2. März 2012, 21:26
von jtschoch
OK, Ich schaue noch mal nach.
[Edit]:

besser?

Code: Alles auswählen

    def Programm(self):
        
        funktionen = {1:self.Status, 2:self.SpielBank, 3:self.Supermarkt, 4:self.Arbeiten, 5:self.Schlafen, 6:self.Sichern, 7:self.Exit}
        
        while self.Gesundheit['essen'] > 0 and self.Gesundheit['trinken'] > 0:
            
            print "\n".join(["1 = Status", "2 = Bank", "3 = Einkaufen", "4 = Arbeiten", "5 = Schlafen", "6 = Save/Load", "7 = Exit"])
            auswahl = self.eingabe("> ")
            try:
                funktionen[int(auswahl)]()
            except:
                print "Du hast einen Unbekannten Wert eingegeben!"
                
    def eingabe(self, text, typ = "int"):
        if typ == "int":
            frage = int(raw_input(text))
        else: 
            frage = raw_input(text)
        
        return frage
    
Achso:
Exit (7) Funktioniert nicht mehr, bekomme Folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/jtschoch/.eclipse/org.eclipse.platform_3.7.0_155965261/plugins/org.python.pydev.debug_2.3.0.2011121518/pysrc/pydev_runfiles.py", line 307, in __get_module_from_str
    mod = __import__(modname)
  File "/media/jonas/JT_proj/python/Spiel/CityXXL.py", line 372, in <module>
    s = CityXXL()
  File "/media/jonas/JT_proj/python/Spiel/CityXXL.py", line 42, in __init__
    self.Programm()
  File "/media/jonas/JT_proj/python/Spiel/CityXXL.py", line 53, in Programm
    funktionen[int(auswahl)]()
  File "/media/jonas/JT_proj/python/Spiel/CityXXL.py", line 370, in Exit
    sys.exit(1)
SystemExit: 1
ERROR: Module: CityXXL could not be imported (file: /media/jonas/JT_proj/python/Spiel/CityXXL.py).
done.
Führe es Über Eclipse aus Terminal Funktioniert auch nicht, ... jetzt Funktionierts übers Terminal!

Re: [Spiel] CityXXL - Hilfe bei Level System

Verfasst: Freitag 2. März 2012, 22:56
von mutetella
jtschoch hat geschrieben:besser?
Nö.
jtschoch hat geschrieben:Exit (7) Funktioniert nicht mehr, (...) Terminal Funktioniert auch nicht, ... jetzt Funktionierts übers Terminal!
Wie jetzt?

mutetella