À temps perdu, j'ai le goût d'essayer de programmer un petit jeu de simulation de combat. Juste pour faire différent du type de programmation que je fais dans mon quotidien (systèmes de gestion web-based). Mon idée est de présenter étape par étape la réalisation du projet et d'essayer de le faire évoluer pour y ajouter des caractéristiques supplémentaires. Vous devrez donc vous attendre à voir ici le début d'une série de billets sur le sujet (regroupés sous la catégorie Jeu de combat).
Comme j'utilise PHP, vous comprendrez que je suis loin de l'étape du visuel. Ce qui m'intéresse est la logique, le backend. Donc ce sera 100% en mode texte.
La toute première chose à faire, c'est de démarrer une classe qui permettra d'instancier des combattants.
Les pré-requis :
- Elle contiendra au minimum deux propriétés : le nom du joueur et le nombre de points de vie. Il n'en faut pas plus pour initier un combat entre deux personnes.
- Le constructeur de la classe décidera aléatoirement du nombre de points de vie. Disons entre 50 et 100.
- Il faudra une méthode pour assener un coup (hit), dont la force sera déterminée aléatoirement (la blessure soutirera entre 1 et 10 points à l'adversaire)
- Une méthode pour encaisser une blessure qui réduira le nombre de points de vie du joueur
- Une dernière méthode pour savoir si ça vaut vraiment la peine de continuer à s'acharner sur quelqu'un d'inconscient (isKnockOut)
fighter.php
class Fighter{Remarquez que la méthode hit() reçoit en paramètre un objet Fighter.
private $_name;
private $_hp; // hit points
public function __construct($name){
$this->_name = $name;
$this->_hp = rand(50,100);
}
public function getName(){ return $this->_name; }
public function getHP(){ return $this->_hp; }
public function hit(Fighter $fighter){
$damage = rand(1,10);
$fighter->setDamage($damage);
return $damage;
}
public function setDamage($hp){
$this->_hp -= $hp;
}
public function isKnockOut(){
return $this->_hp <= 0 ? true : false;
}
}
Ensuite, on peut créer deux instances qui s'affronteront :
arene.php
// note: ajoutez les sauts de lignes aux endroits requisAvec ce petit script, vous pouvez simuler un combat aléatoire simpliste entre deux adversaires et suivre le déroulement étape par étape. Dans les articles à venir prochainement, je vous montrerai :
// l'éditeur de Blogger semble ne pas les aimer dans mon code source!
require_once('fighter.php');
$player1 = new Fighter('Code 18');
$player2 = new Fighter('Infinite Loop');
// on affiche leurs caractéristiques
echo $player1->getName() . ' has ' . $player1->getHP() . ' HP';
echo $player2->getName() . ' has ' . $player2->getHP() . ' HP';
echo '<h3>--- Fight! ---</h3>';
// créer la liste des combattants
$fightersList = array($player1, $player2);
// tant que les deux sont en vie, on poursuit le combat
while( !( $player1->isKnockOut() || $player2->isKnockOut() ) ){
// le hasard fait que un ou l'autre porte un coup
list($attacker, $defender) = array_rand($fightersList, 2);
// celui qui a été désigné comme l'attaquant donne un coup
$damage = $fightersList[$attacker]->hit($fightersList[$defender]);
// quel dommage a-t-il fait ?
echo $fightersList[$attacker]->getName() . ' hits ' . $damage . ' HP';
// si le combattant attaqué est KO, le combat est terminé
if( $fightersList[$defender]->isKnockOut() ){
echo '<strong>' . $fightersList[$defender]->getName() . ' is KNOCK OUT</strong>';
}
}
echo '<strong>THE WINNER IS : ' . $winner->getName() . '</strong>'
- comment un combattant peut esquiver ou bloquer un coup
- comment chaque joueur peut appliquer un facteur de force personnalisé
- comment effectuer un combat avec plus de deux joueurs (du type royal rumble)