experience/level/benodigd berekening uit totaal xp

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jeroen germers

jeroen germers

04/08/2015 16:48:40
Quote Anchor link
Hoi,

Ik ben een kaartspelletje aan het maken.
Nu wil ik hier een level systeem aan knopen.

nu heb ik een kleine som gemaakt:
Quote:
$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:
Quote:
$totaal_xp = 1200;
$multiplier = 100;
$level = floor(floor(($multiplier/2) + sqrt(($multiplier^2) + (($multiplier*2) * $totaal_xp))) / $multiplier);

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.

Alvast bedankt.
Gewijzigd op 04/08/2015 16:50:55 door Jeroen germers
 
PHP hulp

PHP hulp

19/04/2024 21:14:28
 
Frank Nietbelangrijk

Frank Nietbelangrijk

04/08/2015 19:11:21
Quote Anchor link
Een formule met afrond-functies kan niet exact teruggerekend worden.

voorbeeldje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$x
= 5;
$a = floor($x/2); // $a is nu 2 in plaats van 2.5
?>

2.5*2 = 5 maar 2*2=4.

Verder kun je de formule het beste uit elkaar rafelen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$multiplier
= 100;
$totaal_xp = 1200;

$a = $multiplier^2;
$b = $multiplier*2;
$c = $multiplier/2;

$t = $b * $totaal_xp;
$t = sqrt($a + $t);
$t = floor($c + $t);
$level = floor($t / $multiplier);

echo $level;
?>

En daarna stap voor stap terug rekenen en tussentijdse uitkomsten met elkaar vergelijken.
Gewijzigd op 04/08/2015 19:12:22 door Frank Nietbelangrijk
 
Jeroen germers

jeroen germers

04/08/2015 21:09:13
Quote Anchor link
Quote:
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?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
                    $xp_weergeven_tot_level
= 10;
                    
                    $plier = 30;
                    $i=0;
                    
                    while($i < $xp_weergeven_tot_level) {
                    
                        $xp_berekenen = (( $i + $plier / 3.14) * 3.14) * $i;
                        $xp_totaal = $xp_totaal + $xp_berekenen;
                        
                        $a = $i+1;
                        echo 'naar level '.$a.' kost '.$xp_berekenen.' xp<br>';
                        
                        $i++;
                    }


                    echo '<br>totaal xp nodig tot '.$i.' = '.$xp_totaal.'<br><br>' ;
?>


bovenstaande script output:
Quote:
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.
Gewijzigd op 05/08/2015 00:17:58 door jeroen germers
 
Frank Nietbelangrijk

Frank Nietbelangrijk

05/08/2015 18:02:51
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo floor($level)
?>

Op deze manier overschrijf je $level niet.

Mijn uitgerafelde formule zonder floor functies komt er dan zo uit te zien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$multiplier
= 100;
$totaal_xp = 1200;

$a = $multiplier^2;
$b = $multiplier*2;
$c = $multiplier/2;

$t = $b * $totaal_xp;
$t = sqrt($a + $t);
$t = $c + $t;
$level = $t / $multiplier;

echo $level;
?>


Nu willen we gaan terugrekenen waarbij de totaal_xp berekend moet worden en de multiplier wel bekend is (toch?) eerste stukje is simpel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$multiplier
= 100;
$level = 5;

$a = $multiplier^2;
$b = $multiplier*2;
$c = $multiplier/2;

?>

dan moeten we hier beginnen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$level
= $t / $multiplier;
?>

Vul in wat we al weten:
5 = $t / 100
dus $t = 500. Maar hoe berekenen we dat?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$t
= $level * $multiplier;
?>


Dan de tweede stap:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
500
= 50 + $t;
?>

dus $t wordt hier 450.
Dat berekenen we zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$t
= $t - $c; // 450 = 500 - 50
?>


Het eerste stuk van de reverse berekening ziet er nu zo uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$multiplier
= 100;
$level = 5;

$a = $multiplier^2;
$b = $multiplier*2;
$c = $multiplier/2;

$t = $level * $multiplier;
$t = $t - $c;
?>


Nu de wortel en de kwadraat nog. Probeer het eens?
Gewijzigd op 05/08/2015 18:05:38 door Frank Nietbelangrijk
 
Jeroen germers

jeroen germers

05/08/2015 20:48:30
Quote Anchor link
Dit heb ik er van kunnen maken, en is niet goed, want het resultaat komt op 1523.52 ipv 1200, zols ik al zei ik heb hier de ballen verstand van.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$multiplier
= 100;
$level = 5;

$a = $multiplier^2;
$b = $multiplier*2;
$c = $multiplier/2;

$t = $level * $multiplier;
$t = $t - $c;
$t = ($t + $a) * ($t + $a);
$xp = $t / $b;    

echo '<br>2de som '.$xp;
?>


//edit

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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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>';

$som    = $multiplier / 3.14;

$level     = ($totaal_xp / $som) / 3.14;
$xp     = ($level * $som) * 3.14;

echo 'Van xp naar level: <b>'.$level.'</b><br>Van level naar xp: <b>'.$xp.'</b>';
?>
Gewijzigd op 06/08/2015 06:50:10 door jeroen germers
 
Jeroen germers

jeroen germers

07/08/2015 15:23:32
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
//de xp van de speler (uit database halen)
$huidig_xp         = rand(0,1200);

//xp nodig per level (van level 0->1 = 30, 0->2=100, 0->3=250)
$xp_array = array(30, 100, 250, 430, 673, 1000);

$max_level        = count($xp_array);
$max_level_xp     = $xp_array[$max_level-1];
$i                = 0;

if ($huidig_xp < $max_level_xp){

    foreach($xp_array as $xp_deze_level) {

        if ($huidig_xp < $xp_deze_level){

            $xp_nodig_deze_level     = $xp_deze_level - $huidig_xp;
            $xp_volgende_level        = $xp_array[$i];

            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;
            
            break;
            
        }

        
        $i++;
    }

}
else {
    echo'Max level('.$max_level.') bereikt, huidig xp '.$huidig_xp;
}

?>


en de output van het script:
Quote:
- algemene informatie:
Ben level 3
Volgende level is 4
Xp nog nodig deze level 25
Totaal xp nodig deze level 430

Level 3 | Xp 405/430

- max bereikt:
Max level(6) bereikt, huidig xp 1172
 
Thomas van den Heuvel

Thomas van den Heuvel

07/08/2015 15:33:42
Quote Anchor link
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.
 
Jeroen germers

jeroen germers

07/08/2015 17:21:40
Quote Anchor link
Quote:
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?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.