[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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

jtschoch hat geschrieben:Ich werde auch eure Tips, wenn möglich umsetzen. Ich bin auch erst 14 Jahre alt, ihr seit doch um die 20, oder?
Ich war auch mal 14...

Versteh uns nicht falsch, wir wollen dir helfen und ich denke jeder hier würde dir so ziemlich jede Frage beantworten, falls wir merken du bemühst dich und setzt unsere Vorschläge um.


Ein guter Anfang bei deinem Spiel wäre das Trennen von Logik (wer hat wie viel und befindet sich wo) und UI (User Interface, Ein-/Ausgabe).
the more they change the more they stay the same
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

jtschoch hat geschrieben:Wo denn zum Beispiel könnte ich eine Kleinere Funktion machen?
CityXXL.Auswahl>(): Welchen Sinn soll die Methode machen?
CityXXL.Programm(): Lässt sich durch den Einsatz eines dictionary auf wenige Zeilen reduzieren.
CityXXL.Spielbank.Einzahlung() / Auszahlung(): Beide Funktionen machen doch grundsätzlich dasselbe. Warum also doppelt?
Das except sollte klar definiert sein. Das validieren der Eingabe kann zudem in eine eigene Funktion ausgelagert und somit immer wieder verwendet werden.
Diese elend langen print-Anweisungen gehören auch nicht in die Methoden. Das gehört getrennt, wie Dav1d ja schon sagte...

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:

Ja an paar solchen Dingen habe ich schon gedacht, aber manches ist mir nicht aufgefallen.
Danke für die hinweise, ich werde Morgen versuchen sie umzusetzen, eine Frage dazu noch:
mutetella hat geschrieben:CityXXL.Programm(): Lässt sich durch den Einsatz eines dictionary auf wenige Zeilen reduzieren.
Wie soll ich aber die Funktionen aufrufen?

So:

Code: Alles auswählen

programm = {1:self.Status(), 2:self.Bank(),...}
Achso bei den Printausgaben habe ich mir auch schon was Überlegt, das ich die definiere, so:

Code: Alles auswählen

def print_Texte(wert, wert1,...):
    print "Hallo %s" % wert, wert1,...
[EDIT]: Da kann man ja gleich print verwenden!

Ne, irgendwie hatte ich eine andere Idee mir fällt die nicht mehr ein, oben die wars nicht würde ich auch nicht anwenden!

Und bei doppelten funktionen werde ich eine machen, wie zum Beispiel meine Auswahl bei Einkaufen, das selbe habe ich auch bei Arbeiten in der Art, da kaann ich ja eine definieren und das die entsprechenden Werte geben und mit return zurückgeben lassen.
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
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

jtschoch hat geschrieben:Ich bin auch erst 14 Jahre alt, ihr seit doch um die 20, oder?
Ich erinnere mich noch gut daran, was mein Bruder im Alter von 14 Jahren auf dem C=64 programmiert hat. Auf die Frage wie er denn vorgegangen sei, kamen dann so Antworten wie: "Also erst mal habe ich das Betriebssystem abgeschaltet ...". Das interessante daran: er hatte recht! Heute kümmert er sich unter anderem um das KDE-Soundsystem.

Manche haben halt die Denkweise eines Software-Entwicklers, bei anderen hingegen mag es so gar nicht recht funktionieren.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Ich kann oben aus dein Text keinen Sinn erkennen, wie ihr ihn bei mir auch nicht erkennen könnt!(Verstehen)
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
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

jtschoch hat geschrieben:Ich kann oben aus dein Text keinen Sinn erkennen, wie ihr ihn bei mir auch nicht erkennen könnt!(Verstehen)
Dann reduziere ich die Aussage mal auf: Mit 14 Jahren kann man durchaus in der Lage sein nicht-triviale Software zu schreiben. Das erfordert aber intensive Beschäftigung mit dem Thema und die Bereitschaft, wirklich lernen zu wollen.

Um Winston Churchill zu paraphrasieren: "I have nothing to offer but blood, toil, tears, and cold pizza".
Benutzeravatar
snafu
User
Beiträge: 6854
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@jtschoch: Kennst du das Programmierforum von ubuntuusers.de? Dort haben die Leute meistens noch mehr Geduld als hier. Frag doch da mal nach. Ich hab ehrlich gesagt auch keine Lust, deine Fragen zu beantworten, aber vielleicht findet sich ja dort jemand... (ist ernstgemeint)
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Auf meine Frage die 5 beitraege weiter oben ist ht noch niemand beantwortet.

@snaufu: Kenn ich
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: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

jtschoch hat geschrieben:Wie soll ich aber die Funktionen aufrufen?
Überleg' doch mal, was den keys 1, 2 etc. in Deinem dictionary-Beispiel zugewiesen wird. Du willst ja nicht die Rückgabewerte der Funktionen dort stehen haben, sondern die Funktionen selbst.
jtschoch hat geschrieben:Da kann man ja gleich print verwenden!
Ja natürlich, solange Du auf der Konsolenebene bleibst (also kein 'curses', 'urwid' oder ähnliches verwendest), wird Deine UI aus jeder Menge print-Anweisungen bestehen. Der Punkt ist ja nicht, dass Du diese Anweisungen an sich reduzieren sollst, sondern dass diese Anweisungen, die allein der Ausgabe dienen, nichts in Funktionen/Methoden verloren haben, die für die Programmlogik zuständig sind.

Ich wurde hier auch immer und immer wieder aufgefordert, Logik und Ausgabe zu trennen und erst einmal die Funktionen/Klassen zu entwerfen, die später dann ihre Informationen an die Ausgabe weitergeben oder von dort abgeholt werden. Es dauerte ein Weilchen bis ich um diese 'Kurve herumdenken' konnte, weil in meiner Vorstellung der Ablauf eines Programmes zwangsläufig mit einer (Bedien-)oberfläche verknüpft sein musste. Beschränke Dich also erstmal auf das eigentliche, nämlich Funktionen wie Deine 'Spielbank.einzahlung()' und diese Dinge. Natürlich kannst Du (vorerst) in diesen Funktionen ein oder zwei print-Anweisungen platzieren, um das Ergebnis kontrollieren zu können. Aber die finale in Form gebrachte Ausgabe machst Du erst, wenn diese Funktionen/Klassen die Ergebnisse liefern, die Du erwartest.

Irgendwie kann ich es auch verstehen, dass Du das eine oder andere, das Dir hier geraten wird, nicht umsetzen möchtest oder kannst, weil Du Dich dafür mit Dingen auseinandersetzen musst, die auf den ersten Blick so kompliziert und riesig erscheinen, dass man versucht ist zu glauben, mit seinem eigenen kleinen Werkzeugkasten schneller ans Ziel zu kommen. Gerade am Anfang bekam und auch jetzt noch bekomme ich hier im Forum Antworten und Tipps, für dessen Verständnis und Umsetzung ich oft viele Tage benötige, weil ich oft noch nicht einmal die Begrifflichkeiten verstehe. Und immer (ich meine wirklich 'immer'!) wenn ich in meiner Anfängerarroganz glaubte, ich wüsste einen einfacheren Weg, war das nur ein umständlicher, schlecht oder überhaupt nicht funktionierender Umweg.

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

@jtschoch: Funktionen, Methoden, oder ganz allgemein aufrufbare Objekte, ruft man auf in dem man einen Ausdruck hat, der zu dem Objekt ausgewertet wird, welches man aufrufen möchte und dieses dann mit Hilfe von Klammern mit einer (möglicherweise leeren) Argumentliste rechts daneben *aufruft*.

Der Ausdruck links von der Argumentliste ist im einfachsten Fall ein Name (``list()``), in vielen Fällen einer der den Punkt-Operator Attributzugriffe enthält (``os.listdir('.')``), kann aber auch jeder beliebige Ausdruck sein, dessen Ergebnis ein aufrufbares Objekt ist (``random.choice([operator.add, operator.sub])(42, 23)``).
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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

@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:

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
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

``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: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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:

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:

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: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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:

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: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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