mmofacts.com

Fehlerhafte Ressberechnung

gepostet vor 19 Jahre, 1 Monat von friedenspanzer
Ich such schon lange Zeit verzweifelt nach meinem Logikfehler und hoffe jetzt das Ausenstehende ihn finden :wink:

Ich hab die stündliche Produktion an Ressourcen (im Beispiel Holz) in einem Objekt gespeichert. Eben dieses Objekt soll jetzt bei jedem Seitenaufruf (also quasi sekündlich) die Ressourcen aktualisieren. Das löse ich mit diesem Code:

$timeSinceUpdate = date("U") - strtotime($this->_lastupdate);

$newress['holz'] = ($this->_prod['holz'] * $timeSinceUpdate / (60 * 60)) + $this->_ress['holz'];

Die Variable $newress wird dann später in die DB geschrieben. $_lastupdate ist dabei der Zeitpunkt des letzten Aufrufs.

Funktioniert soweit auch ganz gut. Aber nur so lange die Zahlen posivit sind. Rein rechnerisch auf dem Papier funktioniert es auch mit negativen Zahlen. Nur dort macht PHP dann nicht mehr mit und man kann den Ressourcen auf Lager beim Fallen zukucken (Soll heißen: Pro Sekunde gehen ungefähr 0,5 Einheiten ab)

Wer den Fehler findet kriegt von mir einen Keks :wink:
gepostet vor 19 Jahre, 1 Monat von Kampfhoernchen
Hm.

Bei der Zeile hab ich was net so ganz gerafft:

$timeSinceUpdate = date("U") - strtotime($this->_lastupdate);
date("U") kannst du durch time() ersetzen. Ist erheblich schneller.

Wenn $this->_lastupdate schon ein Unix-Zeitstempel ist (hast du ja geschrieben), dann macht strtotime natürlich keinen Sinn mehr und dürfte das Ergebnis verhunzen. Prüf mal, ob die Funktion -1 zurückliefert, wovon ich ausgehe. Und dann haste halt n datum bei minus 1 Millarde, was natürlich 0 Sinn ergibt. Daher könnten deine negativen Rohstoffgutschriften kommen, weil du ja immer weiter vom 1.1.1970 zurückgehst, aktuell stehst du irgendwo bei 1935 - nächstes Jahr wärst du bei 1934.
gepostet vor 19 Jahre, 1 Monat von friedenspanzer
Die Funktion gibt definitiv eine korrekte Angabe zurück. $timeSinceUpdate ist auch ein realistischer Wert (also 1 wenn ich wie wild auf F5 rumhämmer ^^). Es liegt also eindeutig an der Formel.

Achso: time() wurde eingebaut. :wink:
gepostet vor 19 Jahre, 1 Monat von Kampfhoernchen
Dann überprüf bitte mal die andernen Werte. Ich rechen das jetzt mal mit "realistischen werten durch":

$newress['holz'] = ($this->_prod['holz'] * $timeSinceUpdate / (60 * 60)) + $this->_ress['holz'];

$newres['holz'] = (50 eh * 30 sec / 3600 sec) + 500 eh;
= 1500 eh/sec / 3600 sec ) +500 eh
= 0,42 + 500
= 500,42

Die Formel ist also durchaus richtig. irgendeiner der Werte, die du übergibtst, muss müll sein. Eventuell könnte es auch an den Datentypen liegen. Versuch es mal so:

$newress['holz'] = (double)(((double)$this->_prod['holz'] * (double)$timeSinceUpdate /(double) (60 * 60)) + (double)$this->_ress['holz']);
gepostet vor 19 Jahre, 1 Monat von Krisch
Sieht für mich auch richtig aus, gib mal vorher alle Werte aus, dann kannst du's selbst nachrechnen.

Übrigends solltest du bei Updaten die Änderung nicht den Betrag eintragen, das ist sicherer. Aber Abzug kann dadurch eigentlich auch nicht entstehen.

Und wie meinst du das mit den negativen Werten?
gepostet vor 19 Jahre, 1 Monat von Kampfhoernchen
Naja, die Rohstoffe nehmen negativ zu - sprich anstatt 10 pro Minute zu produzieren, verlierst du 10 Rohstoffeinheiten.

Da strtotime() -1 zurückliefert, wenn was schiefgeht, hätte ich ja ganz streng da drauf getippt, weil du immer * -1 machst, und dadurch das gesamtergebnis negativ wird.
gepostet vor 19 Jahre, 1 Monat von friedenspanzer
OK, ich habs gefunden. Es war einfacher als erwartet :wink:

Ich hatte ein paar floor() an den falschen Stellen. Wenn ich jetzt Werte wie 517.9999 hatte hats eben auf 517 abgerundet. War keine so gute Idee ^^

Auf diese Diskussion antworten