cache oder db?

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

  • cache oder db?

    Ok, ich bin momentan in der Konzeptphase für ein kleines Browsergame. Dabei duellieren sich zwei Spieler, indem sie abwechslungsweise mehrere Züge machen, und dann das Heft dem anderen Spieler überlassen. Ich habe mich nun gefragt, wie ich sowas möglichst einfach implementieren könnte.
    Einfach wäre natürlich, jeden Zug einfach in eine db zu schreiben, und dann immer den aktuellen Zustand aus der db zu laden. Ich kann mir allerdings vorstellen, dass diese vielen Schreibzugriffe das Ganze ziemlich verlangsamen würden.
    Darum habe ich mir überlegt, ob man vielleicht nur am Ende des Zuges den Status in die DB dumpt, und während dem Zug die Aktionen irgendwie zwischenspeichert.
    Da ich noch ein PHP-Neuling bin, wäre ich froh um ein wenig Starthilfe.
    Besten Dank im Voraus.

  • #2
    würds in die DB schreiben. Weiß aber auch nicht was du mit zwischenstand meinst. außerdem beschreibst du die programmabläufe wenig bis gar nicht.

    Kommentar


    • #3
      Na gut, ich versuchs ein wenig auszuführen. Das Spiel wird, wie schon gesagt, in Runden gespielt, wobei sich die Kontrahenten im Ziehen abwechseln. Am Ende eines jeden Zuges muss die DB sowieso geschrieben werden (weil ich eine Art Zug-Review Option einbauen will), aber evtl. müsste sie nicht für jede Aktion, die während eines Zuges gemacht wird, neu geschrieben werden. Eine solche Aktion wäre z.B. mit einer Einheit anzugreifen. Dazu klickt der aktive Spieler einfach auf eine Einheit, welche anschliessend Richtung Gegner verschoben wird. Eine andere Aktion wäre z.B. das anheuern einer neuen Einheit, was ebenfalls per Klick auf einen Link, und zwar im "Kasernen-Menu", geschieht. Der aktive Spieler bekommt also am Anfang seines Zuges ein Frontend, welches alle seine potentiellen Aktionen als Links enthält.
      Mit dem Cache habe ich mir das so vorgestellt, dass vor einem Zug der aktuelle Stand aus der DB gelesen wird, das Ganze in Datenstrukturen wie Arrays und Listen gespeichert und schliesslich im Frontend angezeigt wird. Die Aktionen sollten dann irgendwie auf diesen Datenstrukturen operieren.
      Aber wie gesagt, ich habe halt keine Ahnung von PHP. Ich glaube nur zu wissen, dass Variablen eines Skriptes bei dessen Beendigung gelöscht werden. Also muss ich irgendwie herausfinden, wie ich die exportieren kann.

      Kommentar


      • #4
        sessions sind ideal. hat auch den vorteil, dass du keine halben züge in der db hast, wenn der user mal mitten drin abbricht.

        erlaube mir aber noch einen kommentar zu
        Aber wie gesagt, ich habe halt keine Ahnung von PHP
        Ist doch totaler schwachsinn! Warum muss jeder Anfänger direkt nen Browser.Game auf die Beine stellen. Früher oder später landest du wieder in projekthilfe, weil du es einfach nicht gebacken kriegst. Klasse. Lernt ertsmal die Grundlagen, und dann....

        Kommentar


        • #5
          Sessions. Na gut, schau ich mir die mal an. Danke erstmal.

          Und zum Kommentar: Der Sinn mag schwach sein, aber er ist vorhanden.

          Kommentar


          • #6
            Ok, ich hab mir die sessions jetzt mal angeguckt und denke, es könnte hinhauen. Hier ist der pseudo-code, den ich bisher produziert habe. Falls jemand gerade ein grösseres Problem sieht, wäre ich froh um Meldung.

            PHP-Code:
            <?php
              
            /*
              duel.php
              2004 by [email]zagibu@gmx.ch[/email]
              */

              
            session starten
              
            if(!session['duel_id'])                 // sind duellspezifische daten vorhanden?
              
            {                                       // nein -> start einer neuen phase
                
            plunder aus db laden
                session mit plunder registrieren
              
            }
              else                                    
            // ja -> aktion innerhalb gleicher phase
              
            {
                
            aktion einholen                       // z.b. per $_GET
                
            if(aktion == 'end phase')             // wurde eine phase abgeschlossen?
                
            {
                  if(
            phase == 'defense')              // wurde gar ein zug abgeschlossen?
                    
            include('fx.php');                // aktionen der spieler dieses zuges verrechnen
                  
            plunder in db schreiben
                  plunder aus session l
            &ouml;schen
                  skript beenden
                
            }
                
            aktion auf plunder durchf&uuml;hren
                session mit plunder registrieren
              
            }

              if(
            gameover)
                
            gameoverseite anzeigen
              
            else
                
            duelseite anzeigen
            ?>
            Die Runden sind in Spielerzüge unterteilt, welche wiederum in Angriffs und Verteidigungsphasen unterteilt sind. Im eigenen Zug bekommt ein Spieler jeweils die Angriffsphase für Aktionen zugeteilt, und im gegnerischen Zug kann er in der Verteidigungsphase Aktionen ausführen. Diese Aktionen werden einfach in Warteschlangen gereiht und am Ende des Zuges in einem separaten Skript (fx.php) ausgeführt. Da sich die Spieler schon mit den Phasen abwechseln, und nicht nur mit den Zügen, muss bereits am Ende einer Phase der Stand in die DB gedumpt werden.
            Ausserdem ist noch anzumerken, dass die Spieler bereits mit einer aktiven session in das Duell starten (sie müssen sich schon vorher einloggen).

            Kommentar


            • #7
              Ich hab auch gleich schon wieder eine Frage. Was geschieht mit Variablen einer session, wenn der Benutzer auf den Zurück-Knopf klickt? Wenn ich z.B. einen Seitencounter hätte, würde der sich erhöhen, oder würde der den alten Stand anzeigen?

              Kommentar


              • #8
                Ich hab auch gleich schon wieder eine Frage. Was geschieht mit Variablen einer session, wenn der Benutzer auf den Zurück-Knopf klickt?
                Nichts, es sei denn die Seite auf die du kommst, macht etwas.

                Wenn ich z.B. einen Seitencounter hätte, würde der sich erhöhen, oder würde der den alten Stand anzeigen?
                Hängt ganz klar davon ab, wie der programmiert ist.

                Kommentar


                • #9
                  Argh, was ich befürchtet habe trifft tatsächlich zu. Die session Variablen bleiben beim Zurückgehen natürlich auf dem aktuellen Stand (war ich mir ziemlich sicher). Was aber blöd ist: Die $_GET Anweisungen werden erneut ausgeführt. Hab es damit getestet:
                  PHP-Code:
                  <?php
                    session_save_path
                  ('./tmp');
                    
                  session_start();
                    
                  $geschichte $_SESSION['geschichte'];
                    
                  $action $_GET['action'];
                    
                  $geschichte .= $action ' ';
                    
                  $_SESSION['geschichte'] = $geschichte;
                    
                  $name 'test.html';
                    
                  $resource fopen($name'r');
                    
                  $page fread($resourcefilesize($name));
                    
                  $page str_replace('<!--$geschichte-->'$geschichte$page);
                    echo 
                  $page;
                  ?>
                  Code:
                  <html>
                  <head>
                    <title>get und session</title>
                  </head>
                  <body>
                    <a href="test.php?action=schnaltz">Schnalz</a>
                    <a href="test.php?action=wuff">Wuff</a>
                    <a href="test.php?action=pratz">Pratz</a>
                    <p><!--$geschichte--></p>
                  </body>
                  </html>
                  Muss ich jetzt wirklich noch die Zeit per $_GET mitgeben? Oder kann ich irgendwie anders verhindern, dass eine alte Aktion trotz anderem Variablenstand erneut ausgeführt wird?

                  Kommentar


                  • #10
                    Naja, deine Feststellungen sind nur logisch. Versteh jetzt aber nicht, was im weiteren dein problem ist.

                    Wenn daten erneut an eine Seite gesendet werden (ob get oder post ist ganz egal), wird die aktion auch nochmal durchgeführt. auch das ist nur logisch, wenn man bedenkt, dass HTTP ein zustandsloses Protokoll ist.

                    Mit ein bisschen drüber nachdenken solltest du aber entsprechende abfragen einbauen können, damit eine aktion, die nur einmal durchgeführt werden darf, es auch nur einmal wird.

                    Kommentar


                    • #11
                      Ist schon ein Problem. Glaube kaum, dass wenn ein Spieler auf den Back-Button klickt, er gerne einen weiteren Zug der vorherigen Art auslösen möchte.
                      Ich werde dann wohl die Zeit mit einer Aktion mitgeben, und nur, wenn die Zeit nicht zu stark von der Aktuellen abweicht, die Aktion durchführen.

                      Kommentar


                      • #12
                        Ich werde dann wohl die Zeit mit einer Aktion mitgeben, und nur, wenn die Zeit nicht zu stark von der Aktuellen abweicht, die Aktion durchführen.
                        das ist schwachsinn.

                        entweder ich darf zwei züge hintereinander machen, dann ist auch meine geschwindigkeit egal, oder ich darf es nicht. und dann sollte es kein problem sein, dies zu unterbinden.

                        Kommentar


                        • #13
                          Moment, jetzt hast du mich missverstanden. Was ich meine ist, ich habe links der folgenden Art:
                          Code:
                          <a href="duel.php?action=attack&time=najahabformatnichimkopf">Ritter</a>
                          Und dann überprüfe ich in duel.php z.B. ob die aktuelle Zeit von der übergebenen time nicht mehr als 3 Sekunden oder so abweicht. Hat nichts damit zu tun, wie viel Zeit man für eine Aktion hat.

                          Kommentar


                          • #14
                            Eine andere Möglichkeit wäre die Vergabe eindeutiger ids (mit einem md5 auf die aktuelle zeit oder so) und der Ablegung dieser in einen Array, so dass jedesmal geprüft werden kann, ob diese Seite schon geladen wurde.

                            EDIT:

                            Oder einfach gleich die Zeit ablegen...wäre wohl einfacher.

                            Kommentar


                            • #15
                              Und dann überprüfe ich in duel.php z.B. ob die aktuelle Zeit von der übergebenen time nicht mehr als 3 Sekunden oder so abweicht. Hat nichts damit zu tun, wie viel Zeit man für eine Aktion hat.
                              Ist müll. Angenommen ich hab nen Modem, oder ich bin mal kurz ka*ken, dann tuts dein Link nicht mehr.

                              Ändert auch nichts daran, dass ich, wenn ich will die Zeit fälschen kann.

                              Kommentar

                              Lädt...
                              X