dimanche 16 mai 2010
Déjà le troisième volet de ce petit jeu de combat aléatoire. Jusqu'à maintenant, nous avons vu :
- comment créer des combattants par programmation
- comment les faire s'affronter entre eux
- ajouter un facteur de force aux coups portés
Comme à l'étape 2, dans la classe Fighter, on ajoutera une nouvelle propriété :
private $_defense;Nous l'initialiserons dans le constructeur :
$this->_defense = rand(1,10);Nous écrirons deux fonctions pour obtenir la valeur de la défense et écraser la valeur déterminée aléatoirement au moment de la création.
public function getDefense(){ return $this->_defense; }Après l'appel au constructeur, libre à vous de forcer les joueurs à avoir une défense particulière :
public function setDefense($defense){
$this->_defense = $defense;
}
$player1->setDefense(1);Ici, le joueur 2 aurait probablement plus de chances de remporter le combat. Je laisse de côté toutes les validations nécessaires mais c'est juste pour dire que dans cet exemple, avec une défense de 16, un joueur serait invincible.
$player2->setDefense(10);
On modifiera la fonction hit() pour tenir compte de la défense du joueur plutôt que de toucher l'adversaire à tout coup.
public function hit(Fighter $fighter){Le dernier changement se fera dans l'arène (arene.php). Il suffit de remplacer la vérification dans la boucle while pour savoir si le coup porté a touché l'adversaire ou s'il l'a raté (ajoutez les <br/> là où c'est nécessaire pour l'affichage).
$damage = 0;
// comme le maximum généré est 10,
// on touche la cible si on obtient entre 10 et 15
$chance = rand(1,15);
if( $chance >= $fighter->getDefense() ){
$damage = rand(1,$this->_force);
$fighter->setDamage($damage);
}
return $damage;
}
if($damage > 0){Enfin, une amélioration possible serait de remplacer les appels directs à rand() en définissant une fonction qui simule le jet de dés. On pourrait générer les propriétés comme dans AD&D où lancer 3 dés à 6 faces qui permet d'avoir un score entre 3 et 18.
echo $fightersList[$attacker]->getName() . ' hits ' . $damage . ' HP on ' . $fightersList[$defender]->getName();
}
else{
echo $fightersList[$attacker]->getName() . ' miss ' . $fightersList[$defender]->getName();
}
public function rollDice($roll = 1, $faces = 6){Ceci conclut cette 3ème étape. Vous pouvez maintenant tester le tout. N'oubliez pas que si vous désirez obtenir le code source de ces exercices, vous pouvez m'en faire la demande par courriel.
return rand($roll, $roll * $faces);
}
echo $this->rollDice(3, 6);