Ankündigung

Einklappen
Keine Ankündigung bisher.

[Algorithmus gesucht] Browsergame: Bauaufträge abarbeiten

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Algorithmus gesucht] Browsergame: Bauaufträge abarbeiten

    Hallo, ich arbeite an einem Browsergame. Im Hauptgebäude können Gebäude ausgebaut werden. Dabei wird jeder Bauauftrag in eine Datenbank abgespeichert. Warum? Die Bauaufträge werden nicht direkt ausgeführt. Zunächst einmal kann nur ein Auftrag auf einmal ausgeführt werden, alle weiteren sind in der Warteschlange (Bauschleife). Zum Anderen dauert jeder Auftrag einige Sekunden.

    Jede Sekunde wird die cronjobs.php ausgeführt. In dieser soll die Aktion des Ausbaus geschehen. Hier muss ich jetzt überlegen, wie ich das am besten mache..

    Ich könnte machen (man beachte das liefe jede Sekunde):
    PHP-Code:
    $result mysqli_query($db"SELECT * FROM buildOrders";
    $order mysqli_fetch_assoc($result);
    if (
    $order["whenToUpgrade"] == "")
    {
      
    $whenToUpgrade $order["time"] + time();
      
    mysqli_query("INSERT INTO buildOrders (whenToUpgrade) VALUES ('$whenToUpgrade'");
    }
    else if (
    $order["whenToUpgrade"] > time())
    {
      
    upgradeBuilding(...);

    So oder so in der Art - hab das mal eben aus dem Kopf eingegeben, die Idee sollte klar sein.
    ABER! Es gibt ja mehrere Dörfer!

    Die Tabelle buildOrders besteht aus den Spalten id (auto_increment), villageId, building (um welches Gebäude es geht), time (Zeit in Sekunden die es zum Ausbau braucht). Drum bin ich etwas ratlos, wie ich das machen könnte.
    Vielleicht haben die, die schon etwas länger programmieren und mehr Erfahrung haben, eine Idee wie man das machen kann?

    Ich wäre euch sehr dankbar

    Liebe Grüße
    Marcel


  • #2
    Ja ich hab mal für ne Firma gearbeitet die genau solche Sachen gemacht hat:

    Geht ganz einfach:

    Speichere DateTime + Sekunden für Gebäudeausbau anstatt nur die Sekunden in der Datenbank.
    Dann brauchst du nicht rum addieren und alles was < time() ist ist fertig.

    Wegen Bauschleife suchst du dir das späteste DateTime aus dem Dorf raus und addierst dort + x Sekunden vom Gebäude was ausgebaut werden soll und trägst die DateTime bei dem Gebäude ein, wenn es keins gibt dann halt DateTime aktuell + x Sekunden

    Beispiel:
    Du baust Hauptgebäude was 15 Minuten dauert und danach reihst du Bauernhof ein mit 10 Minuten in Dorf 1.

    2014-12-25 23:20:00 + 15 Minuten -> 2014-12-25 23:35:00 = Zeit für Hauptgebäude

    Bauernhof:
    Größte Zeit aus Dorf 1 = 2014-12-25 23:35:00 + 10 Minuten -> 2014-12-25 23:45:00 = Zeit für Bauernhof

    Dann einfach mit ner Abfrage prüfen und entsprechend das Level erhöhen wenn fertig (Cron).
    Zusätzlich kannst du die Zeit auch als Countdown (JS) anzeigen und runterzählen lassen und ein Script aufrufen wenn Zeit auf 0 ist und damit ebenfalls das Gebäude fertigstellen.

    Hoffe das war um die Zeit nach ein paar Bier und so verständlich von mir formuliert.

    Kommentar


    • #3
      Wow, das klingt so als würde es funktionieren Ich bin dir sehr denkbar, ich hab nämlich selber gerade eine ziemlich komplizierte Idee gehabt, wofür ich ziemlich lange gebraucht hätte. Ich wollte über "SELECT DISTINCT ..." alle Dörfer finden, die Bauaufträge haben. Dann wollte ich ... ach es ist spät, keine Ahnung, wäre viel zu kompliziert geworden. Manchmal kommt man auf simpelsten Sachen nicht Auf jeden Dank recht herzlichen Dank!

      Kommentar


      • #4
        Ich persönlich würde von Cron abraten und lieber beim Aufruf der Gebäudeseite prüfen, ob Gebäude fertig sind. Bzw immer wenn man gerade die aktuellen Gebäudestufen braucht. Angriff etc.
        Wenn du von Zeit in Sekunden sprichst, wirst du nämlich merken, dass Cron nur Minutengenau ist und das wird deine Spieler sicherlich freuen
        Fatal Error: Windows wird gestartet

        Wie administriert man ein Netzwerk: Beispiel

        Kommentar


        • #5
          @Unlikus

          Du denkst nicht dran, dass das Spiel mehrere Personen spielen.
          Genau das war bei uns auch der Fehler, wenn niemand eingeloggt ist, passiert auch nichts.
          Wenn das Gebäude um 4 Uhr morgens fertig ist und die Produktion der Waren dann steigt, möchte der Spieler natürlich auch die von 4 Uhr morgens an haben.

          Cron muss schon sein. Man kann auch einen Cron alle 30 Sekunden, 10 Sekunden etc ausführen. Muss man halt nur über das Script regeln was man aufruft.
          Stichwort: Sleep(x);

          Kommentar


          • #6
            [Algorithmus gesucht] Browsergame: Bauaufträge abarbeiten

            Wie Recall schon sagte: Cron muss auf jeden Fall sein.
            Aber sind Cronjobs echt ungenau bei sekündigem Abrufen einer PHP-Datei? D:
            Naja.. ob es was bringt, dass ich das Script einfach noch ein paar Mal in die Datei einfüge und durch Wartezeiten trenne..

            Kommentar


            • #7
              man kann php auch per cli laufen lassen und dann alles notwendige zu jeder zeit ausführen

              Kommentar


              • #8
                Cli hab ich nun schon so oft gelesen.. Muss mir mal anschauen was das ist..

                Kommentar


                • #9
                  also Produktion kann man zurückrechnen, mach ich auch so, funktioniert Prima. Nur bei Angriffen habe ich mich entschieden, diese Live auszuführen, da es einerseits wenige sind, und die Berechnung aufwendig ist. Bin gerade an einer Art Cron, dem ich einfach eine Zeit und einen Bash Befehl gebe und es dass dann sekundengenau ein mal ausführt.
                  Fatal Error: Windows wird gestartet

                  Wie administriert man ein Netzwerk: Beispiel

                  Kommentar

                  Lädt...
                  X