Système de combat ( RPG )

Par ToinouPHP, il y a 5 ans


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, il y a 5 ans

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.

ToinouPHP, il y a 5 ans

Bonjour, effectivement, je n'avais pas pensé au reset de la variable ><
Merci à toi, effectivement, c'est une bonne idée !

ToinouPHP, il y a 5 ans

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/>"; } }
ToinouPHP, il y a 5 ans

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

VertoDebru, il y a 5 ans

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.

ToinouPHP, il y a 5 ans

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