smilm | 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 :
- //connexion a la BD
- //verification si le job a pas déjà été effectué aujourd'hui...
- $req2="SELECT * FROM village";
- $resultat2=mysql_query($req2,$connexion);
- //-----------DEBUT DE LA BOUCLE DU VILLAGE
- while($village=mysql_fetch_object($resultat2))
- {
- //Cette boucle s'arrete a la fin du fichier!
- //mise a jour de la population
- //mise a jour de la nourriture..(un peu de code pour illustrer :)
- $nourritureferme=$village->ferme*$village->fermier*150;
- if($village->moral==100)
- $nourritureferme=$nourritureferme*1.2;
- elseif($village->moral==0)
- $nourritureferme=$nourritureferme*0.6;
- $nourritureport=$village->port*$village->bateau*400;
- if($village->moral==100)
- $nourritureport=$nourritureport*1.2;
- elseif($village->moral==0)
- $nourritureport=$nourritureport*0.6;
- echo"bouf ferme====$nourritureferme==";
- $nourrituretotal=$nourritureferme+$nourritureport;
- $consopop=$village->population*15;
- echo"//$consopop--//";
- $newnourriture=$village->nourriture+$nourrituretotal-$consopop;
- // Fin d'une partie du traitement de la nourriture, mais le probleme nest pas là.
- //Gestion du moral...
- //Gestion de l'argent, loyer, vente de nourriture...
- //Gestion de la guerre :sweat:
- $req="SELECT * FROM guerre WHERE villageattaquant='$village->village' OR villageattaquer='$village->village'";
- /* En fait, on vérifié si le village que le job traite participe actuellement a une guerre, qu'il soit attaqué, ou attaquant.*/
- $resultat1=mysql_query($req,$connexion);
- while($guerre=mysql_fetch_object($resultat1))
- {
- //Verification si la guerre n'est pas déjà fini (pas de probleme ici)
- //Attention, les ennuis commencent:
- //-------------------SI C MOI QUI ATTAQUE---------
- if($guerre->villageattaquant==$village->village)
- {
- //calcul de la puissance d'attaque
- $power_my_attaquant=$village->lvarmee*($guerre->archersend*200+$guerre->fantassinsend*300)+rand(1000,5000)+$guerre->moral*10; //random= effet de surprise
- $req="SELECT * FROM village WHERE village='$guerre->villageattaquer'"; // je prends les données de la personne qui est attaquer
- $resultat=mysql_query($req,$connexion);
- $your_attaquer=mysql_fetch_object($resultat);
- $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;
- /* 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.
- Attention, je rappel qu'ici, c'est moi qui attaque un autre village.
-
- Au niveau des mises a jour, ca pourrait faire quelque chose comme ca :*/
- if($win==$village->village)// si j'ai gagné
- {
- $your_losein=$your_attaquer->losein+1;
- $newwinin=$zvillage->winin+1;
- $newnourriture=$zvillage->nourriture+$butinnourriture;
- $newmoney=$zvillage->money+$butinmoney;
- $newfantassin=$zvillage->fantassin+$guerre->fantassinsend-$pertefantassin;
- $newarcher=$zvillage->archer+$guerre->archersend-$pertearcher;
- $newtresors=$zvillage->tresors+$butin;
- // MISE A JOUR MES INFOS
- $req="UPDATE village SET winin='$newwinin',nourriture='$newnourriture',money='$newmoney'"
- ." ,fantassin='$newfantassin',archer='$newarcher', tresors='$newtresors'"
- ." WHERE village='$village->village'";
- $resultat=mysql_query($req,$connexion);
- if($resultat)
- echo" <br>--- guerre effectué avec succés pour $village->village-- requete = $req";
- // REQ SES INFOS
- $req="UPDATE village SET losein='$your_losein',nourriture='$your_nourriture',money='$your_money'"
- .",fantassin='$your_fantassin',archer='$your_archer' WHERE village='$guerre->villageattaquer";
- $resultat=mysql_query($req,$connexion);
- if($resultat)
- echo"<br>--- j'ai gagné, et l'autre il a perdu, vla ces pertes : $req";
- }
- /* Bref, sinon si j'ai perdu, on fait ca, ..ect */
- }
- else // SI c'est l'autre qui attaque, et moi j'encaisse l'attaque !
- {
- /* 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 ?
- 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.
- C'est bon non ?
- J'ai trouvé la solution ?
-
- Je sais pas si j'ai été clair m'enfin.
- */
- }
- }
|
Voilà, j'espere que j'ai été compréhensible a travers les commentaires.
---------------
AfterEnd: Batissez un nouveau monde
|