JeuWeb - Crée ton jeu par navigateur
[ALGO] script de combat - 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 : [ALGO] script de combat (/showthread.php?tid=357)



[ALGO] script de combat - LittleQI - 24-10-2006

Salut à tous,
je fais appel a votre experience de programmation de jeux en PHP
Dans mon jeu j'ai deux armées qui doivent s'affronter, et je dois réaliser le script qui fait cela.
au debut de mon script, j'extrait les armées de la base de données et je crée 2 objet avec: un pour l'attaquant, un pour le defenseur.
voici la class armée:
Code PHP :
<?
class armee {
var
$unitesArmee;
var
$unitesArmeeMortes;
var
$idJoueur;
var
$niveauArme;
var
$niveauArmure;

//les constructeurs
function unitesArmee() {
$this->idJoueur=0;
$this->unitesArmee=Array();
$this->unitesArmeeMortes=Array();
}

//les methodes maintenant
function ajoutUnite($unites_id,$unites_PA,$unites_PD,$unites_PR,$action_mouvement_unites_quantite,$unites_nom,$unites_capacite,$niveauArme,$niveauArmure) {
$this->niveauArme=$niveauArme;
$this->niveauArmure=$niveauArmure;

$index=count($this->unitesArmee);

//on enregistre l'i de l'unite
$this->unitesArmee[$index][0]=$unites_id;
//on enregistre les points d'attaque de l'unite
$this->unitesArmee[$index][1]=$unites_PA;
//on enregistre les points de defense de l'unite
$this->unitesArmee[$index][2]=$unites_PD;
//on enregistre la rapidite de l'unite
$this->unitesArmee[$index][3]=$unites_PR;
//on enregistre le nombre d'unites
$this->unitesArmee[$index][4]=$action_mouvement_unites_quantite;
//on enregistre le nom de l'unite
$this->unitesArmee[$index][5]=$unites_nom;
//on enregistre la capacite de transport de l'unite
$this->unitesArmee[$index][6]=$unites_capacite;
//on enregistre les ppoints d'attaque total
$pointsAttaque=$unites_PA*$action_mouvement_unites_quantite*$unites_PR;
for(
$i=0;$i<$niveauArme;$i++) $pointsAttaque=($pointsAttaque/100)*110;
$this->unitesArmee[$index][7]=$pointsAttaque;
//on enregistre les points de defense total
$pointsDefense=$unites_PD*$action_mouvement_unites_quantite;
for(
$i=0;$i<$niveauArmure;$i++) $pointsDefense=($pointsDefense/100)*110;
$this->unitesArmee[$index][8]=$pointsDefense;
}

function
nettoyage() {
$unitesArmeeTemp = Array();

for(
$i=0;$i<count($this->unitesArmee);$i++) {
$PDtotal=$this->unitesArmee[$i][8];
for(
$j=0;$j<$this->niveauArmure;$j++) $PDtotal=($PDtotal/110)*100;
$this->unitesArmee[$i][4]=round($PDtotal/$this->unitesArmee[$i][2]);
}

for(
$i=0;$i<count($this->unitesArmee);$i++) {
if(
$this->unitesArmee[$i][4]>0) {
$unitesArmeeTemp[count($unitesArmeeTemp)]=$this->unitesArmee[$i];
}
else {
$this->unitesArmeeMortes[count($this->unitesArmeeMortes)]=$this->unitesArmee[$i];
}
}

//on recalcule les PA et PD
for($j=0;$i<count($unitesArmeeTemp);$i++) {
//on recalcule les PA
$pointsAttaque=$unitesArmeeTemp[$i][1]*$unitesArmeeTemp[$i][4]*$unitesArmeeTemp[$i][3];
for(
$j=0;$j<$this->niveauArme;$j++) $pointsAttaque=($pointsAttaque/100)*110;
$unitesArmeeTemp[$i][7]=$pointsAttaque;

//on recalcule les PD
$pointsDefense=$unitesArmeeTemp[$i][2]*$unitesArmeeTemp[$i][4];
for(
$j=0;$j<$this->niveauArmure;$j++) $pointsDefense=($pointsDefense/100)*110;
$unitesArmeeTemp[$i][8]=$pointsDefense;
}

$this->unitesArmee=$unitesArmeeTemp;
}

//on declare les accesseurs
function getIdJoueur() {
return
$this->idJoueur;
}

function
setIdJoueur($idJoueur) {
$this->idJoueur=$idJoueur;
}

function
getPATotal() {
$PATotal=0;
for(
$i=0;$i<count($this->unitesArmee);$i++) {
$PATotal+=$this->unitesArmee[$i][7];
}

return
$PATotal;
}

function
getPDTotal() {
$PDTotal=0;
for(
$i=0;$i<count($this->unitesArmee);$i++) {
$PDTotal+=$this->unitesArmee[$i][8];
}

return
$PDTotal;
}

function
isKO() {
$isKO=true;
for(
$i=0;$i<count($this->unitesArmee);$i++) {
if(
$this->unitesArmee[$i][8]>0) $isKO=false;
}

return
$isKO;
}

function
getNbUnitesTotal() {
$nbUnitesTotal=0;
for(
$i=0;$i<count($this->unitesArmee);$i++) {
$nbUnitesTotal+=$this->unitesArmee[$i][4];
}

return
$nbUnitesTotal;
}

function
getNbUnitesDiff() {
return
count($this->unitesArmee);
}

function
getNbUnitesDiffMort() {
return
count($this->unitesArmeeMortes);
}

function
getNbUnites($unite) {
return
$this->unitesArmee[$unite][4];
}

function
getPDTotalUnites($unite) {
return
$this->unitesArmee[$unite][8];
}

function
setPDTotalUnites($unite,$points) {
$this->unitesArmee[$unite][8]=$points;
}

function
toString() {
$chaine="";
for(
$i=0;$i<count($this->unitesArmee);$i++) {
$chaine.=$this->unitesArmee[$i][5].": ".$this->unitesArmee[$i][4]."<BR>";
}

if(
$chaine=="") $chaine="Aucune unité<BR>";

return
$chaine;
}

function
getCapacite() {
$capacite=0;
for(
$i=0;$i<count($this->unitesArmee);$i++) {
$capacite+=$this->unitesArmee[$i][6]*$this->unitesArmee[$i][4];
}

return
$capacite;
}

function
getQuantite($unite) {
return
$this->unitesArmee[$unite][4];
}

function
getIdUnite($unite) {
return
$this->unitesArmee[$unite][0];
}

function
getIdUniteMort($unite) {
return
$this->unitesArmeeMortes[$unite][0];
}
}
?>
j'ai donc pour chaque armée un nombre de points d'attaque au total, et un nombre de points de defense au total.
la ou reside tout la difficulté et de choisir qu'elle unité sera la cible de chaques attaque (puisque chaque armée est composée de plusieurs unités en quantité variable : le premier index de mon tableau $unitesArmee). et le deuxieme probleme reside à savoir combien de points d'attaque balancer à chaque attaques (si je les fait un par un, j'imagine meme pas le temps d'execution du script en cas de combats de grandes armées)

Là ou j'en suis pour le moment:
Pour le moment je realise chaque attaques l'une après l'autre,
ROUND I
CALCUL des points d'attaque de l'attaquant
CALCUL des points d'attaque du defenseur

ON FAIT SUBIR AU DEFENSEUR LES POINTS D'ATTAQUE DE L'ATTAQUANT
calcul du PGCD entre les differentes quantité d'unites differentes
enfonction du PGCD on choisit la cible
on fait subir à la cible 1% des points d'attaque

PAREIL POUR L'ATTAQUANT

ON VIRE LES UNITES MORTES

ON RECOMMENCE UN ROUND

Seulement voila, cette solution laisse enormément de place au hasard, pour une meme bataille on peut aller de la destruction mutuelle des armées à la victoire ecrasante meme en cas d'armées desequilibrées (1 pour 2)

Voila, donc si vous avez une ebauche d'algo de bataille ou alors si vous avez la réponse a mes questions tout simplement, je suis preneur Smile

merci d'avance


RE: [ALGO] script de combat - LittleQI - 24-10-2006

Bon ben voila, solution trouvée, mon algo etait pas si mauvais, du moment qu'on recalcule bien les points d'attaque à chaque tour ce qui n'est pas bien le cas avec ce code:
Code PHP :
<?php 
//on recalcule les PA et PD
for($j=0;$i<count($unitesArmeeTemp);$i++) {
//on recalcule les PA
$pointsAttaque=$unitesArmeeTemp[$i][1]*$unitesArmeeTemp[$i][4]*$unitesArmeeTemp[$i][3];
for(
$j=0;$j<$this->niveauArme;$j++) $pointsAttaque=($pointsAttaque/100)*110;
$unitesArmeeTemp[$i][7]=$pointsAttaque;

//on recalcule les PD
$pointsDefense=$unitesArmeeTemp[$i][2]*$unitesArmeeTemp[$i][4];
for(
$j=0;$j<$this->niveauArmure;$j++) $pointsDefense=($pointsDefense/100)*110;
$unitesArmeeTemp[$i][8]=$pointsDefense;
}
alors qu'en fait c'est:
Code PHP :
<?php 
//on recalcule les PA et PD
for($i=0;$i<count($unitesArmeeTemp);$i++) {
//on recalcule les PA
$pointsAttaque=$unitesArmeeTemp[$i][1]*$unitesArmeeTemp[$i][4]*$unitesArmeeTemp[$i][3];
for(
$j=0;$j<$this->niveauArme;$j++) $pointsAttaque=($pointsAttaque/100)*110;
$unitesArmeeTemp[$i][7]=$pointsAttaque;

//on recalcule les PD
$pointsDefense=$unitesArmeeTemp[$i][2]*$unitesArmeeTemp[$i][4];
for(
$j=0;$j<$this->niveauArmure;$j++) $pointsDefense=($pointsDefense/100)*110;
$unitesArmeeTemp[$i][8]=$pointsDefense;
}
Vous voyez pas la différence? normal c'est juste un idiot de $j=0 qui s'est glissé dans mon code au lieu d'un $i=0 :oops:
comment perdre une après-midi de sa vie pour un malheureux "i"


RE: [ALGO] script de combat - Helifyl - 24-10-2006

J'ai réalisé un algo de résolution de bataille qui ressemble fortement au tien LittleQI. Malheureusement je n'ai pas pu le tester en jeu à cause d'un problème assez grave dans mon système de gestion des relations diplomatiques, enfin passons.

Tout ça pour savoir à quelle vitesse tes pages sont executées ? De même tes différentes unités sont stockées indépendamment dans la bdd non ? Le nombre d'accès n'est pas trop lourd ?

Je suis assez curieux, j'aimerai savoir si mon script a de l'avenir ou pas (enfin quand j'aurai changé d'hébergeur...) ^^


RE: [ALGO] script de combat - Raoull - 25-10-2006

Si je ne me trompe pas, je pesne avoir vu une erreur dans ta classe :

Code PHP :
<?php 
    class armee
{
        var $unitesArmee;
        var $unitesArmeeMortes;
        var $idJoueur;
        var $niveauArme;
        var $niveauArmure;
        
        
//les constructeurs
        function unitesArmee() {
            $this->idJoueur=0;
            $this->unitesArmee=Array();
            $this->unitesArmeeMortes=Array();
        }
(...)

Ta classe s'appelle "armee" donc ta fonction consctructeur doit aussi s'appeller "armee()".
Hors ici tu utilises comme constructeur une fonction "unitesArmee()". Ce n'est pas le nom de la classe, donc c'est pas une fonction constructeur. (cqfd)
De plus, tu as aussi une propriété qui s'appelle "$unitesArmee".
Sauf erreur de ma part, je pense pas que ce soit très bon d'utiliser le même nom pour une propriété et pour une fonction.


RE: [ALGO] script de combat - max - 25-10-2006

c'est du javascript tout ca non?
cc'est pas possible de le faire en php?


RE: [ALGO] script de combat - LittleQI - 25-10-2006

Raoull a écrit :Si je ne me trompe pas, je pesne avoir vu une erreur dans ta classe :

Code PHP :
<?php 
class armee {
var
$unitesArmee;
var
$unitesArmeeMortes;
var
$idJoueur;
var
$niveauArme;
var
$niveauArmure;

//les constructeurs
function unitesArmee() {
$this->idJoueur=0;
$this->unitesArmee=Array();
$this->unitesArmeeMortes=Array();
}
(...)

Ta classe s'appelle "armee" donc ta fonction consctructeur doit aussi s'appeller "armee()".
Hors ici tu utilises comme constructeur une fonction "unitesArmee()". Ce n'est pas le nom de la classe, donc c'est pas une fonction constructeur. (cqfd)
De plus, tu as aussi une propriété qui s'appelle "$unitesArmee".
Sauf erreur de ma part, je pense pas que ce soit très bon d'utiliser le même nom pour une propriété et pour une fonction.


Tu as tout à fait raison et merci de me le préciser, c'est idiot, au debut j'avais appellé le tableau unitesArmee : armee. Mais du coup il portait bien sur le meme nom que ma class, j'ai donc été dans notepad++, edition>remplacer et j'ai remplacé tous les armee par unitesarmee, et du coup il m'a aussi changé le nom de mon constructeur. Merci de la correction.

pour repondre à Helifyl:
En fait dans ma BDD, dans ma table qui contient les unités, un enregistrement contient l'ID du type d'unité, ainsi que la quantité d'unité. Donc la plus grande armée posssible contiendra au maximum 9 enregistrement.


RE: [ALGO] script de combat - max - 25-10-2006

j'aime les vents...
parce que je code aussi un jeu php mais je connais pas du tout le javascript
donc je repose ma question: est il possible de faire un combat en php???


RE: [ALGO] script de combat - Chewbacca - 25-10-2006

max a écrit :j'aime les vents...
parce que je code aussi un jeu php mais je connais pas du tout le javascript
donc je repose ma question: est il possible de faire un combat en php???

Je suis pas modo, mais je sais que c'est pas ton sujet ici...
Donc t'as pas à poser cette question ici, si tu veux qu'on t'y réponde viens pas squatter les sujets des autres...
Parce que le sujet ici, c'est le script de combat de LittleQI...


RE: [ALGO] script de combat - Helifyl - 25-10-2006

Je crois qu'on peut quand même répondre à cette question sans trop tomber dans le hors sujet.

Donc le code de LittleQI est bien du php: tu ne dois pas reconnaitre car ce sont des objets (php gère la programmation orientée objet depuis la version 4). Javascript étant aussi un langage objet je pense que ton erreur vient de là.
Après les objets sont vraiment devenus intéressants sur php5 mais comme tous les hébergeurs ne le gèrent pas encore il faut se méfier. Si tu veux de la doc va faire un tour sur developpez.com ou fais une recherche sur google et tu trouveras de quoi t'instruire Wink

@LittleQI: Ok merci du renseignement. Dans mon code le nombre de sous divisions d'une armée (l'équivalent de tes unités) est beaucoup plus grand. Faudra que je teste tout ça.


RE: [ALGO] script de combat - LittleQI - 25-10-2006

oui au debut j'avais testé avec une case du tableau pour chaque soldat de l'armée.....je me suis vite rendu compte que avec des armées de 100 000 combattants, apache plantait, ce qui est un peu logique. Il a donc fallut gérer tout ça avec les quantité de soldats.