Page 1 sur 1

Un combat entre deux objets...

Posté : 04 août 2009, 13:19
par Johy
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.

Re: Un combat entre deux objets...

Posté : 04 août 2009, 18:05
par globule
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)

Re: Un combat entre deux objets...

Posté : 04 août 2009, 21:11
par Johy
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...

Re: Un combat entre deux objets...

Posté : 04 août 2009, 21:25
par globule
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

Re: Un combat entre deux objets...

Posté : 04 août 2009, 21:41
par Johy
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...

Re: Un combat entre deux objets...

Posté : 04 août 2009, 23:23
par globule
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

Re: Un combat entre deux objets...

Posté : 04 août 2009, 23:51
par globule
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...

Re: Un combat entre deux objets...

Posté : 05 août 2009, 09:59
par Johy
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...

Re: Un combat entre deux objets...

Posté : 05 août 2009, 15:06
par globule
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.

Re: Un combat entre deux objets...

Posté : 05 août 2009, 15:38
par v4gab0nd
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é ! ";
}

Re: Un combat entre deux objets...

Posté : 05 août 2009, 15:42
par globule
C'est vrai, c'est encore mieux !

Re: Un combat entre deux objets...

Posté : 05 août 2009, 19:33
par Johy
C'est bien penser oui, je vais m'orienter vers là, merci !