kostenloser Webspace werbefrei: lima-city


\"Nachrichten\" per JS ect. an anderen Computer senden?

lima-cityForumDie eigene HomepageHTML, CSS & Javascript

  1. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Moin. Ich habe ein kleines Spiel in HTML/PHP geschrieben.
    Leider läuft es sehr langsam, da das Spielfeld jedes mal aktualisiert werden muss. (Ihr kennt ja Lima, aber auch auf anderen Spaces würde es sehr stören, mich nerfts sogar am localhost.)
    Ist ein TBS. Wer sich jetzt nicht auskennt: Ist quasi mit Schach vergleichbar.
    Jetzt habe ich mir gerade gedacht, dass es möglich wäre die Figuren per JS zu ziehen.
    Allerdings müssten dann wohl die Rechner untereinander kommunizieren, sonst kommt es an gewissen stellen trotzdem zu verzögerungen.

    Wäre soetwas in JS realisierbar? Oder in Ajax oder wie das heißt?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Also ich denke mal: Ja es währe in Ajax realisierbar. Eigentlich ist Ajax sowieso nichts anderes wie JavaScript^^
  4. t*****b

    Per Ajax kann man mit Hilfe von JavaScript mit dem Server kommunizieren, ohne dass die Seite ständig neu geladen werden muss. Das heißt, man sendet eine Anfrage und erhält ein Result zurück, welches du dann weiter verarbeiten kannst.
  5. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Aber wäre es auch möglich mit einem anderen Clienten p2p per Ajax zu kommunizieren, also z. B. das Spieler 1 Spieler 2 sowas wie \"Dubistdran\" sendet damit er weiß dass der erste Spieler fertig ist?
  6. Ich habe vor einer Weile mir auch ein solches Projekt angesehen und getestet (war jedoch auch noch nicht fertig zu diesem Zeitpunkt), dort wurde Othello oder Reversi (weiß ich nicht mehr so genau, welches von beiden) realisiert.
    Dort wurde zu diesem Zeitpunkt auch noch mit diesem Problem gekämpft und die Seite hat sich ständig neu geladen und das Ziehen von Zügen war nur zwischen den Ladezüglen möglich.

    Da hab ich auch gleich an JS gedacht.

    Grundsätzlich, wie schon erwähnt wurde, kannst du mittels Ajax nicht zwischen zwei Computern sondern nur mit dem Server kommunizieren. Du kannst beispielsweise Seiten über die GET- bzw POST-Methode abfragen und erhälst als Response den Inhalt dieser Seite / das Ergebnis dieser Abfrage.

    Was du aber auf jeden Fall machen kannst, ist, dass du die grundsätzliche Logik des Spiels als JS auslagerst. Damit sparst du dir schon mal einiges. Ansonsten könntest du das über eine weitere Seite, die die eigentliche Kommunikation mit dem Server übernimmt regeln. Dh, du machst dann einen Request zu dieser Seite mittels Ajax (bspw unter Verwendung von prototype), welche dir dann zB die Position einer Spielfigur zurückgibt. Diese Information könntest du dann wieder über JS verarbeiten, entsprechend die Darstellung anpassen.

    Was du dir dann aber noch überlegen müsstest, ist, wie das zeitliche geregelt wird. Also, wie viel Zeit hat ein Spieler zum Ziehen, die Verarbeitung dessen (musst du dir ein entsprechendes Backend überlegen) und die Abfrage der Züge anderer.

    Bsp: Ein Spieler hat maximal 30s Zeit zum Ziehen. Wenn er zieht werden die benötigten Informationen weitergeleitet, wenn nicht wird auch dieses gemeldet und entsprechend reagiert. Anschließend muss dies verarbeitet werden. Dies kann je nachdem etwas dauern. Erst nach der Verarbeitung kann ein anderer Spieler die Daten zu diesem Zug abholen. Dh, das die Wartezeit auf den Zug des Gegenspielers wahrscheinlich etwa doppelt so lange dauern wird.


    Bei Reversi könntest du zum Beispiel ein Array benutzen, um die Positionen der einzelnen weißen und schwarzen Steine zu speichern / festzulegen. Über dieses Array stellst du diese dann auf deinem Spielbrett dar. Außerdem kannst du dem Spieler alle möglichen Züge markieren, von denen er dann einen auswählen kann. Das machst du dann mit einer anderen Funktion, welche an Hand der Positionen der weißen und schwarzen Spielsteine die berechnet und dann auch die in einem Array speichert, was auch mit bei der Darstellung berücksichtigt wird.

    Übertragen werden müsste jeweils nur die Position des neuen eigenen Spielsteins. Geholt werden muss entsprechend die Position des neuen Spielsteins des Gegners. Dies könnte beispielsweise in einer Datenbank gespeichert werden. Am Anfang muss zudem natürlich auch noch festgelegt werden, welcher Spieler welche Farbe nimmt. Außerdem muss man die \"Übernahme\" von gegnerischen Spielsteinen verarbeiten. Das kann aber auch bei jedem Client selbst über eine JS-Funktion gemacht werden, wenn ein neuer gegnerischer oder eigener Zug gemacht wurde/erhalten wurde.

    Für eine bessere Zuordnung könnte man Sessions benutzen, welche natürlich auch als Parameter bei Anfragen mitgesendet werden müssten. Die Session-ID könnte zudem als alternierender Teil von Tabellennamen benutzt werden, auf denen die einzelnen Spiele arbeiten und welche nach dem Spiel wieder gelöscht werden.

    Das größte Problem wäre nun höchstens noch die Abfrage des gegnerischen Zuges. Dafür könnte man einen Timer verwenden, der einen bestimmte Zeit verstreichen lässt und anschließen abfragt oder frequentiell im Hintergrund abfragt, ob ein neuer Zug bereit steht. Ein Spieler muss ja schließlich nicht warten, bis die vorgegebene Maximalzeit verstrichen ist.

    Am besten wäre es natürlich, wenn der Server zeitversetzt anworten würde, also dann, wenn er den nächsten Zug liefern kann.

    Im Normalfall sollte vielleicht aber auch eine Abfrage alle 10s ausreichend sein, welche dann bspw. \"Kein neues Zug\" oder \"S_C8\" / \"W_D9\" zurückliefert.


    Wie du das genau lösen willst, musst du dir dann genau überlegen. Da du aber deiner Frage nach, wohl schon das Spiel mehr oder weniger fertig hast, solltest du dir ja schon einige Gedanken gemacht haben und auch die Portierung der Logik sollt nicht wirklich ein Problem darstellen.


    Beitrag geändert: 31.3.2008 3:47:43 von pjhimself
  7. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Wow, danke für die detailierte Antwort.
    Ich habe jetzt aber nicht verstanden warum man die Runden begrenzen muss?!
    Kann man mit Ajax nicht einfach alle 5 Sek. eine Abfrage zu einen PHP-Skript mit GET wie z. B. check.php?gameid=1 aufrufen? Dieser schaut dann per Session in den Cookies ect. ob der User autorisiert ist sich die Daten zu hohlen, und ließt sie ggf. aus MySQL, wo z. B. drinnensteht wer dran ist? Dann muss der Zug doch nicht begrenzt sein, oder?

    btw. es wäre theoretisch schon im spielbaren Zustand, ist aber noch SEHR verbuggt, und es fehlen noch so Dinge wie die Prüfung ob bei einen Zug ein Objekt im Weg liegt ect. Wollte mich bevor ich das mache erst noch um die generelle Spielbarkeit kümmern. Dachte dass das max. per Java möglich wäre, und hab mir gedacht dass es garnicht so schwer sein wird. Habe mich geirrt. z. B. ein \"echo\" ist unter Java system.print.in(\"\"); oder so ähnlich, PHP hat mich wohl in den letzten paar Jahren zu sehr verwöhnt. ^^
    Kam erst vor ein paar Stunden auf die Idee mit JS.
  8. Also das beschriebenee Projekt wurde per JAVA geschrieben, also ein JAVA-Server der sich um alles kümmert. Jedoch hast du dann ja immernoch deine ständigen Abfragen, die zu diesem Zeitpunkt dort durch ständiges neuladen gekennzeichnet war (seehr nervend gewesen^^). Ich hab erst mit JAVA gearbeitet und dann mit PHP angefangen. Komm gut mit beidem klar ;)

    Zu deiner Frage: Eine Runde muss nicht begrenzt sein, dass liegt selbstverständlich zum einen am Spiel und dessen Regeln und zum anderen an deinen Wünschen, deiner Konzipierung, wie du dir das halt vorstellst.

    Du müsstest so oder so ständig abfragen. In welchem Abstand das Ganze dann gemacht wird/werden muss, hängt auch stark vom Spiel ab. Um die Ressourcen etwas zu schonen, solltest du am besten schon etwas \"Freizeit\" einbauen. Dies wird sich bei fast jedem solcher Spiele machen lassen, schließlich muss der Spieler ja erst überlegen, auf den gegnerischen Zug reagieren und dann entsprechen seinen Zug absenden. Plus Verarbeitungszeit kommt da bestimmt schon etwas zusammen, was du dann mittels Timer frei von Requests halten könntest.

    Inwiefern das nachher möglich ist, hängt aber voll von dir und deinem Spiel ab. Das mit der Begrenzung auf 30s war als Beispiel gedacht.

    Grundsätzlich würde ich dir raten, dass du einfach einen POST-Request machst, bei dem die Session-ID mitgesendet wird. Damit könntest du dann das Spiel identifizieren. Beispielsweise in einer Tabelle Games mit den Spalten Game, Player1, Player2 wobei bei den Spielern deren Session-ID und bei Game die Game-ID gespeichert wird. Oder eine Tabelle mit den Session-IDs, denen dann das Spiel zugeordnet wird.

    Hast da recht viele Möglichkeite bei der Identifizierung.

    Dazu dann noch weitere Tabellen zu jedem Spiel.

    Am besten, du lässt gleich die Session-ID in eine JS-Variable schreiben, dann kannst du die für deine Requests leichter benutzen.
  9. Autor dieses Themas

    lol4me

    lol4me hat kostenlosen Webspace.

    Danke für deine Hilfe. Hoffentlich schaffe ich das, habe gerade ein Spielfeld mit 400 (20 x 20) Feldern und insgesamt 101 Einheiten aufbauen lassen, und er schafft es nichtmal innerhalb der 60 Sekunden fertig zu werden. ^^
    Ich weiß, klingt nach vielen Einheiten aber im Spiel merkt man das nicht mehr.
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!