• Hallo liebe Leute. Ich möchte hier mein Manager-Game vorstellen, das vor einigen Jahren schon als Browsergame ziemlich erfolgreich war.


    Gegenstand des Spieles ist eine Pflanze mit dem Namen Cannabis Indica, die ihr kultivieren und wie ein Tamagotchi hegen und pflegen müsst. Wenn ihr das gewissenhaft tut, wächst sie jeden Tag um einige Pixel und ihr könnt sie nach einigen Wochen ernten. Dann könnt ihr einen Preis festlegen und das gute Kraut verkaufen. Da es sich um ein online-Game handelt, werden andere Spieler das gleiche tun und es ensteht ein Markt und ein Wettstreit um Angebot und Nachfrage.
    Hat man sein Ware vertickt, kann man in eine bessere Ausstattung wie Quecksilberdampflampen oder größere Gewächshäuser investieren, um sein Geschäft zu expandieren.


    Zur Technik:


    Serverseitig kommen wie beim Browsergame PHP-Scripte und eine MySQL-Datenbank zum Einsatz. Viele Scripte werd ich auch mit Äderungen übernehmen können, die Grafiken alleine wegen des Wiedererkennungswertes.
    Auf dem Handy, soll SQL-Lite als Datenbank laufen, um die Objekte zu verwalten, die sich nicht nach außen auswirken. So kann der Spieler auch ohne Internetverbindung seine Pflanzen anschauen, pflegen oder seinen Fuhrpark verwalten.


    Mein ehrgeiziges Ziel ist es, eine sehr hohe Spieltiefe und langzeitmotivation zu erzeugen. Es soll kein Spiel werden vor dem man jeden Tag Stunden verbringt, sondern dem man sich jeden Tag nur einige Minuten widmen muss aber über viele Monate hinweg spannend bleibt.

  • Hab es endlich geschafft die SQLite Datenbank zum Laufen zu kriegen. Das SQLite Tutorial hier im Forum hat mir echt nicht weiter geholfen, da die dortige Vorgehensweise wohl nur innerhalb eines Activity funktioniert und nicht in einer einfachen Klasse. Außerdem verschweigt es die Existenz des SQLiteOpenHelper, welcher die Handhabung der Datenbank auch hinsichtlich der Versionsverwaltung erheblich vereinfacht.


    Da ich nun Android-GUI, Java und Datenbank halbwegs im Griff habe, kann es nun mit der Entwicklung so richtig losgehen, oder mich zumindest mit Problemen auf fortgeschrittenem Level befassen. :D


    Da wäre zum Beispiel das Problem der Objektrelationalen Abbildung meiner Objekte (Grundstücke, Gewächshäuser, Pflanzen usw.) in der Datenbank (JPA gibts unter Adroid nicht).
    Für die oben genannten Objekte exisitiert jeweils eine eigene Tabelle mit Feldern für die Eigenschaften des jeweiligen Objektes. Unter PHP hatte ich es anfangs so gehandhabt, dass ich beim Erstellen eines Objektes die ID übergeben habe und im Konstruktor der entsprechende Datensatz gelesen und die Eigenschaften des Objektes gesetzt wurden.


    Um überflüssige Abfragen beim Erstellen ganzer Listen von Objekten zu sparen, hab ich das Füllen der Eigenschaften in eine loadData() Methode verlagert, die erst in den get-Methoden ausgeführt wird.


    Für den Fall, dass eine Abfrage von außen x Datensätze der Tabelle Spieler liefert, hab ich beim Durchlaufen der Ergebnisse natürlich nicht nur die ID an die Objekte übergeben, sondern den kompletten Datensatz. Dadurch konnten sämtliche Eigenschaften der Objekte mit einer einzigen Abfrage gefüllt werden.


    Dieses Verfahren hab ich bei vielen Klassen angewand und so ähnlich will ich es auch in Java machen. Ich frage mich jetzt nur, ob ich das nicht etwas eleganter implementieren kann, indem ich die dafür nötigen Strukturen nicht in jede Klasse schreiben muss sondern irgendwie vereinheitlichen kann.


    Ich weiß, dass mir die Vererbung dabei irgendwie helfen kann, aber dieser Mechanismus hat sich bei mir noch nicht verinnerlicht.


    Kann mir da irgendwer nen Denkanstoß geben? :)

  • Ordentliche Planung von Struktur, Objektmodell und Abstraktion sind ja ganz toll, aber ich will endlich anfangen zu Programmieren...!!! ;(


    Das kann ich auch verstehen, aber gerade bei einem solchen Projekt lohnt es sich sicher, wenn du dich noch zwei bis drei Tage OOP-Literatur widmest. Dann kannst du dein Spiel objektorientiert aufbauen, was sich später sicher als Vorteil herausstellt. So kannst du beispielsweise später ganz einfach neue Eigenschaften einführen und du hast sofort überall Zugriff darauf. Du musst auch nicht alles sofort kapieren, aber wenn du noch einmal ein wenig darüber liest, kommst du vielleicht auf Ideen, die dir danach die Programmierung enorm erleichtern werden.


    mfg Jon

  • Ich bin mit der OOP ja durchaus vertraut und auch das Prinzip der Vererbung ist mir bekannt, hatte nur gehofft, dass jemand schonmal das gleiche Problem hatte und schon ne Lösung parat hat die ich gleich auf mein Projekt übertragen kann. Aber das Buch ist trotzdem sehr interessant... :)

  • Naja, es ist halt ein Managerspiel, wo nichts wirklich in Echtzeit läuft (außer das Pflanzenwachstum), sondern alle Aktionen des Spielers (Plfanze gießen, Auto kaufen) in der Datenbank gespeichert werden und sich auf spätere Aktionen auswirken (Auto wird angezeigt wenn Grundstück aufgerufen wird).


    Die technische Vorgehensweise hatte ich weiter oben eigentlich schon recht ausführlich beschrieben, oder willst du mehr über den Spielinhalt erfahren?


    [Blockierte Grafik: http://www.buschmann-edv.de/tausch/gm_android.png]

  • Naja, es ist halt ein Managerspiel, wo nichts wirklich in Echtzeit läuft (außer das Pflanzenwachstum), sondern alle Aktionen des Spielers (Plfanze gießen, Auto kaufen) in der Datenbank gespeichert werden und sich auf spätere Aktionen auswirken (Auto wird angezeigt wenn Grundstück aufgerufen wird).


    Die technische Vorgehensweise hatte ich weiter oben eigentlich schon recht ausführlich beschrieben, oder willst du mehr über den Spielinhalt erfahren?


    Mich interessiert, wie das Spiel ablaufen soll, was es für Module gibt, was die Story ist, etc. Über die Technik würde ich ja gerne mit dir diskutieren, also wie du was am besten angehst (quasi die Entwicklung eines Konzepts).


    mfg Jon

  • Aaaaalso, du startest mit einem ganz kleinen Gewächshäuschen und 4 Samen, sowie 500€.


    Die Samen sähst du in deinem Gewächhaus aus, und giesst. (Jede Connabis-Sorte hat andere Optimalwerte für Wasser und Düngermenge, Lichtbedarf usw. sowie unterschiedliche Toleranzen für davon abweichende Werte)


    Nach einigen (ralen Tagen) siehst du auf deinem Handydisplay einen 2 Pixel großen Sämling.


    Irgendwann fängst du an zu düngen (wann der optimale zeitpunkt ist, muss jeder durch ausprobieren selber herausfinden und ist uU. von der Sorte abhängig)


    Das Startkapital reicht evtl. um eine Lampe zu kaufen, die jeweils einer Pflanze zugewiesen wird. Dadurch kann man abschätzen, wie sehr sich Licht auf das Wachstum auswirkt.


    Dann pflegt man seine Pflanzen auf diese Weise einige (reale) Tage bis Wochen, bis sie erntereif sind. Wann der optimale Zeitpunkt dazu ist, muss der Spieler acuh selbst rausfinden.


    Um die Ernte zu verkaufen, muss der Spieler online gehen, alle Verkaufsoptionen und Dinge die den offenen Markt betreffen, werden online in einer MySQL-Datenbank gespeichert.


    Wenn wieder Geld rein kommt, werden neue Samen gekauft und evtl. ein größeres Gewächshaus, potentere Lampen usw.


    Dazu kommt noch ein Skill-System wie aus Rollenspielen bekannt, mit eigenschaften wie Grüner Daumen, Geschäftssinn, Charisma, Technisches Geschick usw.


    Ideen hab ich da noch tausende um das Spiel umfangreicher und spannender zu machen...^^


    z.B. Missionen wie "bringe x Menge von Sorte y innerhalb von blah Stunden an Ort z", oder "Triff dich mit Spieler xy samt Auto bei z " - dann wird ein Trigger ausgelöst und es kann eine weitere Mission folgen

  • OK, hab ich jetzt verstanden, danke :)


    Ich würd das mal testweise sehr klein machen und dort verschiedene Dinge austesten:


    GEWÄCHSHAUS:
    Größe: Breite, Höhe (1x1 = 1Samen hat platz; 3x2 = 6 Samen haben Platz)
    Plätze: Verweis auf eine Pflanze oder ins Nirgendwo (NULL).


    PFLANZE:
    Größe: Wie groß ist die Pflanze schon...
    Zubehör: Verweise auf ein Zubehör (bspw. eine Lampe)


    Auto und Mission und etc. würde ich erstmal weglassen und erst nach einer erfolgreichen Implementierung dieser Version implementieren.


    wfg Jon

  • Jo, am Anfang soll es eh nur ein offline Tamagotchi werden. Aber die Objektstruktur ist in meinem Kopf schon fast komplett. Auch Autos waren damals im Browsergame schon implementiert und das hat auch alles soweit funktioniert. Lediglich bei den Missionen ist es gescheitert, da das ganze Programm ein hoffnungsloser Spaghetticode war und jede Erweiterung Änderungen an x Stellen notwendig machte.


    Ich werde heute Abend erstmal die Klassen für Grundstück, Gewächshaus und Pflanze erstellen. Die Klassen für Datenbank und Spieler sind bereits lauffähig, sodass ich im Laufe der Woche meine erste Pflanze wachsen sehen werde... :)


    Das mit Länge und Breite (Höhe ist wohl irrelevant) des Gewächshauses ist ne gute Idee, hatte früher einfach nur qm als Eigenschaft für die Größe. Mit den Angaben kann ich dann die Gewächshäuser evtl. soger dynamisch Zeichnen auf einer Map des Grundstückes. Aber das kommt nätürlich erst später...

  • Lediglich bei den Missionen ist es gescheitert, da das ganze Programm ein hoffnungsloser Spaghetticode war und jede Erweiterung Änderungen an x Stellen notwendig machte.


    Eben. Deshalb OOP. Dann kannst du ganz einfach auch verschiedene Pflanzen erstellen. Basistyp: Pflanze; Kinder: Gänseblümchen, Sonnenblume, etc. Die Kinder erben vom Basistyp alle Grundlegenden Eigenschaften und Methoden. Das erleichert die Erweiterung enorm und auch die Lesbarkeit des Codes ist hoch.


    mfg Jon

  • Ja, Vererbung auf diesem Level beherrsche ich. Im konkreten Fall ging es aber um die Objektrelationale Abbildung, also das Speichern und Verwalten von Objektzuständen in der Datenbank. Wie ich im zweiten Eintrag beschrieben habe, hatte ich mir unter PHP schon ein ziemlich gutes System überlegt um Objekte mit den gespeicherten Eigenschaften aus der Datenbank zu laden. Dazu hatte ich in jeder Klasse, einige Methoden die immer mit nach dem selben Schema arbeiteten.


    Meine Überlegung war es nun in Java mit Hilfe der Vererbung eine Lösung zu finden, verschiedenste Objekte - also auch welche die nichts weiter gemeinsam haben, als dass sie durch einen Datensatz in einer beliebigen Tabelle mit Eigenschaften gefüllt werden - per extends mit diesen immer nach den gleichen Schema arbeitenden Methoden auszustatten. (boa, das war doch mal ein Satz)


    In der Praxis haben die Verschiedenen Klassen natürlich ganz andere Variablen, werden in verschiedenen Tabellen gespeichert und haben eine andere Feldanzahl und Bezeichnungen. Also alles in allem eine Problemstellung die auch für jemanden der OOP bereits verstanden hat nicht ganz einfach ist....


    (Nachtrag : Das genannte Browsergame hatte ich 2004 programmiert und meinte Kenntnisse haben sich seitdem signifikant verbessert ;) )

  • Gut, dann kann ich von deiner Seite ja einiges an Wissen voraussetzen. Das vereinfacht die Sache :)


    Ich hatte mal ein ähnliches Problem. Da hab ich dann folgendes gemacht:
    Eine Sonnenblume würde beispielsweise so gespeichert:


    Also egal für welches Object (ob Elternklasse oder Kindklasse) wird eine Tabelle angelegt. Jedes Kind hat einen Verweis auf die Elterntabelle, in der auch ein Datensatz für sie abgelegt sind in dem die von der Elternklasse implementierten Attribute gespeichert sind (Die Klasse Pflanze stellt die Attribute Größe, Alter und Gewächshaus zur Verfügung; Die Klasse Sonnenblume erweitert diese Attribute um die Körneranzahl, Gänseblümchen um die Blätteranzahl). So ist es auch möglich von Sonnenblume eine weitere Klasse abzuleiten und trotzdem werden alle Attribute gespeichert (KindVonSonnenblume verweist auf Sonnenblume verweist auf Pflanze).


    mfg Jon

  • Ok, dein Verfahren ermöglicht es mir auch die Eigenschaften von von Erweiterungen der Klasse Pflanze wie Sonnenblume oder Gänseblümchen in der Datenbank zu speichern. Mir geht es jedoch hauptsächlich um das möglichs ressourcenschonende Einlesen dieser Daten in die Objekte.


    Wenn ich mich in meinem Gewächshaus Nr. 3 befinde, welches 50 Pflanzen beinhaltet, seinen es einfach nur Pflanzen, Sonnenblumen oder Gänseblümchen, würde eine SQL-Abbfrage ja ungefähr so aussehen


    sql = "SELECT pflanze_id FROM pflanzen WHERE pflanze_gewächshaus = 3";


    dann bekomme ich 50 Datensätze aus denen ich 50 Ojekte mit den Ermittelten Eigenschaften erstellen möchte.
    In der Einfachsten (uneleganten) Variante mache ich eine Schleife


    Java
    for (i=0;i<anzahl;i++)
    {
    id = datensatz[i][pflanze_id];
    
    
    pflanzen[i] = new pflanze(id);
    }


    Im Konstruktor jeder Planze wird dann nochmal eine Abfrage ausgeführt :


    SELECT * FROM pflanzen WHERE pflanze_id = pflanze_id


    Was natürlich eine Menge überflüssige Abfragen zur Folge hat.
    Ein Weg das Problem zu mildern ist, dass diese Abfrage nicht im Konstruktor, sondern in einer separaten Methode ausgeführt wird, welche erst ausgeführt wird, wenn eine Eigenschaft mittels get-Methode wirklich abgefragt wird.


    Eine Weiterentwicklung dieser Lösung war, gleich alle Felder zu ermitteln und den kompletten Datensatz an das Objekt zu übergeben.


    Java
    for (i=0;i<anzahl;i++)
    {
    pflanzen[i] = new pflanze(datensatz[i]);
    }


    in der Klasse Pflanze und ähnlichen Klassen habe ich dann Methoden, die überprüfen, ob eine id oder ein Datensatz übergeben wurde und die damit die entsprechenden Klassenvariablen füllen.


    Nun suche ich immer noch eine Möglichkeit diesen Mechanismus zu vereinheitlichen.

  • Hmm. Du könntest eine Klasse schreiben, der du eine ID (Pflanze{3}) übergibst. Diese Klasse liest dann alle Attribute dafür ein.
    Was, wenn du jetzt zB das Gewächshaus darstellen sollst. Da hast du doch zuerst mal folgendes: Ein Rechteck mit ein paar Pünktchen. Für diese Ansicht benötigtst du eigentlich nur die Ausmaße des Gewächshauses und die Anzahl der Pflanzen. Wird jetzt eine Pflanze ausgewählt kannst du die Daten dazu nachladen. Das dürfte doch sehr ressourcenschonend sein oder?


    So auf die Schnelle fällt mir auch nichts ein. Vielleicht kommt noch was nach bis morgen, dann meld ich mich.


    wfg Jon

  • Also, die professionelle Lösung für mein Problem hieße wohl DAO-Pattern um den Datenzugriff komplett zu abstrahieren - hab ich aber keinen Bock drauf.


    Ich werd mehrere Konstruktoren machen, je nachdem ob eine Id oder Cursor Objekt oder Array oder was immer auch zur Ermittlung der Objektdaten hilfreich sein könnte, übergeben wird.


    Mit Hilfe von Interfaces werd ich dann die Existenz der Methoden die für die Feinheiten nötig sind erzwingen und das wars. Dann hab ich zwar immer noch an verschiedensten Stellen SQL-Abfragen, aber eine Datenbank die grundlegende SQL-Befehle versteht, ist dann nunmal Vorraussetzung.


    Danke auf jeden Fall an Jon und ich werd die Lösung hoffentlich in den nächsten Tagen mitteilen... :)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!