experience/level/benodigd berekening uit totaal xp
Door
jeroen germers
op 04-08-2015 16:48
gewijzigd op 04-08-2015 16:50
3.230 views
Hoi,
Ik ben een kaartspelletje aan het maken.
Nu wil ik hier een level systeem aan knopen.
nu heb ik een kleine som gemaakt:
$xp_som = CEIL(($speler_max_xp / 3.14));
deze xp_som telt hij bij de xp_nodig op wanner xp_huidig >= xp_nodig en verhoogd de level met 1.
Werkt leuk en geeft kleine stapjes omhoog, maar ik wil ook graag dat als je een potje verliest dat er xp afgaat(de-level optie). Dus bedacht ik mij om een xp_totaal kolom bij te bouwen.
Ik heb op internet een beetje rond gezocht en toen kwam ik deze som tegen:
deze som pakt de totaal_xp en een multiplier en berekend daar de level uit, werkt heel mooi, maar hoe krijg ik de omgekeerde versie van die som? zodat ik de benodigde xp kan berekenen?
Is er iemand die weet hoe ik dit kan berekenen? zelf snap ik er niks van.
Een formule met afrond-functies kan niet exact teruggerekend worden
Oke hier kwam ik ook al achter toen ik mijn eigen formulie maakte, is het dan niet verstandiger om Float te gebruiken en dan geen afrond functies meer?
//edit
ik heb nu een som gemaakt dat mij de level, xp_nodig en xp_totaal geeft.
Maar hoe krijg ik dit vanaf de xp totaal berekent?
echo '<br>totaal xp nodig tot '.$i.' = '.$xp_totaal.'<br><br>' ;
?>
bovenstaande script output:
naar level 1 kost 0 xp
naar level 2 kost 33.14 xp
naar level 3 kost 72.56 xp
naar level 4 kost 118.26 xp
naar level 5 kost 170.24 xp
naar level 6 kost 228.5 xp
naar level 7 kost 293.04 xp
naar level 8 kost 363.86 xp
naar level 9 kost 440.96 xp
naar level 10 kost 524.34 xp
totaal xp nodig tot 10 = 2244.9
Ben nu de gehele dag aan het proberen om het voor elkaar te krijgen, maar dit is boven mijn kunnen.
Afronden inderdaad weglaten lijkt me beter. Ik vind het overigens maar een vreemde formule maar goed dat ter zijde. Je kunt wel het afronden alsnog doen in de echo regel:
<?php
echo floor($level)
?>
Op deze manier overschrijf je $level niet.
Mijn uitgerafelde formule zonder floor functies komt er dan zo uit te zien:
<?php
$multiplier = 100;
$totaal_xp = 1200;
Nu willen we gaan terugrekenen waarbij de totaal_xp berekend moet worden en de multiplier wel bekend is (toch?) eerste stukje is simpel:
<?php
$multiplier = 100;
$level = 5;
?>
dan moeten we hier beginnen:
<?php
$level = $t / $multiplier;
?>
Vul in wat we al weten:
5 = $t / 100
dus $t = 500. Maar hoe berekenen we dat?
<?php
$t = $level * $multiplier;
?>
Dan de tweede stap:
<?php
500 = 50 + $t;
?>
dus $t wordt hier 450.
Dat berekenen we zo:
<?php
$t = $t - $c; // 450 = 500 - 50
?>
Het eerste stuk van de reverse berekening ziet er nu zo uit:
<?php
$multiplier = 100;
$level = 5;
Kon niet slapen dus toch maar weer even aan het puzzelen geweest.
Ben opnieuw begonnen, en bij toeval kwam het zo uit dat het werkt beide kanten op.
dit is het scriptje wat ik nu heb gemaakt dat beide kanten op rekent, zowel level naar xp als xp naar level. enigste nadeel is hij rekent nu 75 exp per level dat is wel jammer want hoe je daar nu weer variatie in krijgt is me weer te lastig.
<?php
//level vanuit xp berekenen en van level naar de xp
$multiplier = 75;
$totaal_xp = 7500;
echo 'Xp staat op: <b>'.$totaal_xp.'</b><br><br>';
Aangezien mij het niet lukt om zo'n berekening te maken heb ik een berekening gemaakt die gebruik maakt van een array met vooraf ingevoerde level up xp's.
Is dit een toelaatbare manier?
Mijn bedoeling is dat ik een sommetje maak om alle xp uitterekenen en die vervolgens vast in de array zet, en deze dan gebruikt word om alles mee uit te rekenen.
dit heb ik ervan gemaakt:
<?php
//de xp van de speler (uit database halen)
$huidig_xp = rand(0,1200);
echo 'Ben level '.$i;
echo '<br>Volgende level is '.($i+1);
echo '<br>Xp nog nodig deze level '.$xp_nodig_deze_level;
echo '<br>Totaal xp nodig deze level '.$xp_volgende_level;
echo '<br><br>Level '.$i.' | Xp '.$huidig_xp.'/'.$xp_volgende_level;
Zou het niet makkelijker zijn als je opslaat wat iemand zijn huidige level is, en hoeveel XP er nog nodig is voor het volgende level? Dan wordt e.e.a. volgens mij (een stuk) eenvoudiger. Ook zou je dan penalties op level kunnen baseren, hoe hoger het level hoe zwaarder de penalty (met een bepaalde bovengrens natuurlijk).
Ook zou je rekening moeten houden met een level-uitbreiding, als je max level wordt opgehoogd, kun je dan alle berekeningen in een ongeveerd rechte lijn doortrekken? Als deze kwadratisch of logaritmisch verlopen ontploffen de nummers op een gegeven moment en heb je een schaalbaarheidsprobleem wat op den duur genormaliseerd zou moeten worden.
Zou het niet makkelijker zijn als je opslaat wat iemand zijn huidige level is, en hoeveel XP er nog nodig is voor het volgende level? Dan wordt e.e.a. volgens mij (een stuk) eenvoudiger. Ook zou je dan penalties op level kunnen baseren, hoe hoger het level hoe zwaarder de penalty (met een bepaalde bovengrens natuurlijk).
Ook zou je rekening moeten houden met een level-uitbreiding, als je max level wordt opgehoogd, kun je dan alle berekeningen in een ongeveerd rechte lijn doortrekken? Als deze kwadratisch of logaritmisch verlopen ontploffen de nummers op een gegeven moment en heb je een schaalbaarheidsprobleem wat op den duur genormaliseerd zou moeten worden.
Hier zat ik eerst ook aan te denken, maar als ik de level opsla moet ik ook de xp opslaan anders valt er nog niks te berekenen. Op mijn manier zet ik alle level up xp's in de array (vooraf) dus ik maak een extern scriptje dat mijn xp variable verhoogt en deze plaats ik handmatig in de array. zodoende heb ik alle xp bij de hand voor elke level up. Aangezien ik de totaal_xp van de speler opsla in de database, kan ik vanaf daaruit alles berekenen. De level word immers al berekent dus de level variable kan ik overal weer gebruiken en restricties voor opleggen net zoals xp restricties. En ik wil ook een de-level systeem, zodat ik xp van de speler xp af kan halen en dat hij dus de-leveld.
En een level uitbreiding op deze manier, is alleen voor de extra levels, de xp in de array toevoegen. Hier zie ik dan ook geen probleem in.
Maar wat ik me wel afvraag is, hoeveel "levels" kan een array verwerken voordat het te traag wordt?