f(x) = mx + n

f(x) = mx + n

Mathematik! Zu Hülf! Eltern, bringt eure Kinder in Sicherheit! Oder auch: Wie eine kleine Formel Probleme in Browsergames lösen kann.

eXperinox ist ein recht vielfältiges Browsergame. Man schickt Flotten hin und her, sammelt und transportiert Rohstoffe, stellt daraus Ressourcen her und vieles andere mehr. Was haben all diese Vorgänge gemeinsam? Es ändert sich etwas im Verlauf der Zeit – und zwar linear. Auf Entwicklerseite gibt es zwei grundlegende Herangehensweisen an diese Art von Problemen: eine numerische, die Horst (Slayer) in seinem Beitrag „Bitte nicht alle gleichzeitig!“ beschrieb – und eine analytische, bei der die kleine Formel vom Anfang die Hauptrolle spielt.

Zur Erinnerung: beim numerischen Ansatz berechnet man alle paar Zeiteinheiten, wie weit die Flotte geflogen ist, oder wie viel Holz geladen wurde – und speichert die Ergebnisse. Das hat den Vorteil, dass es extrem einfach zu implementieren ist – bringt aber den Nachteil mit sich, dass wenn z.B. mehrere Flotten gleichzeitig sammeln Probleme bei der Verteilung entstehen können.

Eine kleine Formelkunde

Das bringt uns zu f(x) = mx + n. Wer sich noch an die Schule erinnert, wird darin eine Lineare Funktion erkennen. Diese Funktion beschreibt, wie sich der Funktionswert f(x) in Abhängigkeit von einer Variablen x linear ändert – beispielsweise die Menge Holz in einer Flotte in Abhängigkeit von der Zeit seit Sammelbeginn. Der Faktor n beschreibt dabei den Startwert – also 0 Holz zu Beginn des Sammelvorgangs – und m ist die Änderungsgeschwindigkeit (oder Steigung der Funktion) – also wie viel Holz pro Zeiteinheit gesammelt wird.

Nun können wir anfangen, Fragen zu beantworten: Wenn meine Flotte von 5 Barge (Gesamtkapazität: 2.500, Sammelgeschwindigkeit: 50 / min pro Schiff = gesamt 250 / min) sammelt, wie lange dauert es, bis sie voll ist? Oder anders gefragt, bei welcher Zeit x nimmt die Funktion den Wert 2.500 an? Dazu setzen wir die Werte einfach in die Formel ein

2.500 Wood = 5 Barge * 50 Wood / min  * X min + 0 Wood (am Anfang)

und stellen locker aus dem Handgelenk nach x um

X min = (2.500 Wood + 0 Wood) / 250 Wood/ min

und erhalten

10 min

Cool. Aber irgendwie war das noch nicht so wirklich der große Aufreger. Das gleiche können wir natürlich für die Abnahme des Holzvorrates auf dem Planeten machen. Sagen wir, wir fangen mit 4.000 Holz auf dem Planeten an – wie viel Holz haben wir noch übrig, wenn unsere Flotte dort 5 min gesammelt hat? Das ist noch einfacher – wir brauchen nicht umzustellen.

Wood = -250 Wood / min * 5 min + 4.000 Wood (am Anfang)

und erhalten

2.750 Wood

Wer jetzt aufgepasst hat, wird bemerkt haben, dass wir für jeden Zeitpunkt zwischen dem Start des Sammelns (0 min) und dem Ende (10 min) genau berechnen können, wie viel Holz noch auf dem Planeten übrig ist, und wie viel in die Flotte geladen wurde. Damit kann man beispielsweise einen Graph wie den Folgenden zeichnen:

Einfaches Sammeln

Sexy. Nur, das alles wussten wir irgendwie schon. Machen wir das etwas spannender. Bringen wir eine zweite, doppelt so große Flotte (500 Wood / min) ins Spiel, die nach… sagen wir 3 min anfängt zu sammeln.  Wir können mit der oberen Formel ausrechnen, dass zum Startzeitpunkt noch genau 3.250 Wood auf dem Planeten übrig sind. Ab da sammeln die beiden Flotten mit insgesamt 750 Wood / min alles ab. Wie viele Minuten dauert es, bis der Planet leer ist? Wieder hilft uns die Formel – wir finden heraus, dass das 4:20 min dauert. Und wie viel Holz haben beide Flotten zu dem Zeitpunkt gesammelt? Ebenso einfach:

Flotte 1 – (3 min + 4:20 min) * 250 Wood/min = 1833 Wood

Flotte 2 – 4:20 min * 500 Wood/min = 2167 Wood

In einem Graph sieht das wie folgt aus:

Sammeln mit 2 Flotten

Dieses Spiel kann man beliebig weitertreiben – mehr Flotten, andere Startzeitpunkte – wir können immer exakt sagen, wie viel Holz sich wo befindet, solange wir nur Start- und Endzeiten, sowie Sammelgeschwindigkeiten kennen.

Wie hilft uns das jetzt?

Während die numerische Methode alle paar Minuten ein Datenbank-Update machen muss um aktuelle Werte zu liefern, bekommen wir hier bei jeder Abfrage sekundengenaue Werte, indem wir berechnen wie viel Zeit seit dem Start einer Aktion vergangen ist, und dann ausgehend von den Werten zu diesem Start-Zeitpunkt extrapolieren. Erst wenn der Vorgang abgeschlossen ist, aktualisieren wir die Werte in der Datenbank – was parallele Zugriffe von CronJob und Spielern reduziert.

Sammeln mehrere Flotten an einem Planeten, können wir den exakten Endzeitpunkt des Sammelns bestimmen, reduzieren dadurch die Gefahr, weniger als 0 Holz auf dem Planeten übrig zu haben, und verteilen das Holz exakt auf die Flotten.

Aber diese Vorteile kommen zu einem Preis: Durch die Buchhaltung von Zeitpunkten und Geschwindigkeiten, und deren möglichem Überlapp, ist die Implementierung komplexer als bei der numerischen Methode und wir müssen von Situation zu Situation die Vor- und Nachteile beider Methoden abwägen.

Ein Gedanke zu „f(x) = mx + n“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.