JeuWeb - Crée ton jeu par navigateur
[Résolu] Un combat entre deux objets - 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 : [Résolu] Un combat entre deux objets (/showthread.php?tid=4257)

Pages : 1 2 3


[Résolu] Un combat entre deux objets - Johy - 04-08-2009

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.
http://www.graphyx.fr/game/Game.rar

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 - NicoMSEvent - 04-08-2009

ligne 194 de ta classe, il te manque un $ devant ton nom de variable ^^
Code :
if(xp_nec == "xp_nec")



RE: Un combat entre deux objets - Johy - 04-08-2009

Exact, merci !

Mais ça ne résout pas le problème malheureusement :/


RE: Un combat entre deux objets - NicoMSEvent - 05-08-2009

apres re-analyse, je ne vois plus de grosse faute d'inattention... de plus je viens de me lever, j'ai p-e encore la tete un peu dans le c** ^^


RE: Un combat entre deux objets - Johy - 05-08-2009

Je ne pense pas que ce soit une erreur de syntaxe car comme je l'ai dis, le personnage que nous possédons lui, fonctionne très bien... L'autre utilise les mêmes methodes et attributs, étant de la même classe... Je ne comprends vraiment pas.


RE: Un combat entre deux objets - wild-D - 05-08-2009

j'ai plus fais mumuse que me pencher sur la logique du code.(la manière dont t'as des requêtes à toutes les méthodes... ça parait peu fiable en mode multijoueurs -si t'as des requête qui se croise vu que tu écrase la valeur en bdd à chaque fois, ça va pas être clean-)


Sinon je trouve pas que le perso fonctionne bien pour le compte test.

(le comportement est franchement étrange si je déco/reco; le niveau reset.. mais apparemment pas xp_necessaire Oo', faut passer de niveau)

a priori y a un truc pas net au niveau de la sauvegarde en bdd. Et ça vaut pour tous (si ça ce voit "moyen" pour le perso du connecté, c'est parce que lui tu le garde en session et tu "joue" avec la version en session... mais au niveau de la bdd il est tout autant bugué)


RE: Un combat entre deux objets - pascal - 05-08-2009

Essaie de tester unitairement la classe via un script faisant :
- initialisation de la BDD avec des données de test
- combat entre joueur 1 et 2
- vérification du résultat (avec affichage à l'écran)
- nouveau combat + vérification ...

Si tout est OK, le problème vient de la page index.php
S'il y a un problème, il faudra revoir la logique du code contenu dans la classe.

A+

Pascal


RE: Un combat entre deux objets - Johy - 05-08-2009

En tout cas, merci pour l'aide.

wild-D, ton raisonnement me plait beaucoup dans la mesure ou, enfin, quelqu'un met en évidence le pourquoi de la situation. Tous les tests jusqu'à présent n'ont rien donné de significatif, alors que ton raisonnement tient la route, dans la mesure où on comprend très bien pourquoi le personnage joué se met bien à jour : il reste instancié en session.

Donc c'est bel et bien un problème de mise à jour de BDD et/ou de récupération de données. Par conséquent, je vais appliquer ce que tu m'as conseillé. Je vais envoyer 2 requêtes à la fin du combat, mettant à jour le personnage joué et le personnage cible dans la BDD quasi-intégralement, et supprimer les morceaux de requêtes çà et là dans les methods.

J'ai enfin de la matière à travailler... Merci, et merci à tous les autres qui auront contribué à m'aider en proposant des tests, que je ne connaissais pas et qui me serviront à l'avenir... ! Smile
Désolé pour le double post, mais je viens aux nouvelles.
Il y avait en effet une erreur au niveau des requêtes, c'est corrigé.

Donc, j'ai regroupé à la fin d'un combat les deux requêtes mettant à jour la BDD.

Code :
mysql_query("UPDATE personnages SET experience='".$this->experience."', xp_necessaire='".$this->xp_necessaire."', hp='".$this->hp."', niveau='".$this->niveau."', pt_stat='".$this->pt_stat."' WHERE id='".$this->id."'");
        mysql_query("UPDATE personnages SET experience='".$cible->__get(experience)."', xp_necessaire='".$cible->__get(xp_necessaire)."', hp='".$cible->__get(hp)."', niveau='".$cible->__get(niveau)."', pt_stat='".$cible->__get(pt_stat)."' WHERE id='".$cible->__get(id)."'");

J'ai vérifié, la BDD m'affiche exactement les données affichées sur le site, au bon moment et sans retard. Les echanges entre la bdd et le script se font désormais très bien, mais reste le souci de script apparent, avec le retour au niveau 1 du personnage attaqué. J'ai vérifié, il retourne aussi niveau 1 sur la bdd alors que le personnage joué, lui, up très bien, tant sur le site que sur la bdd...

Une idée ?


RE: Un combat entre deux objets - wild-D - 05-08-2009

faire une méthode propre de sauvegarde de ta classe perso; et une méthode propre de chargement. c'est par elles que tu passera pour mettre à jour le perso en bdd.


pis sinon un truc très choquant dans ton constructeur: il est ou le niveau ^^(je sais pas si la version que j'ai est à jour, mais moi j'ai rien); pas étonnant qu'on retourne au niveau 1 à chaque fois qu'on instancie à neuf; si ton constructeur zappe la valeur en bdd.


RE: Un combat entre deux objets - Johy - 05-08-2009

Mon dieu, que j'ai honte... C'était ça, depuis le début !
Un simple oubli de ma part qui n'empechait pas de marcher, mais de marcher correctement. D'où la difficulté à repérer l'erreur...

En tout cas, merci infiniment, j'ai bloqué dessus un bon moment, mais malgré tout, je pense que j'aurai pas mal appris, comme le fait de grouper mes requetes, et ta super idée de créer une methode de chargement/update du perso...

Ca me gène que vous aillez perdu du temps sur ça... Mais encore une fois, merci ! Big Grin