Probleme d'algo/PHP pour mon jeu en ligne...ca fait peur

Probleme d'algo/PHP pour mon jeu en ligne...ca fait peur - PHP - Programmation

Marsh Posté le 04-10-2003 à 10:59:14    

Salut tout le monde !
J'aurai besoin d'aide de votre part pour avancer dans mon jeu en ligne, je me suis pris la tete a chercher une solution, mais j'ai du mal...enfin bon, ca fait 3 semaines que j'ai pas avancé alors je me décide a poster ici, en espérant que vous comprendrez le probleme que moi meme j'ai du mal a dicerner.
 
Donc le probleme se situe au niveau de mon job qui sera effectué tout les jours (1 fois / jour) par webcron.
Dans mon jeu en ligne, je gere un petit systeme de guerre.
Je tiens d'abord a preciser, qu'un village ne peux lancer qu'une seul attaque a la fois, et ne peux en recevoir qu'une seul a la fois également.
 
Quand le village X (avec pseudo de user : XX) lance une guerre contre le village Y(avec pseudo de user : YY), voilà ce qui se passe :
 
Un nouvelle enregistrement apparait dans ma table Guerre:
Pseudo:XX
villageattaquer:Y
villageattaquant:X
archersend: 20 // X a par exemple envoyer 20 archer a l'attaque sur Y
fantassinsend: 15 //meme chose, avec des fantassins
et puis y'a d'autre chose mais ca ne concerne pas le probleme.
 
Il existe une deuxieme table, la table village, ou il y'a toute les informations concernant le village: money,nourriture,archer,fantassin,tourafleche - touracanon (struc defensive),niveauarmee,niveaudefensif, ect...
 
Voilà, un peu de code, et la question et en dessous:
 

Code :
  1. //connexion a la BD
  2. //verification si le job a pas déjà été effectué aujourd'hui...
  3. $req2="SELECT * FROM village";
  4. $resultat2=mysql_query($req2,$connexion);
  5. //-----------DEBUT DE LA BOUCLE DU VILLAGE
  6. while($village=mysql_fetch_object($resultat2))
  7.         {
  8. //Cette boucle s'arrete a la fin du fichier!
  9. //mise a jour de la population
  10. //mise a jour de la nourriture..(un peu de code pour illustrer :)
  11.                 $nourritureferme=$village->ferme*$village->fermier*150;
  12.                 if($village->moral==100)
  13.                         $nourritureferme=$nourritureferme*1.2;
  14.                 elseif($village->moral==0)
  15.                         $nourritureferme=$nourritureferme*0.6;
  16.                 $nourritureport=$village->port*$village->bateau*400;
  17.                 if($village->moral==100)
  18.                         $nourritureport=$nourritureport*1.2;
  19.                 elseif($village->moral==0)
  20.                         $nourritureport=$nourritureport*0.6;
  21. echo"bouf ferme====$nourritureferme==";
  22.                 $nourrituretotal=$nourritureferme+$nourritureport;
  23. $consopop=$village->population*15;
  24. echo"//$consopop--//";
  25. $newnourriture=$village->nourriture+$nourrituretotal-$consopop;
  26. // Fin d'une partie du traitement de la nourriture, mais le probleme nest pas là.
  27. //Gestion du moral...
  28. //Gestion de l'argent, loyer, vente de nourriture...
  29. //Gestion de la guerre  :sweat:
  30. $req="SELECT * FROM guerre WHERE villageattaquant='$village->village' OR villageattaquer='$village->village'";
  31. /* En fait, on vérifié si le village que le job traite participe actuellement a une guerre, qu'il soit attaqué, ou attaquant.*/
  32. $resultat1=mysql_query($req,$connexion);
  33. while($guerre=mysql_fetch_object($resultat1))
  34. {
  35. //Verification si la guerre n'est pas déjà fini (pas de probleme ici)
  36. //Attention, les ennuis commencent:
  37. //-------------------SI C MOI QUI ATTAQUE---------
  38. if($guerre->villageattaquant==$village->village)
  39. {
  40. //calcul de la puissance d'attaque
  41. $power_my_attaquant=$village->lvarmee*($guerre->archersend*200+$guerre->fantassinsend*300)+rand(1000,5000)+$guerre->moral*10; //random= effet de surprise
  42. $req="SELECT * FROM village WHERE village='$guerre->villageattaquer'";  // je prends les données de la personne qui est attaquer
  43. $resultat=mysql_query($req,$connexion);
  44. $your_attaquer=mysql_fetch_object($resultat);
  45. $power_your_attaquer=$your_attaquer->lvdefense*($your_attaquer->fantassin*200+$your_attaquer->archer*300+$your_attaquer->tourfleche*1000+$your_attaquer->tourcanon*1700)+rand(500,2500)+$your_attaquer->moral*10;
  46. /* Aprés ca on effectue des mises a jour: Si c moi qui gagne, je prends de l'argent et de la nourriture puis je reviens au village (avec un nombre de perte..) sinon si je perds, tous mes hommes sont morts, et je gagne rien.
  47. Attention, je rappel qu'ici, c'est moi qui attaque un autre village.
  48. Au niveau des mises a jour, ca pourrait faire quelque chose comme ca :*/
  49. if($win==$village->village)// si j'ai gagné
  50.                         {
  51. $your_losein=$your_attaquer->losein+1;
  52. $newwinin=$zvillage->winin+1;
  53. $newnourriture=$zvillage->nourriture+$butinnourriture;
  54. $newmoney=$zvillage->money+$butinmoney;
  55. $newfantassin=$zvillage->fantassin+$guerre->fantassinsend-$pertefantassin;
  56. $newarcher=$zvillage->archer+$guerre->archersend-$pertearcher;
  57. $newtresors=$zvillage->tresors+$butin;
  58. // MISE A JOUR MES INFOS
  59. $req="UPDATE village SET winin='$newwinin',nourriture='$newnourriture',money='$newmoney'"
  60. ." ,fantassin='$newfantassin',archer='$newarcher', tresors='$newtresors'"
  61. ." WHERE village='$village->village'";
  62. $resultat=mysql_query($req,$connexion);
  63. if($resultat)
  64. echo" <br>--- guerre effectué avec succés pour $village->village-- requete = $req";
  65. // REQ SES INFOS
  66. $req="UPDATE village SET losein='$your_losein',nourriture='$your_nourriture',money='$your_money'"
  67. .",fantassin='$your_fantassin',archer='$your_archer' WHERE village='$guerre->villageattaquer";
  68. $resultat=mysql_query($req,$connexion);
  69. if($resultat)
  70. echo"<br>--- j'ai gagné, et l'autre il a perdu, vla ces pertes : $req";
  71.                         }
  72. /* Bref, sinon si j'ai perdu, on fait ca, ..ect */
  73. }
  74. else // SI c'est l'autre qui attaque, et moi j'encaisse l'attaque !
  75. {
  76.                       /* Le probleme est là, il va effectuer 2 fois les mises a jour, 1 fois quand le village X sera traité, et l'autre fois quand le village Y sera traité...c'est foireux non ?
  77. Alors là je pense a un truc...rajouter un champ dans ma table guerre : "Guerre_Traiter:(0/1) (oui ou non), si c pas traité, je fais mes instructions, sinon, le jobs est fini puisque les infos sont déjà mises a jour.
  78. C'est bon non ?
  79. J'ai trouvé la solution ?
  80. Je sais pas si j'ai été clair m'enfin.
  81.                       */
  82. }
  83. }


 
Voilà, j'espere que j'ai été compréhensible a travers les commentaires.


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 04-10-2003 à 10:59:14   

Reply

Marsh Posté le 04-10-2003 à 16:15:45    

Je suis pas sûr d'avoir bien saisi ... Si tu as un problème d'objets traités deux fois, tu élimines le problème en ne faisant le traitement qu'une fois :)
 
Eg ... tu choppes dans une liste toutes les attaques à traiter, tous les villages utilisés (aussi bien attaquants / qu'attaqués), tu boucles sur les attaques et update les données des villages, puis tu resauves le tout dans la base de données. Je ne vois pas le besoin de la distinction "si c toi qui attaque".

Reply

Marsh Posté le 10-10-2003 à 17:43:32    

youdontcare a écrit :

Je suis pas sûr d'avoir bien saisi ... Si tu as un problème d'objets traités deux fois, tu élimines le problème en ne faisant le traitement qu'une fois :)
 
Eg ... tu choppes dans une liste toutes les attaques à traiter, tous les villages utilisés (aussi bien attaquants / qu'attaqués), tu boucles sur les attaques et update les données des villages, puis tu resauves le tout dans la base de données. Je ne vois pas le besoin de la distinction "si c toi qui attaque".


 
Merci beaucoup !
J'avais oublié de répondre.
En fait, j'avais déjà trouvé la solution, je me prenais la tete pour rien...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed