JeuWeb - Crée ton jeu par navigateur
Probleme "OR" dans condition: - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Probleme "OR" dans condition: (/showthread.php?tid=1351)



Probleme "OR" dans condition: - zneman - 17-07-2007

Bonjour.
Alors, voila mon problème, j'explique brièvement:

- Si le joueur défenseur a une fortification plus élevée que la palissade, l'attaquant doit utiliser des armes de siège (logique Tongue). Sinon, si le joueur defenseur n'a qu'une palissade ou, moins qu'une palissade, je compare juste la force des troupes attaquantes et la défense des troupes défensives.

- Si le joueur défenseur a plus qu'une palissade et que l'attaque des armes de siege est supérieur a la défense des fortifications, je passe a la comparaison des troupes (comme si le joueur n'avait pas de fortifications.

Bref... j'espère que cette explication vous met dans le sujet :/

Mon probleme est le suivant:

Code PHP :
<?php 
elseif(($forti_joueur_def['enceintes'] <= 1) OR ($attaque_armes_de_siege > $defense_fortifications))
{

Donc si le joueur a une défense inférieur a la palissade ou si le joueur a une attaque des armes de siege supérieur a la défense des fortifications ennemie...

Mon code est comme tel:

Code PHP :
<?php 
// Je fais tout mes calculs avant...
/////////////////////////////////////////////////////////////////////////////////////////////
//// TOUR D ATTAQUE NUMERO 1, COMPARAISON DES ARMES DE SIEGE ET DES FORTIFICATIONS //////////
/////////////////////////////////////////////////////////////////////////////////////////////
// Si le joueur defenseur a une fortification plus grande que la palissade //
/////////////////////////////////////////////////////////////////////////////////////////////
if($forti_joueur_def['enceintes'] > 1)
{
/////////////////////////////////////////////////////////////////////////////////////////////
// Comparaison des données //
/////////////////////////////////////////////////////////////////////////////////////////////
if($attaque_armes_de_siege < $defense_fortifications)
{
/////////////////////////////////////////////////////////////////////////////////////////////
// On retire un tour a l'attaquant: //
/////////////////////////////////////////////////////////////////////////////////////////////
$tours_restants = $gald_joueur_attaque['tours'] - 1;
mysql_query("UPDATE membres SET tours= '".$tours_restants."' WHERE pseudo='".$pseudo."'")or die (mysql_error());
/////////////////////////////////////////////////////////////////////////////////////////////
// On retire un tour a la team de l'attaquant en cas de croisade: //
/////////////////////////////////////////////////////////////////////////////////////////////
if (($croisade_attaquant['action'] == 2) AND ($croisade_attaquant['race_ennemie'] == $race_defenseur))
{
if (
$croisade_attaquant['tours'] > 0)
{
if (
$gald_joueur_attaque['xp'] > 50000)
{
$nouveaux_tours = $croisade_attaquant['tours'] - 1;
mysql_query("UPDATE croisades SET tours= '".$nouveaux_tours."' WHERE race='".$race_attaquant."'");
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
// Message d'escuse pour l'attaquant //
/////////////////////////////////////////////////////////////////////////////////////////////
echo 'Désolé <b>'.$pseudo.'</b>, vos armes de sieges n\'ont pas fait le poid contre les fortifications du seigneur <b>'.$defenseur.
', vous avez été contrainds de vous replier sans emporter le moindre gald. Voila le rapport de combat que vos observateurs ont puent etablir:<br/>';
?>
<br/><hr width=75%><br/>
<div align="center"><h3><font color="#FF0000">Vos armes de siege:</font></h3></div><br/><br/>
<table width="500" border="1" cellpadding="1">
<tr>
<th scope="col" width="150"><div align="center"><font color="#009900">Arme:</font></div></th>
<th scope="col" width="150"><div align="center"><font color="#009900">Nombre:</font></div></th>
<th scope="col" width="200"><div align="center"><font color="#009900">Force:</font></div></th>
</tr>
<tr>
<td><div align="center"><b>Belier</b></div></td>
<td><div align="center"><?php echo ''.$belier.''; ?></div></td>
<td><div align="center"><?php echo ''.$force_belier.''; ?></div></td>
</tr>
<tr>
<td><div align="center"><b>Trepan</b></div></td>
<td><div align="center"><?php echo ''.$trepan.''; ?></div></td>
<td><div align="center"><?php echo ''.$force_trepan.''; ?></div></td>
</tr>
<tr>
<td><div align="center"><b>Baliste</b></div></td>
<td><div align="center"><?php echo ''.$baliste.''; ?></div></td>
<td><div align="center"><?php echo ''.$force_baliste.''; ?></div></td>
</tr>
<tr>
<td><div align="center"><b>Espringale</b></div></td>
<td><div align="center"><?php echo ''.$espringale.''; ?></div></td>
<td><div align="center"><?php echo ''.$force_espringale.''; ?></div></td>
</tr>
</table>
<br/>
<table width="500" border="1" cellpadding="1">
<tr>
<th scope="col" width="250"><div align="center"><font color="#009900">Force totale des armes de siege:</font></div></th>
<th scope="col" width="250"><div align="center"><font color="#009900">Pourcentage de réussite:</font></div></th>
</tr>
<tr>

<td><div align="center"><?php echo ''.$attaque_armes_de_siege.''; ?></div></td>
<td><div align="center"><?php echo ''.$pourcents_attaque_armes_siege.''; ?></div></td>
</tr>
</table>
<br/><hr width=75%><br/>
<div align="center"><h3><font color="#FF0000">Fortifications ennemies:</font></h3></div><br/><br/>
<table width="500" border="1" cellpadding="1">
<tr>
<th scope="col" width="150"><div align="center"><font color="#009900">Fortification:</font></div></th>
<th scope="col" width="150"><div align="center"><font color="#009900">Nombre:</font></div></th>
<th scope="col" width="200"><div align="center"><font color="#009900">Force:</font></div></th>
</tr>
<tr>
<td><div align="center"><b>Enceinte</b></div></td>
<td><div align="center">--</div></td>
<td><div align="center"><?php echo ''.$enceinte.''; ?></div></td>
</tr>
<tr>
<td><div align="center"><b>Douves</b></div></td>
<td><div align="center">--</div></td>
<td><div align="center"><?php echo ''.$douves.''; ?></div></td>
</tr>
<tr>
<td><div align="center"><b>Pont levis</b></div></td>
<td><div align="center">--</div></td>
<td><div align="center"><?php echo ''.$pont.''; ?></div></td>
</tr>
<tr>
<td><div align="center"><b>Chemin de ronde</b></div></td>
<td><div align="center">--</div></td>
<td><div align="center"><?php echo ''.$chemin.''; ?></div></td>
</tr>
<tr>
<td><div align="center"><b>Tours de garde</b></div></td>
<td><div align="center">--</div></td>
<td><div align="center"><?php echo ''.$tours.''; ?></div></td>
</tr>
<tr>
<td><div align="center"><b>Donjon</b></div></td>
<td><div align="center">--</div></td>
<td><div align="center"><?php echo ''.$donjon.''; ?></div></td>
</tr>
</table>
<br/>
<table width="500" border="1" cellpadding="1">
<tr>
<th scope="col" width="250"><div align="center"><font color="#009900">Defense totale des fortifications:</font></div></th>
<th scope="col" width="250"><div align="center"><font color="#009900">Pourcentage de réussite:</div></font></th>
</tr>
<tr>
<td><div align="center"><?php echo ''.$defense_fortifications.''; ?></div></td>
<td><div align="center"><?php echo ''.$pourcents_defense_fortifications.''; ?></div></td>
</tr>
</table>
<?php
/////////////////////////////////////////////////////////////////////////////////////////////
// La faut mettre le systeme de suivis !! //
/////////////////////////////////////////////////////////////////////////////////////////////
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
//// TOUR D ATTAQUE NUMERO 2, COMPARAISON DES TROUPES ATTAQUANTES ET DEFENSIVES //////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Si le joueur defenseur n'a pas de fortifs ou a une pallisade ou a perdu contre les armes de siege //
///////////////////////////////////////////////////////////////////////////////////////////////////////
elseif(($forti_joueur_def['enceintes'] <= 1) OR ($attaque_armes_de_siege > $defense_fortifications))
{
/////////////////////////////////////////////////////////////////////////////////////////////
// Comparaison defense troupes et attaque troupes //
/////////////////////////////////////////////////////////////////////////////////////////////
// Si la defense est sup. ou egale a l'attaque, l'attaquant perd //
/////////////////////////////////////////////////////////////////////////////////////////////
if($defense_troupes_defense >= $attaque_net_attaquant)
{

Donc, mon code fonctionne tres bien quand le joueur defenseur n'a pas de fortifications ou alors que la force des armes de siege de l'attaquant est inferieur a la defense des fortifications. En revanche, quand la force des armes de sieges est superieur a celle des fortifs et que l'on doit normalement comparer les troupes, il me met une page... vide Tongue

Est ce le "OR" qui est dans la condition qui va pas ou c'est autre chose ? Smile


RE: Probleme "OR" dans condition: - TeKRunneR - 19-07-2007

A première vue j'ai pas trouvé d'erreur flagrante dans ton code, je te conseille donc de faire les choses suivantes :

- si tu y as accès vérifie dans ton php.ini que toutes les erreurs et les warnings sont bien affichées, il est possible que tu obtiennes une page blanche parce qu'il y a une erreur non affichée

- si la solution précédente ne donne rien, essaie de mettre des echo 'Le défenseur a plus qu'une palissade';, echo 'L'armée de l'attaquant est plus petite', etc. après tes if, histoire de voir ou ton programme passe et ou il ne passe pas. S'il ne passe pas là ou il devrait tu peux essayer d'afficher le contenu des variables avec des echo également. C'est une méthode de debug tout ce qu'il y a de plus basique, mais ça reste très efficace.


RE: Probleme "OR" dans condition: - Zamentur - 20-07-2007

ben il y a une erreur de construction de code tout simplement:

Voici ce que tu as fait en résumé:
Code PHP :
<?php 
if($forti_joueur_def['enceintes'] > 1) {
if(
$attaque_armes_de_siege < $defense_fortifications) {
//Code d'echec de l'attaquant à cause des fortification
}
}
elseif ((
$forti_joueur_def['enceintes'] <= 1) OR ($attaque_armes_de_siege > $defense_fortifications)) {
//comparaison troupe

Donc là si tu regardes bien si "la force des armes de sieges est superieur a celle des fortifs" et que les fortifs sont supérieur à 1 (donc superieur à pallissade) il ne s'affiche rien....

J'ai vraiment hesité à te le mettre comme çà pour te laisser chercher , mais comme j'était pas sur de repasser demain, je me suis dit qu'il vallait mieux mettre le reponse

Donc tant que j'y suis:
Code PHP :
<?php 
//Si les enceintes sont faible ou que les armes de sièges sont superieur => comparaison des troupes
if (($forti_joueur_def['enceintes'] <= 1) OR ($attaque_armes_de_siege > $defense_fortifications)) {
//comparaison troupe
}
//Sinon attaquant a perdue
else {
//Code d'echec de l'attaquant à cause des fortification
}


Donc une simple erreur de logique, je te conseille dans ces cas là de faire comme je viens de faire en en enlevant le code superflue... Ca peut aider à y voir plus clair
Sinon met des echos un peu partout histoire de voir ou çà passe et ou çà passe pas
Indenter mieux ton code car tu l'aurais peut être vue tout de suite si le code était indenté.
Utiliser des fonctions (par exemple compare_troupe() ) de façon à éclairer ton code (en plus comme çà tu pourras faire des modifs intéressantes par la suite...
Et le conseil ultime quand on ne trouve désespérément pas un bug: faire une pause (enfin moi il m'est arrivé parfois de chercher des bugs pendant 3h et de faire une pause de 5 minute pour revenir et trouver la source du problème du premier coup... (solution alternative faire ce que tu viens de faire et demander ici Smile )


RE: Probleme "OR" dans condition: - TeKRunneR - 20-07-2007

Ah oui en effet j'étais passé à côté de ça.

En passant zneman, dans ce genre de situation ou tu dois traiter plusieurs cas (fortif meilleures que palissades et attaquant moins fort, fortif moins bonnes et attaquant moins fort, etc.), je te conseille de tous les écrire sur une feuille ou dans un .txt, et de les rayer au fur et à mesure que tu les traites. Ça coute pas grand chose et ça t'aurait peut-être permis de ne pas faire cet oubli.