JeuWeb - Crée ton jeu par navigateur
Eviter de définir des coûts par niveau - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Eviter de définir des coûts par niveau (/showthread.php?tid=474)



Eviter de définir des coûts par niveau - barst - 22-11-2006

Dans mon projet, il y a des bâtiments qui coûtent un certain nombre de ressource.
Je peux également augmenter le niveau de ce bâtiment.

Pour définir les coûts du bâtiment par niveau, je me suis retrouvé confronté à plusieurs problèmes :
- fallait-il définir les coûts pour chaque niveau ?
- fallait-il avoir un nombre limité ou illimité de niveau ?

Je voulais avoir un nombre illimité de niveau mais du coup je ne pouvais plus définir les coûts par niveau ceux-ci étant virtuellement infinis.

Il fallait donc qu'il y ait une formule de calcul pour calculer les coûts d'un niveau à l'autre.

Ceci supposait donc que je doivent personnaliser ces formules pour chaque bâtiment, or je voulais avoir un seul objet générique pour tous les bâtiments.
Il falait donc stocker en base ces informations :
- le coût du niveau 1
- la formule de transformation pour passer au niveau N+1

Voici une fonction qui fait ceci :
Code PHP :
<?php 
// $value = valeur du niveau N
// $form = formule mathématique pour passer au niveau N+1
// $level =
function evalMath($value,$form,$level)
{
//initialisation de la valeur retour
$res=0;
//on remplace dans la formule les valeurs de $value et $form
// par les valeurs réelles
$form = str_replace('$value',$value,$form);
$form = str_replace('$level',$level,$form);
//utilisation de eval pour résoudre l'operation
//utilisation d'un floor pour arrondir
eval("\$res = floor(($form)+0.5);");
return
$res;
}

Et voici une fonction qui me retourne un coût pour le niveau souhaité
Code PHP :
<?php 
// $build_id = identifiant du bâtiment
// $level = le niveau pour elquel on recherche le coût
function getCostByLevel($build_id,$level=1)
{
if(
1==$level)
{
//normalement je fais une requête en base pour obtenir le coût
//pour cet exemple je les stocke en dur
if(1==$build_id) $row=array('FER'=>50,'OR'=>20);
else
$row=array('FER'=>20,'OR'=>50);
return
$row;
}
else
{
//un petit peu de récursivité....
$cost=getCostByLevel($build_id,($level-1));
//normalement je fais une requête pour récupérer la formule stocker enn base
// la formule peut stocker des variables comme $value et $level
if(1==$build_id) $form=array('FER'=>'$value*1.5','OR'=>'$value*2');
else
$form=array('FER'=>'$value','OR'=>'$value');
//on applique pour chaque coût la formule de transformation
for($i=0;$i<5;$i++) $cost[$i] = evalMath($cost[$i],$form[$i],$level);
return
$cost;
}
}



Pour finir voici un petit exemple complet à copier-coller et à exécuter pour voir ce qu'il est possible de faire

Code PHP :
<?php
// $value = valeur du niveau N
// $form = formule mathématique pour passer au niveau N+1
// $level = niveau en cours de calcul
function evalMath($value,$form,$level)
{
//initialisation de la valeur retour
$res=0;
//on remplace dans la formule les valeurs de $value et $form
// par les valeurs réelles
$form = str_replace('$value',$value,$form);
$form = str_replace('$level',$level,$form);
//utilisation de eval pour résoudre l'operation
//utilisation d'un floor pour arrondir
eval("\$res = floor($form);");
return
$res;
}

// $build_id = identifiant du bâtiment
// $level = le niveau pour elquel on recherche le coût
function getCostByLevel($build_id,$level=1)
{
if(
1==$level)
{
//normalement je fais une requête en base pour obtenir le coût
//pour cet exemple je les stocke en dur
if(1==$build_id) $row=array('FER'=>50,'OR'=>20);
else
$row=array('FER'=>20,'OR'=>50);
return
$row;
}
else
{
//un petit peu de récursivité....
$cost=getCostByLevel($build_id,($level-1));
//normalement je fais une requête pour récupérer la formule stocker enn base
// la formule peut stocker des variables comme $value et $level
if(1==$build_id) $form=array('FER'=>'$value*1.5','OR'=>'$value*2');
else
$form=array('FER'=>'(($level<=5)?$value*2:$value)','OR'=>'(($level>5)?$value*2:$value*1)');
//on applique pour chaque coût la formule de transformation
$cost['FER'] = evalMath($cost['FER'],$form['FER'],$level);
$cost['OR'] = evalMath($cost['OR'],$form['OR'],$level);
return
$cost;
}
}

print
'<h2>Batiment 1 :</h2>Fer augmente de sa moitié à chaque niveau et l\'or double';
print
'<table border="0" cellpadding="0" cellspacing="2" style="background-color:#efefef;">';
print
'<tr><th>Niveau</th><th>Fer</th><th>Or</th></tr>';
for(
$i=1;$i<11;$i++)
{
$a = getCostByLevel(1,$i);
print
'<tr><td style="background-color:#cdcdcd;">'.$i.'</td><td style="background-color:#cdcdcd;">'.$a['FER'].'</td><td style="background-color:#cdcdcd;">'.$a['OR'].'</td></tr>';
}
print
'</table><br /><br />';

print
'<h2>Batiment 2 :</h2>Fer double jusqu\'au niveau 5 puis reste stable et l\'or reste stable jusqu\'au niveau 5 puis double';
print
'<table border="0" cellpadding="0" cellspacing="2" style="background-color:#efefef;">';
print
'<tr><th>Niveau</th><th>Fer</th><th>Or</th></tr>';
for(
$i=1;$i<11;$i++)
{
$a = getCostByLevel(2,$i);
print
'<tr><td style="background-color:#cdcdcd;">'.$i.'</td><td style="background-color:#cdcdcd;">'.$a['FER'].'</td><td style="background-color:#cdcdcd;">'.$a['OR'].'</td></tr>';
}
print
'</table><br /><br />';
?>



RE: Eviter de définir des coûts par niveau - Kevin - 26-12-2006

L'aide pour ce tutoriel ce trouve à cette adresse :
http://www.jeuweb.org/board/showthread.php?tid=849