[Spiel] CityXXL - Hilfe bei Level System

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.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Donnerstag 1. März 2012, 23:36

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.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
BlackJack

Donnerstag 1. März 2012, 23:46

@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.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Donnerstag 1. März 2012, 23:51

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.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Freitag 2. März 2012, 00:06

``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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7477
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 2. März 2012, 13:24

Man sollte mal eine wiki-Seite über das Thema "Menüs via Dispatching" erstellen - so oft, wie das hier benötigt wird...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Freitag 2. März 2012, 20:25

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.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Freitag 2. März 2012, 20:54

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.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
mutetella
User
Beiträge: 1690
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Freitag 2. März 2012, 21:14

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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Freitag 2. März 2012, 21:26

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!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
mutetella
User
Beiträge: 1690
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Freitag 2. März 2012, 22:56

jtschoch hat geschrieben:besser?
Nö.
jtschoch hat geschrieben:Exit (7) Funktioniert nicht mehr, (...) Terminal Funktioniert auch nicht, ... jetzt Funktionierts übers Terminal!
Wie jetzt?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten