PHP Browsergame - Funktionen verstehen

  • Servus.


    Ich bin Medeingestalter und erstelle schon seit jahren kleine Private Homepages. Hier nutze ich zu Meisst Wordpress, und erstelle simple Templates/Themes.
    Jetzt möchte ich seit einiger Zeit etwas tiefer ins Programmieren einsteigen. Da ich keine "Ausbildung" in diesem Bereich genossen habe, bringe ich mir das Meisste selbst bei.

    Für ein größeres Projekt eines Kunden nutze ich mittlerweile ein PHP-Framework (Codeigniter) zusammen mit AJAX und einer mySQL-Datenbank.
    Das klappt schon ganz nett.

    Nun kam mir vor einigen Tagen die Idee, ich könnte zum Üben ja ein kleines "Browsergame" basteln. :)
    Das soll nichts großes sein, sondern mir nur dabei helfen zu verstehen was man alles mit PHP, AJAX und einer Datenbank anstellen kann.


    Jetzt habe ich mir zuerst mal Gedanken um den Funbktionsumfang gemacht.
    Eine Benutzerverwaltung steht bereits. Also Registrieren, und Anmelden an der Seite, den Benutzern kann auch eine Rolle zugewiesen werden (Admin, Operator, Spieler), welche verschiedene Rechte zur Nutzung des "Spiels" vorgibt.
    Als nächstes möchte ich jedem Benutzer einen Wertgegenstand geben, in diesem Fall eine Zahlungsmöglichkeit (Gold, Credits, Rohstoffe oder was auch immer).

    Meine Idee: Jeder Spieler startet mit einem Guthaben X. Jeder Spieler verfügt über ein Grundeinkommen, welches sich sekündlich zum Guthaben addieren soll. Sagen wir hier 1 Gold pro Sekunde. Beim "Ausbauen der Infrastruktur" soll das Grundeinkommen pro Sekunde steigen. Also zum Beispiel 1,3 Gold pro Sekunde. Das Einkommen soll sich auch zum Guthaben addieren, wenn der Spieler nicht eingeloggt ist.


    Mein Problem: Wie ist sowas im Groben zu gestalten? Muss ich hier zum Beispiel cron einsetzen, welches sekündlich die komplette Datenbank aktualisiert, und jedem Konto einen Betrag X hinzufügt? Scheint mir zu aufwändig.


    Kann mich da jemand in die richtige Richtung stubsen? ^^
    Browserspiele wie Ogame, DieStämme, ect. haben ja ein solches Ressourcen-System.


    Liebe Grüße

  • Der Cronjob würde deinen Server killen ;)

    Du kannst es einfacher machen.
    Du speicherst bei jedem Benutzer ab, wann er das letzte mal geklickt hat und wenn er das nächste mal klickt, weißt du, wie lange das genauert hat.
    Über diese Zeitdifferenz kannst du dir ausrechnen, wie viel er dazu bekommt und das in die Datenbank eintragen.
    Das aber bei jedem Benutzer für sich - die anderen interessieren ihn ja nicht, das würde nur Rechenzeit kosten.

    Oder im allgemeineren Fall: Jedesmal, wenn du auf das Vermögen eines Benutzers zugreifst, speicherst du den Zeitpunkt ab. Mit dem zuvor gespeicherten und dem aktuellen Zeitpunkt weißt du genau, wie viel Gold er bekommt.

    Deine Datenbank muss die Realität nicht 1:1 wiederspeigeln - dafür kannst du ja eine Logik programmieren. So ersparst du dir Rechenzeit und viele Nerven. :D Habe als erstes PHP-Projekt auch ein Browsergame entwickelt und Rohstoffe stündlich verteilt (und andere berechnungen ausgeführt). Aber einer gewissen Größe bricht dein Script einfach ab - du merkst es nicht - und manche deiner Benutzer bekommen keine Rohstoffe mehr - viel Spaß beim Fehlersuchen :D

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Okay das hört sich schonmal sinnig an.


    Müsste also so funktionieren:

    In der Datenbank hab ich stehen:
    Benutzer Dude hat 1.000 Gold um 18:30:00 Uhr, Grundeinkommen = 2 gold pro Sekunde
    Dude loggt sich ein um 19:00:00 Uhr
    Die PHP-Funktion speichert die Loginzeit zwischen, lädt aus der DB das Guthaben sowie die dazugehörige Zeit.
    Dann wird die Zeitdifferenz errechnet = 30 Minuten; sowie mit dem Einkommen pro Sekunde verrechnet | 30 * 60 * Grundeinkommen (2) = 3.600 Gold.
    Also hat der Dude um 19 Uhr 4.600 Gold.


    Das neue Guthaben schreibe ich dann wieder in die DB inklusive der aktuellen Zeit.
    Ich muss also bei jedem Seitenaufruf das alte Guthaben laden, das neue Guthaben berechnen und sogleich das neue Guthaben wieder in die DB speichern.
    Ist mein Gedankengang soweit richtig? ^^


    Liebe Grüße, und vielen Dank für die flotte Hilfe!
    dude*

  • ich würde die DB nur aktualisieren, wenn sich der Satz pro Sekunde ändert...
    Ansonsten kannst du ja immer rechnen:

    Am Anfang hat er 1000Gold mit 1Gold/s einkommen. damit kannst du ja zu jedem zeitpunkt x den "Kontostand" bestimmen, bis sich das "Einkommen ändert. Anders siehts natürlich aus, wenn auch ab und zu mal was abgezogen werden muss oder unplanmäßig was dazukommt. Aufjedenfall halte ich eine mysql-query bei jedem Klick für Übertrieben. oder ist das Normal bei BGs?

    alxy

  • us dem Grund habe ich ja gemeint, dass man es auch aktualisieren könnte, wenn es verwendet wird. Das kann man wunderbar als Klasse abstrahieren. Und die get_money-Funktion führt das einfach aus und speichert zwischen. Also wenn die get_money-Funktion öfter in einem Script aufgerufen wird, merkt sich das Script nach der ersten Verwendung den Wert.

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Ja so hab ichs auch jetzt gemacht.

    Erst beim AUfrufen der Seite wird die Zeitdifferenz errechnet, und mit der ProduktionProStunde multipliziert.
    Danach wird der neue Wert in die DB geschrieben.

    Ich bastel mal noch weiter, mal sehen wie sich das entwickelt. :)


    Danke für eure Tips!