[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 Smile](https://jeuweb.org/images/smilies/smile.png)
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 Wink](https://jeuweb.org/images/smilies/wink.png)
@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.
|