[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.
lunar

@SolitaryMan: Meerschweinchen auf Speed ;)
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Ihr könnt ja jetzt ein EXTRA Thema erstellen, wo ihr über mich Diskutieren könnt (und der Forum).
Ich werde es in Zukunft versuchen bessere Beiträge zu Schreiben.
Ich bin ja noch nicht der Python-Profi und es müssen doch noch nicht alle Profies sein wie ihr, oder?
Ihr habt auch mal angefangen zu lernen und Beiträge geschrieben, und das Forum ist da Probleme zu Posten und nicht nur "Perfeckte Code". Ich lerne halt noch Python ich hatte mal ein Jahr aufgehöhrt und dann "jetzt wieder über ein Jahr wieder Code geschrieben". Ich habe mich erst mit den Thema Objektierte Programmiereung beschäftigt, und ihr könntet mir ja mal dein einen oder anderen Tip geben! Ich werde auch eure Tips, wenn möglich umsetzen. Ich bin auch erst 14 Jahre alt, ihr seit doch um die 20, oder?

-------------------------------------------------------------------
Code in Tags setzen
Das mache ich immer!
-------------------------------------------------------------------

Kuckt euch doch mal den alten Code von CityXXL an, dann bemerkt ihr schon das ich einiges verbessert habe, nur ich komme
bei diesenFunktionen nicht so Richtig klar, weil ich sowas noch nicht gemacht habe, und gerade mit Schleifen.
Mit Schleifen habe ich mich zwar beschäftigt, aber ich sehe irgendwann in große Funktionen nicht mehr durch.


-------------------------------------------------------------------

In meinen Forum sind ausserdem schon 3 Mitglieder!
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
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Vielleicht wäre es ja die bessere Lösung für dich wenn du Spiele erstmal in Ruhe lässt und stattdessen lernst kleinere Programme ordentlich und elegant aufzubauen. Anregungen dürftest du mehr als genug finden. Solltest du darin richtig gut werden, kannst du dich später noch an OOP und größeres wagen.
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

jtschoch hat geschrieben:ich komme
bei diesenFunktionen nicht so Richtig klar, weil ich sowas noch nicht gemacht habe, und gerade mit Schleifen.
Mit Schleifen habe ich mich zwar beschäftigt, aber ich sehe irgendwann in große Funktionen nicht mehr durch.
Das solltest du noch üben. Das sind ganz wichtige Grundlagen. Dann macht man lieber viele kleinere Funktionen. Dadurch bleibt es auch übersichtlicher, wie du ja schon gemerkt hast.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Wo denn zum Beispiel könnte ich eine Kleinere Funktion machen?
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
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: 3555
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: 3555
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: 6740
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
Antworten