Un combat entre deux objets...

Petit nouveau ! | 5 Messages

04 août 2009, 13:19

Bonjour,

Je suis en train de m'initier dans PHP OO en réalisant un petit projet. Le principe est assez simple, on crée un personnage, et on peut se battre contre d'autres. Les données sont stockées en BDD. J'ai donc créé une class Personnage avec ses attributs et methods.

Voici le scénario type du problème :

- J'attaque quelqu'un grace aux différentes methods
- il riposte
- Je gagne de l'expérience
- il gagne de l'expérience
- Si l'xp gagné >= l'xp necessaire, j'up un niveau
- Idem pour lui
- J'affiche un rapport contenant les stats après combat des deux personnages

Mon personnage fonctionne très bien, grimpe les niveau sans souci. Par contre, le personnage cible, lui, ne passe que niveau deux. Arrivé là, il gagne soit plus de 3xp auquel cas il ne se passe rien (il n'up pas non plus), soit moins de 3xp, et là, il retombe niveau 1...

Je n'y comprends plus rien, le personnage cible est censé utiliser les données fournies par la BDD lors du construct...

Enfin, comme je n'ai absolument aucune idée d'où ça peut venir, j'ai l'impression d'avoir tout essayé, je vous donne mes sources, qui ne sont que 2 pages. Je sais qu'il est préférable de ne donner que le morceau où ça coince, or là, je n'en ai aucune idée.

Aussi vous pourrez constater l'erreur en créant un compte sur le site de test, http://www.graphyx.fr/game
Observez bien l'évolution des statistiques des personnages que vous attaquez, ce sera peut-être plus clair que mes explications.

PS : un compte de test existe, log : test, mdp : test.

Merci infiniment, très cordialement.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Eléphanteau du PHP | 19 Messages

04 août 2009, 18:05

Pas le temps de regarder ton code pour l'instant mais je te conseille un var_dump de ce que te retourne la base lors du construct.
Avu de nez, vérifies tes requêtes UPDATE (là aussi, un var_dump de ta requête te permettra de la coller dans phpmyadmin pour la vérifier)
Celui qui recherche la vengeance devrait commencer par creuser 2 tomnes (Confucius)

Petit nouveau ! | 5 Messages

04 août 2009, 21:11

Le problème ne vient apparemment pas de là, puisque la cible subit les même methods et requetes que le personnage que l'on joue... Or, le personnage joué fonctionne parfaitement.

Ce que tu m'as dis de faire n'a rien rendu de négatif si ce n'est que j'ai l'impression que parfois, les données chargées de la BDD lors du construct sont celles du tour précédant...

Eléphanteau du PHP | 19 Messages

04 août 2009, 21:25

Crées un outre objet pour la connexion à la BDD de l'adversaire pour en avoir le coeur net.
autre méthode :
prends la requête pour lire les données de l'adversaire et exécutes là dans phpmyadmin et compare le résultat avec ce que te retourne ton appli
Celui qui recherche la vengeance devrait commencer par creuser 2 tomnes (Confucius)

Petit nouveau ! | 5 Messages

04 août 2009, 21:41

Crées un outre objet pour la connexion à la BDD de l'adversaire pour en avoir le coeur net.
Je n'ai pas compris, CàD ?
prends la requête pour lire les données de l'adversaire et exécutes là dans phpmyadmin et compare le résultat avec ce que te retourne ton appli
Si j'observe l'entrée dans la base et que je la compare avec le résultat de l'appli, ça suffit non ?

EDIT : Alors, lorsque sur le jeu le personnage repasse niveau 1 pour je ne sais quelle raison, sur la base de données, il est toujours affiché niveau 2. Puis à chaque combat, il gagne de l'xp, jusqu'au 6 necessaire puis, ça retombe à zéro, mais il ne monte pas en niveau. Par contre sur le jeu, il fait des allers-retour entre niveau 1 et niveau 2...

Eléphanteau du PHP | 19 Messages

04 août 2009, 23:23

1. Pardon, il fallait lire "un autre objet"
2. comparer avec les données de la base n'est pas suffisant. Tu n'as pas un moteur mySqldans la tête ! l'esprit interprète ce qui est lu donc je te conseille cette méthode plus pargmatique.
Faire un echo de ta requête et la coller dans phpmyadmin ce n'est pas compliqué et ça évite de passer par ton appli.

Cette méthode a fait ses preuves chez moi... #-o
Celui qui recherche la vengeance devrait commencer par creuser 2 tomnes (Confucius)

Eléphanteau du PHP | 19 Messages

04 août 2009, 23:51

j'ai regardé ton code et il y a un problème :
La classe Personnage est instanciée 2x en 29 et en 62.
En 29 c'est la création d'un personnage et en 62 c'est l'instanciation du peronnage de l'utilisateur.
=> pas d'instanciation du personnage adversaire ?

Pour ne pas dire de bêtise, j'ai regardé la classe et tes update sont toujours WHERE id=$this->id.
(donc pas d'oubli de ma part)

il faut simplement ajouter les lignes nécessaires pour instancier ton objet adversaire :
$log = mysql_real_escape_string($_POST['combattre']);
$adversaire=new Personnage( Personnage::EXISTANT, $log);
etc...
Celui qui recherche la vengeance devrait commencer par creuser 2 tomnes (Confucius)

Petit nouveau ! | 5 Messages

05 août 2009, 09:59

L'adversaire est instancié dans la method combattre().
Ce n'est pas une bonne idée ?

Des qu'on clique sur le joueur, combattre($adversaire) se lance, et combattre $adversaire instancie $cible = new Personnage(......).
http://www.graphyx.fr/game/Game.rar
Ce fichier est plus recent...

Quant aux requêtes, je n'ai rien trouvé de mauvais...

Eléphanteau du PHP | 19 Messages

05 août 2009, 15:06

D'accord ! Donc, dans le même objet, tu gère les 2 adversaire et le combat ...
Je te recommande de faire une classe combat auquel tu pas les ID des 2 adversaires. (un contrôleur, quoi !)
Dedans, tu instancie tes 2 personnages et tu gère ton combat.

Ainsi, je pense que ce sera plus clair, même pour toi.
Celui qui recherche la vengeance devrait commencer par creuser 2 tomnes (Confucius)

Eléphanteau du PHP | 30 Messages

05 août 2009, 15:38

Je passerai les deux instances Personnage dans la classe Combat.
$me = new Personnage( 12 ); 
$adv = new Personnage( 192 );

$combat = new Combat( $me, $adv );
$combat->start( );

echo $combat->rapport( );

if( $combat->win( ) == Combat::YES ) {

    echo "Vous avez gagné ! ";
}
Modifié en dernier par v4gab0nd le 05 août 2009, 15:48, modifié 1 fois.

Eléphanteau du PHP | 19 Messages

05 août 2009, 15:42

C'est vrai, c'est encore mieux !
Celui qui recherche la vengeance devrait commencer par creuser 2 tomnes (Confucius)

Petit nouveau ! | 5 Messages

05 août 2009, 19:33

C'est bien penser oui, je vais m'orienter vers là, merci !