T: / Corrigés des challenges / PHP
Un bon exercice pour mettre en pratique les principes de la POO.
La plupart des challenges de Tainix peuvent être réalisés en créant un seul programme. Créer des classes n’est pas obligatoire. Mais Tainix, c’est aussi l’occasion de s’entrainer ! Illustration ici avec un challenge débutant que l’on va résoudre grâce à la Programmation Orientée Objet (POO) en PHP.
$reponse = '';
$ennemisDetails = [];
foreach ($ennemis as $ennemi) {
[$position, $pv] = sscanf($ennemi, 'x:%d pv:%d');
$ennemisDetails[$position] = $pv;
}
ksort($ennemisDetails);
$batmobile = 0;
foreach ($ennemisDetails as $position => $pv) {
$nbDeplacements = ($position - $batmobile);
$reponsereponse .= str_repeat('D', $nbDeplacements);
$batmobile = $position;
$nbFire = ceil($pv / 10);
$reponse .= str_repeat('F', $nbFire);
}
Explications
final class Enemy
{
private int $position;
private int $pv;
public function __construct(string $informations)
{
[$this->position, $this->pv] = sscanf($informations, 'x:%d pv:%d');
}
public function getPosition(): int
{
return $this->position;
}
public function getPv(): int
{
return $this->pv;
}
}
final class Enemies
{
private array $enemies;
public function __construct(array $informations)
{
foreach ($informations as $enemy) {
$this->enemies[] = new Enemy($enemy);
}
usort($this->enemies, [$this, 'sortEnemis']);
}
public function sortEnemis(Enemy $e1, Enemy $e2): int
{
return ($e1->getPosition() < $e2->getPosition()) ? -1 : 1;
}
public function getEnemies(): array
{
return $this->enemies;
}
}
final class Batmobile
{
private const INSTRUCTION_MOVE = 'D';
private const INSTRUCTION_FIRE = 'F';
private const POWER_FIRE = 10;
private $position = 0;
public function getInstructionsToMove(int $position): string
{
$distance = $position - $this->position;
$this->move($distance);
return str_repeat(
self::INSTRUCTION_MOVE,
$distance
);
}
private function move(int $distance): void
{
$this->position += $distance;
}
public function getInstructionsToFire(int $pv): string
{
return str_repeat(
self::INSTRUCTION_FIRE,
ceil($pv / self::POWER_FIRE)
);
}
}
Explications
Je crée 3 classes :
$reponse = '';
$batmobile = new Batmobile;
$enemies = new Enemies($data['ennemis']);
foreach ($enemies->getEnemies() as $enemy) {
$reponse .= $batmobile->getInstructionsToMove($enemy->getPosition());
$reponse .= $batmobile->getInstructionsToFire($enemy->getPv());
}
echo $reponse;
D’autres techniques de parsing en PHP
D’autres challenges Débutant qui se prêtent bien à la programmation orientée objet :
Et n’hésite pas à parcourir nos différents corrigés pour retrouver d’autres exemples de classes PHP.
Other content to discover