Hi,
also zum allgemeinen. Ich Programmierer mein erstes Browsergame. Einfach zum Spaß
. Dabei habe ich schon unglaublich viel gelernt, was ich in Büchern und alles nie gelernt hätte. Zum Einsatz kommt natürlich hauptsächlich PHP zum Berechnen. Und halt das "Webseitenstandardzeugs" wie HTML,CSS,Javascript....
auf jeden Fall stehe ich gerade wieder vor einem Problem. Darüber grüble ich schon seit Tagen, weiß aber nicht, wie ich es lösen kann.
Ich kann auch keinen Code posten, da das Problem eher ein Logik-Problem ist, und ich glaube, dass ein Code-Snippet nicht hilfreich wäre. Weil mir auch kein Teil im Code einfällt, bei dem exakt das Problem liegt. (teilweise existiert de Code für das Problem ja noch nicht, bzw. ist veraltet)
Also etwas zum Prinzip des Browsergames.
Es gibt Tore, mit denen man zu anderen Welten gehen kann. (Entweder sind dort andere Spieler oder ne KI). Damit es realistischer ist, simuliere ich genau das Verbinden der Tore. Also wenn ein Tor A zu Tor B führt, dann kann Tor C nicht zur Gleichen Zeit Tor A oder B anwählen. Und das eben alles genau berechnet etc.
Jetzt kann man Leute durch das Tor schicken, um die andere Welt zu erkunden/bekämpfen/...
Dazu habe ich eben ein Modul entwickelt, was die Missionen rundenbasiert berechnet, aber es dem Spieler nicht als rundenbasiert anzeigt, sondern etwas realistischer. Also die merken nicht, wann eine Runde vorbei ist oder so. Das ist nur intern zum berechnen.
Diese einzelnen Runden haben einen "trigger", wann die nächste Runde ausgeführt wird. Das ist wichtig, weil wenn jemand um 10:00 Uhr morgens eine Mission dauert und die Seite erst um 18:00 Uhr neulädt, soll die Mission ja trotzdem um 10:00 Uhr ausgeführt worden sein. Weil das wird nicht über Cronjobs berechnet, sondern immer nur dann, wenn der Spieler die Seite neulädt. Dann wird rückwirkend alles notwendige berechnet. Und eben nur das, was gerade benötigt wird.
Daraus ergibt sich ein Problem, wenn mehrere Spieler interagieren. Wenn Spieler A um 10:00 Uhr eine Mission startet und Tor A aktiviert, und dann Spieler B um 10:01 Uhr versucht, das Tor A zu erreichen, muss das Skript ja dann die Mission von Spieler A berechnen, damit das Tor A korrekterweise gerade nicht angewählt werden kann (weil es con Spieler A benutzt wird).
Soweit so gut. Das ist ja noch machbar, in dem man jedes Mal, wenn man ein Tor anwählt, einfach alle Missionen des Tor-Besitzers durchrechnen lässt.
Jetzt habe ich allerdings folgendes Problem:
Ich habe eine Funktion, die alle aktiven Missionen von einem Spieler oder alle aktiven Missionen zu/von einem bestimmten Tor berechnet.
Diese geht also in der Datenbank alle gerade aktiven Missionen durch und führt die Runden aus, bis der "trigger" schließlich in der Zukunft liegt.
Für jede Mission gibt es eine eigene Funktion (z.B. Funktion erforschen() ), die eben die Runden berechnet. Und in jeder Mission gibt es eine Runde, in der das Tor des Spieler aktiviert werden muss, damit die Leute auf eine andere Welt gehen können.
Bevor das Tor aber aktiviert werden kann, müssen ja alle Missionen berechnet werden, die von dem Tor wegführen, und alle die dort hinführen. Das geht ja nicht anders.
Aber wenn diese Missionen berechnet werden, dann werden dort ja auch Tore aktiviert, wodurch wieder alle Missionen erst berechnet werden müssen. Und hier komme ich nicht mehr weiter.
wie kann man das richtig berechnen, dass er die Missionen logisch durchrechnet und nicht in eine Endlosschleife gerät?
Hat jemand eine Idee?
Ich hoffe, ihr versteht mein Problem. Ist ziemlich schwer zu formulieren, und ich bin mir selbst noch nicht sicher, ob das der Kern des Problems ist. Wüsste aber nicht, wie man das anders formulieren könnte.
Viele Grüße,
Dennis
also zum allgemeinen. Ich Programmierer mein erstes Browsergame. Einfach zum Spaß

auf jeden Fall stehe ich gerade wieder vor einem Problem. Darüber grüble ich schon seit Tagen, weiß aber nicht, wie ich es lösen kann.
Ich kann auch keinen Code posten, da das Problem eher ein Logik-Problem ist, und ich glaube, dass ein Code-Snippet nicht hilfreich wäre. Weil mir auch kein Teil im Code einfällt, bei dem exakt das Problem liegt. (teilweise existiert de Code für das Problem ja noch nicht, bzw. ist veraltet)
Also etwas zum Prinzip des Browsergames.
Es gibt Tore, mit denen man zu anderen Welten gehen kann. (Entweder sind dort andere Spieler oder ne KI). Damit es realistischer ist, simuliere ich genau das Verbinden der Tore. Also wenn ein Tor A zu Tor B führt, dann kann Tor C nicht zur Gleichen Zeit Tor A oder B anwählen. Und das eben alles genau berechnet etc.
Jetzt kann man Leute durch das Tor schicken, um die andere Welt zu erkunden/bekämpfen/...
Dazu habe ich eben ein Modul entwickelt, was die Missionen rundenbasiert berechnet, aber es dem Spieler nicht als rundenbasiert anzeigt, sondern etwas realistischer. Also die merken nicht, wann eine Runde vorbei ist oder so. Das ist nur intern zum berechnen.
Diese einzelnen Runden haben einen "trigger", wann die nächste Runde ausgeführt wird. Das ist wichtig, weil wenn jemand um 10:00 Uhr morgens eine Mission dauert und die Seite erst um 18:00 Uhr neulädt, soll die Mission ja trotzdem um 10:00 Uhr ausgeführt worden sein. Weil das wird nicht über Cronjobs berechnet, sondern immer nur dann, wenn der Spieler die Seite neulädt. Dann wird rückwirkend alles notwendige berechnet. Und eben nur das, was gerade benötigt wird.
Daraus ergibt sich ein Problem, wenn mehrere Spieler interagieren. Wenn Spieler A um 10:00 Uhr eine Mission startet und Tor A aktiviert, und dann Spieler B um 10:01 Uhr versucht, das Tor A zu erreichen, muss das Skript ja dann die Mission von Spieler A berechnen, damit das Tor A korrekterweise gerade nicht angewählt werden kann (weil es con Spieler A benutzt wird).
Soweit so gut. Das ist ja noch machbar, in dem man jedes Mal, wenn man ein Tor anwählt, einfach alle Missionen des Tor-Besitzers durchrechnen lässt.
Jetzt habe ich allerdings folgendes Problem:
Ich habe eine Funktion, die alle aktiven Missionen von einem Spieler oder alle aktiven Missionen zu/von einem bestimmten Tor berechnet.
Diese geht also in der Datenbank alle gerade aktiven Missionen durch und führt die Runden aus, bis der "trigger" schließlich in der Zukunft liegt.
Für jede Mission gibt es eine eigene Funktion (z.B. Funktion erforschen() ), die eben die Runden berechnet. Und in jeder Mission gibt es eine Runde, in der das Tor des Spieler aktiviert werden muss, damit die Leute auf eine andere Welt gehen können.
Bevor das Tor aber aktiviert werden kann, müssen ja alle Missionen berechnet werden, die von dem Tor wegführen, und alle die dort hinführen. Das geht ja nicht anders.
Aber wenn diese Missionen berechnet werden, dann werden dort ja auch Tore aktiviert, wodurch wieder alle Missionen erst berechnet werden müssen. Und hier komme ich nicht mehr weiter.
wie kann man das richtig berechnen, dass er die Missionen logisch durchrechnet und nicht in eine Endlosschleife gerät?
Hat jemand eine Idee?
Ich hoffe, ihr versteht mein Problem. Ist ziemlich schwer zu formulieren, und ich bin mir selbst noch nicht sicher, ob das der Kern des Problems ist. Wüsste aber nicht, wie man das anders formulieren könnte.
Viele Grüße,
Dennis