PHP Levelsystem - Feedback?

Pfandfinder

Lieutenant
Registriert
Nov. 2020
Beiträge
619
hi,

ich programmiere derzeit aus Spaß ein Levelsystem für meine Seite, ich hab mir jetzt das zusammengeschrieben. habt ihr feedback wie ich das noch verbessern kann / sollte ? :)

PHP:
$userlevelpoints = 69; // ist variabel

$level1 = 10;
$faktor = '1.3';

$i = 0;
$tmp = $level1;
do {
    $tmp = floor($tmp * $faktor);
    $i++;
} while ($tmp <= $userlevelpoints && $i < 1000);

echo $i; // Levelausgabe
 
Statt einer Schleife würde ich den Logarithmus nehmen, mit deinem Faktor als Basis

PHP:
$i = min(1000, (int) log($userlevelpoints / $level1, $faktor));
ungetestet aber sollte glaube ich das gleiche ergeben wie deine implementation (abgesehen von dem level-weise abrunden der nötigen Punkte)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Iqra
max und min vertauscht :D
 
aber er zeigt mir damit immer 1 Level weniger an
 
Zuletzt bearbeitet:
da gibts doch son ähm dings, womit man aus zwei zahlen eine machen kann und dann ist die größer, ich komm grad nicht drauf
 
  • Gefällt mir
Reaktionen: heulendoch und Pfandfinder
und wieso funktioniert floor da nicht ? er rundet nicht ab:

PHP:
$level = min(1000, (int) floor(log($userlevelpoints / $level1, $faktor))) + 1;
 
der (int) cast rundet doch schon ab? Würde das +1 auch direkt hinter das log, also in die min() ziehen, sonst ist dein max level plötzlich 1001.
 
Ich würde es eher verständlicher statt noch unverständlicher machen. Es ist erstmal extrem unverständlich was da passieren soll.
 
  • Gefällt mir
Reaktionen: netzgestaltung und abcddcba
Zunächst: bevor man für simple arithmetische Operationen sich in einem Wald von if then loop while next verläuft: sich überlegen was man überhaupt will und dann (möglichst) geschlossene Formeln nehmen.
Ja die Coder Generation will das immer nicht hören, aber zum Programmieren gehört bissel mehr als nur stupides Aneinanderreihen.

Das aber nur nebenbei.

Wenn die "userlevelpoints" in etwa das sind was man im allgemeinen als XP bezeichnen würde, dann kann man das prinzipiell so machen. Mußt natürlich ein System haben was diese Punkte speichert und welches dem Benutzer neue Punkte gibt... und eventuell auch wieder wegnimmt.

Da es aber ein levelcap gibt (1000) könnte man auch drüber nachdenken, einfach eine statische Zuordnung zu bauen von "level points" zum zugehörigen Level.
Das kann, aber muß nicht notwendigerweise der genannten Berechnungsformel entsprechen und ist damit einen Ticken flexibler. Auch einen Ticken performanter, da pro Zugriff nichts berechnet werden muß; das würde man allerdings erst bei steigender User-Zahl merken.

Ebenfalls möglich: den bereits erreichten Level gemeinsam mit den levelpoints zu speichern und aus beiden zusammen den Bedarf an weiteren levelpoints zu ermitteln fürs nächste level-up. Das ist dann denke ich Geschmackssache.


Der $faktor muß natürlich eine Zahl sein und kein String. Aber ich vermute mal das ist im Eifer des Gefechts einfach da reingerutscht.

Und im Sinne der Struktur: wenn du Schleifen weglassen kannst, dann lasse Schleifen auch weg. Das einzige was schlimmer ist als nutzlose Schleifen sind nutzlose verschachtelte Schleifen.
 
Iqra schrieb:
Auch einen Ticken performanter
Premature Optimization ist eine schlechte Idee.

Beide vorgeschlagene Code-Lösungen enthalten übrigens Fehler. In der Schleife schon zu runden verfälscht ab einem gewissen Level das Ergebnis. Bei der zweiten Lösung ist das Maximallevel 1001 und nicht 1000.

Man sollte sich das händisch ausrechnen für einige bzw. "interessante" Fälle und dann Testfälle dazu schreiben. Eine einzelne Formel kann man dafür ggf. durchaus nehmen, da müssen dann aber ausführliche Kommentare dazu wo die Formel her kommt.
 
Zurück
Oben