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 ?

6 réponses


Glioburd
Réponse acceptée

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/>";        
    }

}

Up, je n'ai toujours pas trouvé comment faire

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/>"; 
        }

    }

}