Je reprend actuellement le développement d'un de mes ancien site de jeux par navigateur web (www.haishin.fr),
et je suis actuellement bloqué sur l'implémentation du système de combat.
Je souhaitais le faire en C/C++ mais mon hébergeur n'autorise pas les commandes exec(),shell_exec(), etc.. je me suis donc tourné vers PHP
J'ai donc commencer une partie du script qui gére aléatoirement la rencontre d'un "Monstre" inscrit dans la DB suivit de 2 options : Combattre ou fuir.
Une fois l'options combattre chosi, le combat se lance, je récupere l"atk" de l'attaquant et la "def" du defenseur selon le tours et applique les dommages, et ce jusqu'à ce que l'un des deux aient des points de vie <= 0. seulement avec le temps j'ai changé d'avis et je souhaite maintenant du tours par tours. je m'explique :
Je souhaite choisir l'option combattre ou fuir. une fois l'options combattre chosie alors :
1er tours Le joueur attaque le monstre,le monstre attaque le joueur.
si 1 des deux pdv <= 0 alors END,
Sinon 2eme tours le joueur RE CHOISI ATTAQUER OU FUIR, le monstre attaque.
etc..
voici le code actuelle :
(petite précision je travaille avec l'outil de template Smarty.)
page de lancement du combat (generation aleatoire d'un monstre)
{if $combat eq ''}
<p>You've encountered a {$monster}!</p>
<form action='forest.php' method='post'>
<input type='submit' name='action' value='Attack' /> or
<input type='submit' name='action' value='Run Away' />
<input type='hidden' name='monster' value='{$monster}' />
</form>
{else}
<ul>
{foreach from=$combat key=id item=i}
<li><strong>{$i.attacker}</strong> attacks {$i.defender} for {$i.damage} damage!</li>
{/foreach}
</ul>
{if $won eq 1}
<p>You killed <strong>{$smarty.post.monster}</strong>! You gained <strong>{$earngold}</strong> gold.</p>
<p><a href='forest.php'>Explore Again</a></p>
{/if}
{if $lost eq 1}
<p>You were killed by <strong>{$smarty.post.monster}</strong>.</p>
{/if}
<p><a href='index.php'>Back to main</a></p>
{/if}
code php
if($_POST) {
if($_POST['action'] == 'Attack') {
$query = sprintf("SELECT id FROM users WHERE UPPER(username) = UPPER('%s')",
mysql_real_escape_string($_SESSION['username']));
$result = mysql_query($query);
list($userID) = mysql_fetch_row($result);
$player = array (
name => $_SESSION['username'],
attack => getStat('atk',$userID),
defence => getStat('def',$userID),
curhp => getStat('curhp',$userID)
);
$query = sprintf("SELECT id FROM monsters WHERE name = '%s'",
mysql_real_escape_string($_POST['monster']));
$result = mysql_query($query);
list($monsterID) = mysql_fetch_row($result);
$monster = array (
name => $_POST['monster'],
attack => getMonsterStat('atk',$monsterID),
defence => getMonsterStat('def',$monsterID),
curhp => getMonsterStat('maxhp',$monsterID)
);
$combat = array();
$turns = 0;
while($player['curhp'] > 0 && $monster['curhp'] > 0) {
if($turns % 2 != 0) {
$attacker = &$monster;
$defender = &$player;
} else {
$attacker = &$player;
$defender = &$monster;
}
$damage = 0;
if($attacker['attack'] > $defender['defence']) {
$damage = $attacker['attack'] - $defender['defence'];
}
$defender['curhp'] -= $damage;
$combat[$turns] = array(
attacker => $attacker['name'],
defender => $defender['name'],
damage => $damage
);
$turns++;
}
setStat('curhp',$userID,$player['curhp']);
if($player['curhp'] > 0) {
// player won
setStat('gc',$userID,getStat('gc',$userID)+getMonsterStat('gc',$monsterID));
$smarty->assign('won',1);
$smarty->assign('earngold',getMonsterStat('gc',$monsterID));
$smarty->assign('gold',getStat('gc',$userID));
} else {
// monster won
$smarty->assign('lost',1);
}
$smarty->assign('combat',$combat);
} else {
// Running away!
header('Location: index.php');
}
} else {
$query = sprintf("SELECT name FROM monsters ORDER BY RAND() LIMIT 1");
$result = mysql_query($query);
list($monster) = mysql_fetch_row($result);
$smarty->assign('monster',$monster);
}
voila pour être clair je bloque ici , exemple concret :Toi (100 points de vie) - Monstre (10pdv)
Attaque ? fuir ? (action de l'utilisateur)
et puis cette page s'affiche ( le resultat du combat )
Toi attaque monstre pour 5 degats,
Monstre attaque toi pour 2 degats,
Toi attaque Monstre pour 5 degats,
Monstre est mort, tu a gagner.
or je voudrais qu'à chaque fin de 'round' l'utilisateur re-choisi d'attaquer ou fuir :/
un peut comme ça :
Toi (100 points de vie) - Monstre (10pdv)
Attaque ? fuir ? (action de l'utilisateur)
Toi attaque monstre pour 5 degats,
Monstre attaque toi pour 2 degats,
Attaque ? fuir ? (action de l'utilisateur)
Toi attaque Monstre pour 2 degats,
Monstre attaque toi pour 1 degat,
Attaque ? fuir ? (action de l'utilisateur)
Toi attaque Monstre pour 3 degats,
Monstre est mort, tu a gagner.