Bonjour, je me suis lancé dans le projet de créer un text-based RPG et j'aimerais réaliser un système de combat dans ce style la :
Tant que ma vie est au dessus de 0 OU la vie du monstre est en dessus de 0 :
J'attaque le monstre avec mon $atk
Le monstre m'attaque avec son $atk_monster
Le problème est que je ne vois pas trop comment faire étant donné que ça veut dire accéder à une variable en dehors d'une loop.
for ($i=0; $i < $mavie; $i++) {
// Attaque du monstre
$attackdealedbymonster = $i;
$mavie = $player->life - $atkmonstre;
// Mes Attaque (...)
}
Damage dealed by <?php echo $monstre; ?> : <?php echo $attackdealedbymonster; ?>
Des pistes ?
Salut, y a pas de problème à accéder à une variable en dehors d'une loop.
Je ne comprends pas cette partie là :
$attackdealedbymonster = $i;
Si $attackdealedbymonster
est censé representer les dégats finaux infligés par le monstre, pourquoi la réinitialiser à chaque itération sur l'incrémenteur ? D'ailleurs à quoi te sert l'incrémenteur ?
Autre chose : t'es sûr que la condition du déroulement du combat est OU au lieu de ET ?
Dans le cas de OU : le combat se continuera tant que les deux adversaires ne seront pas morts : puisqu'au premier mort, l'un des deux aura toujours sa vie > 0.
Mettons une classe de Personnage qu'on instanciera :
class Character
{
public $life = 100; // Valeur par défaut
public $damage = 0; // Valeur par défaut
public $name = "Anonyme"; // Valeur par défaut
public function __construct(int $life, int $damage, string $name)
{
$this->life = $life;
$this->damage = $damage;
$this->name = $name;
}
public function isAlive()
{
return $this->life > 0;
}
}
// Gilles Le Malade : 100 de vie, 5 de dégats
$player = new Character(
100,
5,
"Gilles le héros"
);
// Roger le monstre : 150 de vie, 3 de dégats
$monster = new Character(
150,
3,
"Roger le monstre"
);
La bagarre : (je met des echo
pendant les tours pour bien visualiser ce qu'il s'y passe)
$damageDealedByMonster = 0;
$damageDealedByplayer = 0;
while ($player->isAlive() && $monster->isAlive())
{
// Tour du monstre
echo "Le monstre inflige {$monster->damage} de dégats au joueur. <br/>";
$player->life -= $monster->damage;
$damageDealedByMonster += $monster->damage;
echo "Vie du joueur : {$player->life} <br/>";
// Tour du joueur
echo "Le joueur inflige {$player->damage} de dégats au monstre. <br/>";
$monster->life -= $player->damage;
$damageDealedByplayer += $player->damage;
echo "Vie du monstre : {$monster->life} <br/>";
}
$winner = $player->isAlive() ? $player : $monster;
?>
<p>Le gagnant est <?= $winner->name ?> !</p>
<p>
Dégats infligés par <?= $monster->name ?> : <strong><?= $damageDealedByMonster ?></strong> <br/>
Dégats infligés par <?= $player->name ?> : <strong><?= $damageDealedByplayer ?></strong>
</p>
Le combat s'arrête au premier mort. Si c'est bien ce que tu cherchais à faire.
Bonjour, effectivement, je n'avais pas pensé au reset de la variable ><
Merci à toi, effectivement, c'est une bonne idée !
Comment pourrais je faire en sorte que ça évite de faire ça ? :
Head ! ***** starts
***** dealed 36 damages to Burned Slime.
Burned Slime's health' : -19
Burned Slime dealed 7 damages to *****.
*****'s health' : 48
Malgré qu'il soit tué au premier tour, l'ennemi joue quand même son tour.
$tourrandom = rand(1,2);
if ($tourrandom == 1) {
echo "<i>Tail ! ".$_GET['monster']." starts</i>";
echo "<br>";
}
elseif ($tourrandom == 2) {
echo "<i>Head ! ".$_SESSION['name']." starts</i>";
echo "<br>";
}
while ($moi->isAlive() && $monster->isAlive())
{
// Randomize qui commence en premier
if ($tourrandom == 1) {
// Tour du monstre
echo $_GET['monster']." dealed {$monster->damage} damages to ".$_SESSION['name'].". <br/>";
$moi->life -= $monster->damage;
$damageDealedByMonster += $monster->damage;
echo $_SESSION['name']."'s health : {$moi->life} <br/>";
// Tour du joueur
echo $_SESSION['name']." dealed {$moi->damage} damages to ".$_GET['monster'].". <br/>";
$monster->life -= $moi->damage;
$damageDealedByplayer += $moi->damage;
echo $_GET['monster']." 's health: {$monster->life} <br/>";
}
elseif ($tourrandom == 2) {
// Tour du joueur
echo $_SESSION['name']." dealed {$moi->damage} damages to ".$_GET['monster'].". <br/>";
$monster->life -= $moi->damage;
$damageDealedByplayer += $moi->damage;
echo $_GET['monster']."'s health' : {$monster->life} <br/>";
// Tour du monstre
echo $_GET['monster']." dealed {$monster->damage} damages to ".$_SESSION['name'].". <br/>";
$moi->life -= $monster->damage;
$damageDealedByMonster += $monster->damage;
echo$_SESSION['name']."'s health' : {$moi->life} <br/>";
}
}
Je pense que tu devrait essayer comme ca pour voir...
met un if($moi->isAlive()) dans ton if($tourrandom == 1) apres que ton monstre a attaquer et et inversement quand c'est toi qui attaque en premier.
Effectivement, ça fonctionne bien, merci à toi !
while ($moi->isAlive() && $monster->isAlive())
{
// Randomize qui commence en premier
if ($tourrandom == 1) {
// Tour du monstre
echo $_GET['monster']." dealed {$monster->damage} damages to ".$_SESSION['name'].". <br/>";
$moi->life -= $monster->damage;
$damageDealedByMonster += $monster->damage;
echo $_SESSION['name']."'s health : {$moi->life} <br/>";
if ($moi->isAlive())
{
// Tour du joueur
echo $_SESSION['name']." dealed {$moi->damage} damages to ".$_GET['monster'].". <br/>";
$monster->life -= $moi->damage;
$damageDealedByplayer += $moi->damage;
echo $_GET['monster']." 's health: {$monster->life} <br/>";
}
}
elseif ($tourrandom == 2) {
// Tour du joueur
echo $_SESSION['name']." dealed {$moi->damage} damages to ".$_GET['monster'].". <br/>";
$monster->life -= $moi->damage;
$damageDealedByplayer += $moi->damage;
echo $_GET['monster']."'s health' : {$monster->life} <br/>";
if ($monster->isAlive())
{
// Tour du monstre
echo $_GET['monster']." dealed {$monster->damage} damages to ".$_SESSION['name'].". <br/>";
$moi->life -= $monster->damage;
$damageDealedByMonster += $monster->damage;
echo$_SESSION['name']."'s health' : {$moi->life} <br/>";
}
}
}