IF... vereinfachen aber wie? Ansatz benötigt

spikaner

Quereinsteiger @ php
Ich prog mom an nen kleinen Browsergame um PHP besser zu lernen und besser zu verstehen, nun grüble ich an einer IF um die Erfahrungspunke in Level umzurechnen
PHP:
If($_SESSION["user_erfahrung"] > 10 and $_SESSION['user_level'] == 1)
{
    $_SESSION["user_level"] = 2;
    $sql_query_string = "UPDATE benutzerdaten SET level = '".$_SESSION['user_level']."' WHERE Id = '".$_SESSION['user_id']."'";
    mysql_query($sql_query_string) or die('query fehlgeschlagen');
}
so nun will ich aber nicht 100 If abragen nacheinander schalten und zusätzlich soll von level 1 - 5 jeweils 10 Erfahrungspunkte, von 5 - 10 20 Erfahrungspunkte 10 - 15 40 usw. benötigt werden.
Sprich um Level 14 zu erreichen benötigt man 310 Punkte.

Wie setze ich das am dümmsten um?

mfg Spikaner
 
Du brauchst dafür gar kein IF

Lass es MySQL direkt selber entscheiden, kostet Dich noch nicht mal performance wenn die Indexe passen.

PHP:
<?
$ue=$_SESSION["user_erfahrung"];
$sql_query_string = "UPDATE benutzerdaten SET level = level +1 WHERE Id = '".$_SESSION['user_id']."' and ((level BETWEEN 1 AND 5 and $ue > 10) OR (level BETWEEN 6 AND 10 and $ue > 20) OR (level BETWEEN 11 AND 15 and $ue > 40))"; 
?>
 
Zuletzt bearbeitet:
In den Fall schon denke ich mal da ich ja gleichzeitig die $_SESSION["user_level"] ändern möchte und auch gleich ausgeben will.
und
Level 14 = 310 - 350 Punkte
Passt ja dann auch net oder ?

Ausserdem soll das ganze ja ins "Endlos" gehen sprich alle 5 level werden jeweils 10 Erfahrungspunkte mehr benötigt.

mfg Spikaner
 
Ok dann nimm diese Query:

PHP:
<?
$ue=$_SESSION["user_erfahrung"];
$sql_query_string = "UPDATE benutzerdaten SET level = level +1 WHERE Id = '".$_SESSION['user_id']."' and $ue >= ((floor((level-1)*2 / 10)+1)*10)"; 
if (mysql_query($sql_query_string))
{
	if (mysql_affected_rows() == 1)
	{
		$_SESSION["user_level"] = $_SESSION["user_level"]+1;
		$_SESSION["user_erfahrung"]=0;
	}
}

?>

select ((floor((5-1)*2 / 10)+1)*10); (Level 5 braucht 10 UE für level 6)
select ((floor((12-1)*2 / 10)+1)*10); (Level 12 braucht 30 UE für level 13)
select ((floor((67-1)*2 / 10)+1)*10); (Level 67 braucht 140 UE für level 68)
 
Zuletzt bearbeitet:
Ahh schwerer denkfehler (meinerseits) ich brauche das genau umgekehrt.
Sprich anhand der Erfahrungspunkte soll das Level berechnet werden. wie stell ich das an

mfg Spikaner
 
Na dann probier mal das:

PHP:
<?
$ue=$_SESSION["user_erfahrung"];
$rest=$ue;
$i=0;
while ($rest > 0)
{
    $check=((floor(($i)*2 / 10)+1)*10);
    if ($ue >= $check)
    {
        if ($rest < $check)
        {
            break;
        }
        $rest=$rest-$check;
        $i++;
    }
}
$level=$i;
?>
 
Thx funktioniert soweit.

Edit: Leider doch nicht, das Script bringt den Browser zum "hängenbleiben", hier der ausschnitt um den es geht.
PHP:
$ue=$_SESSION["user_erfahrung"];
$rest=$ue;
$i=0;
while ($rest > 0)
{
    $check=((floor(($i)*2 / 10)+1)*10);
    if ($ue >= $check)
    {
        if ($rest < $check)
        {
            break;
        }
        $rest=$rest-$check;
        $i++;
    }
}
$level = $i;
If($level > $_SESSION["user_level"])
{
    $_SESSION["user_level"] = $level;
    $sql_query_string = "UPDATE benutzerdaten SET level = '".$_SESSION['user_level']."' WHERE Id = '".$_SESSION['user_id']."'";
    mysql_query($sql_query_string) or die('query fehlgeschlagen');
}

mfg Spikaner
 
Zuletzt bearbeitet:
So, bei Zahlen $ue größer 100 funktioniert es wiso aber nicht bei kleineren Zahlen, da bleibt der Browser einfach "hängen" und rechnet sich ins "nirvana".

mfg Spikaner

Edit: Siehe nächster Post.
 
Zuletzt bearbeitet:
Nach langen "herumspielen", kann ich nun den Fehler lokalisieren.
das Script funktioniert ansich ausser bei der Zahl 9 (getestet von 1 - 100)
$ue = 9; läuft der Browser ins "Nirvana"
Wie kann ich das Beheben ?
PHP:
<?php
$ue=9;
$reste=$ue;
$o=0;
while ($reste > 0)
{
    $check=((floor(($o)*2 / 10)+1)*10);
    if ($ue >= $check)
    {
        if ($reste < $check)
        {
            break;
        }
        $reste = $reste - $check;
        $o++;
    }
}
$level = $o;
echo $level;
?>

mfg Spikaner
 
Code:
<?php
$ue=9;
$reste=$ue;
$o=0;
while ($reste > 0)
{
    $check=((floor(($o)*2 / 10)+1)*10);
    if ($ue >= $check)
    {
        if ($reste < $check)
        {
            break;
        }
        $reste = $reste - $check;
        $o++;
    }
    else
    {
        break;
    }
}
$level = $o;
echo $level;
?>
 
Zurück