Votre but est de développer un simulateur de combat entre 2 joueurs.
Vous devez travailler dans le repertoire src/.
La classe Game est le point d'entré d'une partie.
Le jeu se lance en console, via des tests unitaires.
php bin/kahlan
git clone https://github.com/balabfr/phpfightgame.git
cd phpfinghtgame
composer install
La classe Game s'initialise avec une chaine de caractères.
Cette chaine comporte les informations des deux joueurs, sur 2 lignes formatées comme suit:
<Nom 1> <point de vie> <attaque> <défense>
<Nom 2> <point de vie> <attaque> <défense>
exemple:
Bob 30 7 4
Alice 20 9 2
La méthode Game->run() est appelée une seul fois pour lancer l'intégralité du combat.
A chaque tour,
le joueur 1 attaque le joueur 2. Puis le joueur 2 attaque le joueur 1,
Suivant la formule: pv_j1 = pv_j1 - (attaque_j2 - def_j1)
Vous devez afficher les points de vie de chacun, formaté comme suit:
<vie joueur 1> <vie joueur 2>
Lorsque l'un des joueurs n'a plus de vie, vous devez afficher le nom du gagnant avec ses PV restant.
<nom gagnant> <pv gagnant>
Bob 30 7 4
Alice 20 9 2
25 15
20 10
15 5
Bob 15
Note: Bob n'a pas eu le temps de se faire tapper par Alice. Il reste donc à 15 pv
Vous serez jugé sur votre qualité à produire un code propre, bien structuré, respectant des bonnes pratiques.
Mais aussi, sur votre capacité à créer des objets cohérents et biens nommés, effectuant une tache ou un groupe de taches bien précis.
Tout code redondant est éliminatoire.
Conseils:
- structurez votre solution avec un maximum de classes ( au moins 4)
- s'inspirer d'un model MVC peut être une bonne idée, en prenant Game comme controller
Indice:
- Pas de "print" dans Game
- Notre solution témoin dispose de 8 classes et 1 interface. Epatez nous ;)
Le code qui suit n'est pas fonctionnel et sa qualité n'est pas à prendre en exemple.
Son seul but est de vous aider à mieux appréhender l'exercice.
class Game
{
private $playerA;
private $playerB;
public function __construct($input)
{
$this->playerA = split(" ", split("\n", $input)[0]);
$this->playerB = split(" ", split("\n", $input)[1]);
}
public function run()
{
// Rounds
while ($this->playerA[1] > 0 and $this->playerB[1] > 0) {
$this->playerA[1] -= 10;
$this->playerB[1] -= 10;
print $this->playerA[1] . " " . $this->playerB[1];
}
// End
if ($this->playerA[1] > 0) {
print $this->playerA[0] . " " . $this->playerA[1];
} else {
print $this->playerB[0] . " " . $this->playerB[1];
}
}
}