22-11-2006, 06:01 PM
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 :
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;
}
}