Ça fait déjà un mois que je n'ai pas retouché mon script de générateur de combat aléatoire. La dernière fois, j'avais lancé l'idée de modifier le programme de façon à faire s'affronter deux armées plutôt que deux combattants. Autrement dit, il faudra maintenir deux listes de combattants, déterminer au hasard quelle armée et quel combattant sera l'attaquant et l'attaqué, dans un combat à mort qui n'aura pas de lendemain.
Pour ce faire, nous allons tenter de recréer les forces qui opposeront l'Alliance rebelle et l'armée Impériale de Star Wars et laisser le hasard déterminer le vainqueur (pour le meilleur et pour le pire).
Source de la photo
Pour poursuivre mon exemple, j'ai récupéré là où j'étais rendu à l'étape précédente. Aucun changement ne sera nécessaire pour le moment dans la classe Fighter; tout ce qu'il y aura à modifier sera dans le fichier d'arène que j'ai renommé pour l'occasion champ-de-bataille.php.
Le contenu du script PHP :
require_once('classes/fighter.php');Si vous souhaitez voir les caractéristiques des combattants créés par le programme, vous pouvez décommenter cette section :
# constante pour indiquer le nombre de combattants de chaque côté (forces égales)
DEFINE('NB_FIGHTERS', 250);
# noms des armées (pour affichage)
$armyNames = array('Alliance rebelle', 'Armée impériale');
# listes qui accueilleront les combattants
$armyRebelAlliance = array();
$armyImperial = array();
# générer les combattants de chaque armée (à forces égales)
for($i=1 ; $i<=NB_FIGHTERS ; $i++){
$armyRebelAlliance[] = new Fighter('Rebel # ' . $i);
$armyImperial[] = new Fighter('Stormtrooper # ' . $i);
}
/*Le combat peut commencer...
echo '<h3>Alliance rebelle</h3>';
foreach($armyRebelAlliance as $fighter){
echo $fighter->getName() . ' : ' . $fighter->getHP() . ' HP, Force ' . $fighter->getForce() . ', Defense ' . $fighter->getDefense() . "\n";
}
echo '<h3>Armée impériale</h3>';
foreach($armyImperial as $fighter){
echo $fighter->getName() . ' : ' . $fighter->getHP() . ' HP, Force ' . $fighter->getForce() . ', Defense ' . $fighter->getDefense() . "\n";
}
*/
echo '<h3>Fight!</h3>';Ensuite on affiche le gagnant et la liste des survivants :
$armies = array();
$armies[] = $armyRebelAlliance;
$armies[] = $armyImperial;
$fightersLeft = array();
$fightersLeft[] = count($armyRebelAlliance);
$fightersLeft[] = count($armyImperial);
while( $fightersLeft[0] > 0 && $fightersLeft[1] > 0 ){
# déterminer quelle armée attaquera et se défendra
list($armyAttacker, $armyDefender) = array_rand($armies, 2);
shuffle($armies[$armyAttacker]);
shuffle($armies[$armyDefender]);
$attacker = array_rand($armies[$armyAttacker]);
$defender = array_rand($armies[$armyDefender]);
$damage = $armies[$armyAttacker][$attacker]->hit($armies[$armyDefender][$defender]);
/*
if($damage > 0){
echo $armies[$armyAttacker][$attacker]->getName() . ' hits ' . $damage . ' HP on ' . $armies[$armyDefender][$defender]->getName() . "\n";
}
else{
echo $armies[$armyAttacker][$attacker]->getName() . ' miss ' . $armies[$armyDefender][$defender]->getName() . "\n";
}
*/
if( $armies[$armyDefender][$defender]->isKnockOut() ){
#echo '<strong>' . $armies[$armyDefender][$defender]->getName() . ' is KNOCK OUT</strong' . "\n";
// retirer le perdant de la liste des combattants
unset($armies[$armyDefender][$defender]);
$fightersLeft[$armyDefender]--;
}
if($fightersLeft[$armyDefender] == 0){
$armyWinner = $armyAttacker;
}
}
echo '<h3>Gagnant</h3>';Maintenant vous êtes prêts à simuler le combat entre les deux armées rivales. Est-ce que ce sera un massacre ? Pesez sur le bouton et constatez le par vous-même (et si le résultat ne fait pas votre affaire, rafraîchissez la page).
echo $armyNames[$armyWinner];
echo '<h3>Survivants</h3>';
echo 'Alliance rebelle : ' . $fightersLeft[0] . "\n";
echo 'Armée impériale : ' . $fightersLeft[1] . "\n";
echo '<h3>Liste des survivants</h3>';
foreach($armies[$armyWinner] as $survivor){
echo $survivor->getName() . ' with ' . $survivor->getHP() . ' HP left' . "\n";
}