[PHP & Design] OnlineBrowserspiel sucht Helfer ;)

Dann musst du mir mal genauer erklären, was du mit "über Timestamps funktionieren" meinst :)
Der Cronjob funktioniert auch über Timestamps - also musst du irgendwas ein bisschen anders meinen ...

Also wie sieht das in deiner Vorstellung aus (ich habe mich schon vor meinem Post mit dieser Problematik beschäftigt)?

Gruß

So schwer is das doch nich. Du speicherst einfach die Zeit seit dem das letzte mal ein Rohstoff hinzugefügt wurde.

Wenn dann der User zum Beispiel genau einen Tag später wieder on kommt und man jede 5 Minunten einen Rohstoff bekommt machste das so:

Du holst dir den Timestamp, berechnest die Zeit zwischen dem Timestamp und der aktuellen Zeit also:

Timestamp jetzt - Timestamp gespeichert

Dann teilste das Ergebnis durch 60*5 (60 Sekunden mal 5):

Und dieses Ergebnis ist dann die Anzahl an Rohstoffen die hinzugefügt werden zu den alten.
Und zum Schluss setzte das Timestamp neu.
 
Dann musst du mir mal genauer erklären, was du mit "über Timestamps funktionieren" meinst :)
Der Cronjob funktioniert auch über Timestamps - also musst du irgendwas ein bisschen anders meinen ...

Also wie sieht das in deiner Vorstellung aus (ich habe mich schon vor meinem Post mit dieser Problematik beschäftigt)?

Gruß

das funzt dann foolgendermaßen:
um t=0 geht der user offline und gibt eine erzschmelze in auftrag die t=70 zeit benötigt zum bauen
um t+800 greift ein anderer benutzer den user an, dann muss vor dem angriff folgendes berechnet werden:
rohstoffe für t0 bis t70 und rohstoffe (mehr, da erzschmelze) von t70 bis t800, und dann ganz normal der kampf stattfinden, wie dein kampf stattfindet weiß ich jetzt nicht da ich mich mit soetwas nicht näher beschäftigt habe, aber cronjobs benötigt man auch dafür nicht, den wenn der kampf beginnt ist:
1. schon klar wielange der kampf geht (abhängig von der berechnung)
2. sollte t+10 nach kampfbeginn noch eine der beiden parteien nachschub bekommen, und der kampf ist noch nicht vorbei, wird eben erst eine kampfberechnung für die 1. Phase ausgeführt und dann eine berechnung für die 2. phase unter berücksichtigung des truppennachschubes

ich habe nie gesagt das dies einfach ist, denn ein browsergame ist schon etwas anderes als nen simples lose-spiel, probleme habe ich persönlich bei der kampfberechnung ne ordentliche idee hinzubekommen, was berechent wer wieviele verluste hat, aber ich habe mich damit auch nie so wirklich beschäftigt, soltle ich vllt mal :LOL:
 
So schwer is das doch nich. Du speicherst einfach die Zeit seit dem das letzte mal ein Rohstoff hinzugefügt wurde.

Das ist klar; die Frage war jetzt auf das Kampfsystem bezogen.

[...]dann ganz normal der kampf stattfinden[...]

Das mit der Funktionsweise des Timestamps war klar, den muss man ja miteinbeziehen. Die Frage sollte eher auf den Auslöser des Kampfscriptes zielen.

Wer löst das Kampfscript aus ? Ein User, der sich gerade ganz normal im Game bewegt ? Ein Cronjob ?

btw: Jo, ein Kampfsystem zu schreiben kann Kopfschmerzen bereiten :mrgreen:
 
Das ist klar; die Frage war jetzt auf das Kampfsystem bezogen.



Das mit der Funktionsweise des Timestamps war klar, den muss man ja miteinbeziehen. Die Frage sollte eher auf den Auslöser des Kampfscriptes zielen.

Wer löst das Kampfscript aus ? Ein User, der sich gerade ganz normal im Game bewegt ? Ein Cronjob ?

btw: Jo, ein Kampfsystem zu schreiben kann Kopfschmerzen bereiten :mrgreen:



Mh..also wenn ich ein Kampfsystem mache, würde ich das gleich nachdem der Auftrag abgegeben wird ausrechnen. Und wenn die Zeit abgelaufen ist und sich das jemand anschaut sieht er das Ergebnis. Oder wie geht das bei dir :roll:
 
der Auslöser des Kampfscriptes funzt genauso wie alle andren auslöser (dachte das sei klar :ugly: )
das kampfscript wird dann ausgelöst, wenn es benötigt wird, sprich:
1. wenn sich einer der beiden user einloggt
2. wenn ein weiterer user die armeen von user 1 oder user 2 angreifen will


Auslöser ist immer ein User, nie der Server ;-) (es seidenn du berechnest top-listen, da müsste es auch mal vom server ausgelöst werden)
 
das kampfscript wird dann ausgelöst, wenn es benötigt wird, sprich:
1. wenn sich einer der beiden user einloggt
2. wenn ein weiterer user die armeen von user 1 oder user 2 angreifen will

Abend,

Und wie finde ich heraus, ob ein weiterer user die Armeen von User 1 oder User 2 angreifen will, wenn keiner von beiden online ist ?

a) Die Komplett-Cronjob-Lösung (abgelehnt? :ugly: )
b) Über den 3. User, der (vielleicht) online ist

Allerdings erkenne ich bei b) / der User-Lösung ganz klare Nachteile:
:arrow: Informationen über z.B. die Inseln / Spieler sind nicht unbedingt aktuell, eventuell auch über einen längeren Zeitraum hinaus (was bei den Allianzen und Usern durch versehentlich* eingenommene Inseln eventuell Spannungen verursachen könnte)
:arrow: Zeitdifferenzen der Kämpfe und damit mögliche Truppenstärkenverhältnisse können nicht mehr stimmen
:arrow: Der Benutzer muss sich neu einloggen, um den Kampf auszulösen (anderes wäre zu performancelastig)

*Es stand ja in der Insel-Info, dass die Insel nicht irgendeinem Freund gehört

Das sind für mich drei spielerische Gründe (auch wenn sich das erste Problem nur annährend mit Cronjobs lösen lässt), die meiner Meinung nach wichtiger sind wie Ressourcen zu sparen (solange sich der Mehrverbrauch an Ressouren (?) beim Cronjob in Grenzen hält)


Ich muss das ganze mal in irgendeiner Form benchmarken; ich kann es einfach nicht glauben, dass ein Cronjob (nur auslesen + kämpfen) auf die Zeit betrachtet mehr Last verursacht, wie eine "verteilte" Überprüfung ...

Aber wenn ich mir das anschaue, müsste die Last auf Zeit ja eigentlich zu Gunsten des Cronjobs ausfallen:

Cron
:arrow: Betroffene Datensätze abfragen wo ankunft < timestamp
:arrow: Kampf

User
:arrow: Prüfen, ob ein Angriff stattfindet, ob auf die gleichen Ziele noch andere Angriffe laufen
:arrow: (eventuell) Kampf

Dazu kommen noch die Unterschiede wie das mehrmalige, aber verteilte Laden der Klasse und eventuell eine unnötige DB-Abfrage (so viel macht das nicht aus, aber in der Menge ...).


Jetzt ist mein Text doch länger geworden - viel Spaß beim Lesen ;)


Gruß
 
Das Kampfsystem wird wiefolgt ausgelöst:

Wenn ein User irgendeine Seite aufruft wird überprüft, ob Angriffe auf ihn selbst gerade abschließen bzw abgeschlossen sind oder ob er selbst Angriffe führt, die gerade abgeschlossen wurden (mit timestamp-Vergleich)

Und sonst wird allgemein immer dann, wenn jemand einen Angriff tätigt, überprüft, ob irgendwelche Angriffe noch "offen" sind, also nicht bearbeitet wurden aber bereits zu Ende sind.
Geht alles mit einem einzigen Query.

Wenn man das ganze logisch programmiert klappt das auch einwandfrei mit Beziehungen bei mehreren Angriffen auf gleiche User, auch wenn Dritte involviert sind.

-Flori-
 
Abend,

Und wie finde ich heraus, ob ein weiterer user die Armeen von User 1 oder User 2 angreifen will, wenn keiner von beiden online ist ?
in dem user 3 online ist^^ oder die berechnung eh erst stattfindet wenn einer der user (später) online geht, nimm dir mal zeit und überdenke das mal alles, mr kommt es so vor als ob du nur halb "zugehört" hast

a) Die Komplett-Cronjob-Lösung (abgelehnt? :ugly: )
b) Über den 3. User, der (vielleicht) online ist
Zu a) :yes:
Zu b) s.o.

:arrow: Informationen über z.B. die Inseln / Spieler sind nicht unbedingt aktuell, eventuell auch über einen längeren Zeitraum hinaus (was bei den Allianzen und Usern durch versehentlich* eingenommene Inseln eventuell Spannungen verursachen könnte)
es werden Daten aktualisiert, wenn sie benötigt werden, und da scheinen sie es ja ;)

:arrow: Zeitdifferenzen der Kämpfe und damit mögliche Truppenstärkenverhältnisse können nicht mehr stimmen
doch sie stimmen

:arrow: Der Benutzer muss sich neu einloggen, um den Kampf auszulösen (anderes wäre zu performancelastig)
nicht unbedingt, der kampf wird im nachhinein ausgelöst wenn die ergebniss-daten von diesem kampf benötigt werden ;)

*Es stand ja in der Insel-Info, dass die Insel nicht irgendeinem Freund gehört
muss man bei so einem Punkt eben das System aktualiseren

Das sind für mich drei spielerische Gründe (auch wenn sich das erste Problem nur annährend mit Cronjobs lösen lässt), die meiner Meinung nach wichtiger sind wie Ressourcen zu sparen (solange sich der Mehrverbrauch an Ressouren (?) beim Cronjob in Grenzen hält)
alle diese Probleme kann man auch mit ein wenig gehirnschmalz lösen^^
und cronjobs sind alles andere als "nur ein wenig" server belastend. lass mal ne große welt mit 500-600 inseln berechnen, viel spaß


Ich muss das ganze mal in irgendeiner Form benchmarken; ich kann es einfach nicht glauben, dass ein Cronjob (nur auslesen + kämpfen) auf die Zeit betrachtet mehr Last verursacht, wie eine "verteilte" Überprüfung ...
sonst würden ja nicht alle BGs nach diesem system laufen, oder?


Jetzt ist mein Text doch länger geworden - viel Spaß beim Lesen ;)
den hatte ich ganz und gar net^^
 
in dem user 3 online ist^^ oder die berechnung eh erst stattfindet wenn einer der user (später) online geht, nimm dir mal zeit und überdenke das mal alles, mr kommt es so vor als ob du nur halb "zugehört" hast

Ich hab mir das ganze mehr als dreimal durchgelesen (und verstanden).
Nach deinem Post überdenke ich das jetzt allerdings doch nochmal.


es werden Daten aktualisiert, wenn sie benötigt werden, und da scheinen sie es ja ;)

Sie werden häufig benötigt; aber halt nicht immer.
Es ist halt einfacher zu sagen "So, jetzt berechne ich die Daten und dann ist alles aktuell", als sich immer zu überlegen, wo man welche Daten jetzt benötigt (Spionage, Suche, Angriff etc)


Stimmt :mrgreen:

nicht unbedingt, der kampf wird im nachhinein ausgelöst wenn die ergebniss-daten von diesem kampf benötigt werden ;)

Dann hab ich viele Queries zusätzlich ...

muss man bei so einem Punkt eben das System aktualiseren

s.o.

alle diese Probleme kann man auch mit ein wenig gehirnschmalz lösen^^
und cronjobs sind alles andere als "nur ein wenig" server belastend. lass mal ne große welt mit 500-600 inseln berechnen, viel spaß

Auch einzeln ist ~500 mal das Laden einiger Klassen und das Ausführen der Aufgabe kein Zuckerschlecken.


sonst würden ja nicht alle BGs nach diesem system laufen, oder?

Alle die ich kenne, laufen zumindest im Kampfsystem mit Cronjobs (zumindest soweit man vom Gameplay darauf schließen kann).

den hatte ich ganz und gar net^^

Dann viel Spaß hierbei :biggrin:


--

Okay, du hast mich jetzt überzeugt die User-Variante vorzuziehen (deine harte Arbeit ;) )
Ich würde jetzt allerdings immer noch trotzdem 1 mal täglich die nicht ausgeführten Kämpfe (z.B. die, bei denen kampfende + 86400 < time()) mittels einem Cronjob zu beenden; dass einige Daten nicht völlig veraltet sind (für Exportfunktionen)

Gruß
 
man kann sicherlich einmal das machen kp, aber eben für jeden Tick ists chon krass.

Die Spiele die du meinst laufen sicherlich mit Ticks (alle 5min Rohstoffe gutschreiben) dies bezieht ich auf ein Spiel in Echtzeit, kann man aber auch für Tick-Systeme nutzen.
Und sooo viele Extra-Anfragen hast du gar nicht immer, es werden zwar ein paar mehr sein, aber dafür eine bessere umsetzung als alle 5min solch eine riesen-berechnung durchzuführen, hab schon von dutzenden systemen gehört, die dann als sie populärer daran gestorben sind.

Wenn du gut bist, dann musst du es ja auch nicht mit select-Anfragen machen sondern gleich als mysql-query alles updaten ;-) wird zwar sicherlich ein sehr komplexer query aber äußerst effizent, vllt könnte auch eine StoredProcedure für dowas nicht schelcht sein, setzt aber wieder vorraus das du eine eigene root-kiste hast
 
Ja, hab die Spiele mit Ticks gemeint ;)

Alles in einer Mysql-Query updaten ist allerdings bei komplexeren Kampfberechnungen schwer - das geht vielleicht bei Einheiten oder Gebäuden.

Naja, danke für die Tipps, ich hab ja morgen Ferien und Zeit zum ausprobieren :)
 
hmm, auch bei Tick-Spielen würde ich die Resourcenlast nicht unterschätzen, denn dann finden ja alle Berechnungen zugleich statt und nicht verteilt.

Ich habe nochmal ein bisschne recherchiert und für dich ein Forum gesucht, was sich mit der Entwicklung von Browsergames beschäftigt (ich habe heute nach meinen sozialen^^):
https://www.galaxy-news.de/forum/

was ich da bisher so gelesen habe, klingt ganz vielversprechend, auch das man sich dort der funktion von ajax in browsergames bewusst ist, macht mich happy :biggrin:
 
Mein Rohstoffsystem braucht für 10.000 Festungen grad 2-3sek. Mehr Festungen wird es nicht geben :D

Beim Angriffsystem bin ich mir nicht so sicher, da ich es gerade umbaue( bissel komplexer ) ;)

Ja, ich werde dann wohl die Rohstoffe beim Login vergüten lassen( In einer Stunde bekommt man ja nicht so viele Rohstoffe dazu ) ;) Weiterhin werde ich wohl alle "bisherigen" CronJobs einmal Nachts abarbeiten lassen. Falls vieleicht manche Angrifffe, Rohstoffvergütungen nicht abgearbeitet wurden.
 
Ich habe nochmal ein bisschne recherchiert und für dich ein Forum gesucht, was sich mit der Entwicklung von Browsergames beschäftigt (ich habe heute nach meinen sozialen^^):
https://www.galaxy-news.de/forum/

was ich da bisher so gelesen habe, klingt ganz vielversprechend, auch das man sich dort der funktion von ajax in browsergames bewusst ist, macht mich happy :biggrin:

Dänkeschön :D

Leider muss man sich für den Entwicklerbereich bewerben; das ist schwer ohne gleich konkret zu viele Details anzugeben :mrgreen:

Gruß
 
Mein Rohstoffsystem braucht für 10.000 Festungen grad 2-3sek. Mehr Festungen wird es nicht geben :D
ein system wächst mit der zeit ;) und noch viele weitere db-zugriffe/min bzw ausgefüllte daten in der db, keine rohdaten, werden das system auch noch beinflussen, nur am rande :biggrin:

Dänkeschön :D

Leider muss man sich für den Entwicklerbereich bewerben; das ist schwer ohne gleich konkret zu viele Details anzugeben :mrgreen:

Gruß
ich hab nur den offenen Bereich gelesen, hat mir gereicht :biggrin:
Hat jemand ne Seite von der ich Grafiken für ne Übersichtsmap bekommen kann?
Habe mal Lust auch sowas zu bauen (also nur die Map, nen komplettes Bg ist mir zuviel arbeit im mom)^^
 
Hat jemand ne Seite von der ich Grafiken für ne Übersichtsmap bekommen kann?
Habe mal Lust auch sowas zu bauen (also nur die Map, nen komplettes Bg ist mir zuviel arbeit im mom)^^

Ne hab ich nicht ;)

Allerdings hab ich mal ne kleine dynamisch generierte Map mit PHP (auch zum Anschauen) gebaut (mit ~130k Gebieten - hat nur 30 min gedauert das mit PHP aus ner Bilddatei auszulesen und zu berechnen und in die DB zu übernehmen :LOL: ), die könnte ich dir bei Interesse mal zeigen - dauert halt etwas zum berechnen und ist von den Grafiken nicht gerade schön (eher häßlich) *gg* (wenn ja PN) ;)
 
Ja, das mit den Board das ist schon etwas umständlich, aber es geht ;)

Kannst du mir deinen Code auch mal zeigen? Werde sowas in nächster Zeit auch brauchen :D

@ ice-breaker

Kannst gerne so etwas bauen, und ich baue es in mein OGame. Natürlich nur mit deiner Einverständniss :)
 
*gg*
mal sehen, will an sowas mal wieder nen bissel mit Ajax und JavaScript rumspielen, habe da schon im Kopf ne Idee wie das aussehen soll^^

irgendwie kommen wir nun vom eigentlichen Thema ab :roll:
 
Hi wollte mal meinen Senf dazugeben. Ich Programmiere bereits mein zweites BG und arbeite auch nach wie vor mit Chronjobs. Allerdings sollte man wie hier bereits gesagt darauf achten wofür man sie einsetzt. Die Rohstoffe werden bei mir z.b. nur beim einloggen berechnet und dann wenn man z.b. Angegriffen wird und wann es sonst noch von nöten ist. Mein Kampfsystem läuft auch über Chronjobs (jede Minute werden Kämpfe abgerechnet), denn die beim Aufruf der Seite durch die Spieler einzubauen würde die Ladezeiten für die Spieler viel zu stark erhöhen. Auch mit LIMIT etc....

Es kommt immer auf den Verwendungszweck drauf an.

Soviel von mir mal dazu
 
Falls es jemanden interessiert:

Ich hab den Rohstoffe-Part jetzt so gelöst, dass ich bei Seiten, für die es wichtig ist (Gebäude, Einheiten, Forschung), beim Einloggen (und optional alle x Minuten) die Rohstoffe aktualisiere und ansonsten einfach in $_SESSION[] speichere.