20-07-2010, 02:28 PM
Pour tuer les soldat d'un array/d'une structure, j'utilise une méthode "repartiDegats()" qui est appelée par l'objet 'armee' sur les divisions de mon armée (chaque division est composée d'un seul type de combattant).
Pour faire simple, dans la méthode appelante (armée), je parcours mon armée (array) composée de division et je leur donne les dégâts (intégraux ou restant d'une répartition précédente).
Pour faire simple, dans la méthode appelante (armée), je parcours mon armée (array) composée de division et je leur donne les dégâts (intégraux ou restant d'une répartition précédente).
Code PHP :
<?php
/**
* $degats -> les dégâts à répartir venant d'une autre méthode (publique celle-là)
* $adversaire -> l'armée sur laquelle taper ;-)
* &$rapport -> le pointeur référence du rapport
*/
private function repartiDegats($degats,$adversaire,&$rapport) {
$oArmee = $adversaire -> getArmee(); // Composée de divisions
//...du code inutile pour l'exemple (des tests)
foreach ($oArmee AS $oDivision) {
if ($degats > 0) {
$degats = $oDivision -> repartiDegats($degats);
}
}
//...
}
Et dans la division, même topo avec les unités de cette dernière.
Code PHP :
<?php
/**
* _listeUnites -> la composition de la division avec des objets Unites
* _unitesMortes -> cqfd pour debug et statistiques de fin de combat
*
*/
public function repartiDegats($degats) {
if (!empty($this -> _listeUnites)) {
foreach ($this -> _listeUnites AS $oUnite) {
if ($degats >= $oUnite -> getDefense()) {
$degats -= $oUnite -> getDefense(); //dégâts restant à répartir
$oUnite -> setDefense(0); //Plus d'armure pour l'unité
if ($degats >=$oUnite -> getPdv()) {
$this -> _unitesMortes += 1;
//on retranche la vie de l'unité des dégâts
$_degats -= $oUnite -> getPdv();
//Suppression de l'unité détruite
if (sizeof($this -> _listeUnites) == 1) {
unset($this -> _listeUnites[0]);
} else {
unset($this -> _listeUnites[key($this -> _listeUnites)]);
}
} else {
$oUnite -> setPdv(($oUnite -> getPdv() - $degats));
$degats = 0;
}
} else {
$oUnite -> setDefense(($oUnite -> getDefense() - $degats));
$degats = 0;
break; //pas besoin de parcourir le reste de la liste
}
}
}
return $degats;
}