Oui, c'est ce genre de chose que j'ai en tête. PHP ayant des appels de fonctions assez lourd, mieux vaut créer des fonctions traitant des groupes d'objet (quitte à parfois leur passer un array avec juste un objet) plutôt que de faire une fonction traitant un objet et l'appeler en boucle. D'ailleurs, cette approche est valable dans tous les langages, elle est juste encore plus efficace en PHP.
{A mon propre avis, ma réponse n'est pas claire, il faudrait que je la mette au propre dans un article illustré}
Oui, seule la dernière unité se regénère car dans ta simulation, tu as en fait attribué les dégâts aux mêmes unités (toutes mortes du coup), pendant que les autres unités n'étaient pas touchées. L'autre approche pourrait être de répartir totalement les dégâts sur toutes les unités, dans ce cas la regénération sera intéressante mais toutes les unités mourront en même temps (au dernier tour).
L'approche intermédiaire, vers laquelle je me dirigerai (j'avais d'ailleurs fait ce genre d'approche sur eclerd, pour l'âge de la population) consiste à fixer une courbe de répartition des dégâts. Dans l'idée:
• J'ai un groupe de N unités, et je veux répartir une donnée (ici la santé) sur ces unités
• Je considère que les unités sont "classées": l'unité 0 sera celle avec la donnée la plus basse (quasi morte) et l'unité N sera celle avec ma donnée la plus haute (la plus en forme)
• Je fixe la valeur de la donnée pour l'unité 0, pour l'unité N et je fixe une fonction de répartition de 0 à N (fonction croissante)
• Quand les unités perdent de la valeur de cette donnée, j'utilise la fonction de l'intégrale pour répartir cette perte
Comme je suis sûr que c'est abscons ( ), je vais prendre un exemple:
→ J'ai N=1000 unités, de santé 100. Donc, initialement, toutes les unités ont 100 pts de vie (100.000 pts de vie au total). Je vais considérer que la répartition de la santé est linéaire. Donc, pour l'unité numéro n, sa santé sera SanteUnite0 + (SanteUnite{N-1}-SanteUnite{0})/N*n (rappel: K=(SanteUnite{N-1}-SanteUnite{0})/N est la pente de la droite, une feuille et un diagramme peuvent aider ).
→ Le total de santé d'un groupe d'unité est de TotalSante = (SanteUnite{N-1}-SanteUnite{0})*N/2+SanteUnite{0}*N (c'est là que l'intégrale intervient)
→ Au début, SanteUnite{0} = SanteUnite{N-1} = 100 On pourra faire des unités blessés après si besoin.
→ J'ai un combat qui se déroule, et les dégâts s'élèvent à 15.000 points.
→ Du coup, je reprends TotalSante = 100.000-15.000 = 85.000, TotalSante = (SanteUnite{N-1}-SanteUnite{0})*N/2+SanteUnite{0}*N, et j'en déduis 85.000 = (SanteUnite{N-1}-SanteUnite{0})*N/2+SanteUnite{0}*N
→ Je centre mon équation (c'est un peu la magie des maths là...!) : TotalSante = K/2*(N-1)²+(lambda-N*K/2)*(N-1) avec K=(SanteUnite{N-1}-SanteUnite{0})/N
→ N>>1 donc je peux considérer que N-1~N (ce genre d'approximation est hyper-utile, car cela simplifie énormément les calculs)
→ Du coup, lambda = TotalSante / N
→ J'ai alors une fonction de répartition de la santé sous la forme f(n)=TotalSante/N + K*(n-N/2)
→ Ne reste plus qu'à calculer une valeur de K qui représentera la répartition des dégats, et voilà! Comme on a classé les unités par ordre croissant, on fixe K>=0, et comme l'unité N ne peut pas "gagner" de santé, on a SanteUnite{N}=f(N)=TotalSante/N + K*(N-N/2)<=SantePrecedente{N} donc K <= (100 - TotalSante/N)/(N-N/2) = (100 - TotalSante/N)*2/N
→ Hop, on synthétise, et on a:
• SanteUnite{N/2} = (SantePrecedente-Degats)/N
• 0 <= K <= 2*(SantePrecedente{N} - (SantePrecedente-Degats)/N)/N
Bon, je sais pas si c'est plus clair en fait... Ca mériterait un article propre dédié ^^
A noter, la santé de certaines unités pourra être négative, ce qui représente une unité attaquée par plusieurs ennemis en même temps.
Une autre façon de faire (qui sera peut être plus simple) serait de répartir le groupe en deux: une partie des unités meurt, encaissant des dégâts, et l'autre partie se répartie les dégâts de façon linéaire. C'est à dire que les unités de 0 à K sont toutes mortes, et les unités de K à N ont une vie de 0 à 100 (vie(n)=100*(n-K)/N).
{A mon propre avis, ma réponse n'est pas claire, il faudrait que je la mette au propre dans un article illustré}
Oui, seule la dernière unité se regénère car dans ta simulation, tu as en fait attribué les dégâts aux mêmes unités (toutes mortes du coup), pendant que les autres unités n'étaient pas touchées. L'autre approche pourrait être de répartir totalement les dégâts sur toutes les unités, dans ce cas la regénération sera intéressante mais toutes les unités mourront en même temps (au dernier tour).
L'approche intermédiaire, vers laquelle je me dirigerai (j'avais d'ailleurs fait ce genre d'approche sur eclerd, pour l'âge de la population) consiste à fixer une courbe de répartition des dégâts. Dans l'idée:
• J'ai un groupe de N unités, et je veux répartir une donnée (ici la santé) sur ces unités
• Je considère que les unités sont "classées": l'unité 0 sera celle avec la donnée la plus basse (quasi morte) et l'unité N sera celle avec ma donnée la plus haute (la plus en forme)
• Je fixe la valeur de la donnée pour l'unité 0, pour l'unité N et je fixe une fonction de répartition de 0 à N (fonction croissante)
• Quand les unités perdent de la valeur de cette donnée, j'utilise la fonction de l'intégrale pour répartir cette perte
Comme je suis sûr que c'est abscons ( ), je vais prendre un exemple:
→ J'ai N=1000 unités, de santé 100. Donc, initialement, toutes les unités ont 100 pts de vie (100.000 pts de vie au total). Je vais considérer que la répartition de la santé est linéaire. Donc, pour l'unité numéro n, sa santé sera SanteUnite0 + (SanteUnite{N-1}-SanteUnite{0})/N*n (rappel: K=(SanteUnite{N-1}-SanteUnite{0})/N est la pente de la droite, une feuille et un diagramme peuvent aider ).
→ Le total de santé d'un groupe d'unité est de TotalSante = (SanteUnite{N-1}-SanteUnite{0})*N/2+SanteUnite{0}*N (c'est là que l'intégrale intervient)
→ Au début, SanteUnite{0} = SanteUnite{N-1} = 100 On pourra faire des unités blessés après si besoin.
→ J'ai un combat qui se déroule, et les dégâts s'élèvent à 15.000 points.
→ Du coup, je reprends TotalSante = 100.000-15.000 = 85.000, TotalSante = (SanteUnite{N-1}-SanteUnite{0})*N/2+SanteUnite{0}*N, et j'en déduis 85.000 = (SanteUnite{N-1}-SanteUnite{0})*N/2+SanteUnite{0}*N
→ Je centre mon équation (c'est un peu la magie des maths là...!) : TotalSante = K/2*(N-1)²+(lambda-N*K/2)*(N-1) avec K=(SanteUnite{N-1}-SanteUnite{0})/N
→ N>>1 donc je peux considérer que N-1~N (ce genre d'approximation est hyper-utile, car cela simplifie énormément les calculs)
→ Du coup, lambda = TotalSante / N
→ J'ai alors une fonction de répartition de la santé sous la forme f(n)=TotalSante/N + K*(n-N/2)
→ Ne reste plus qu'à calculer une valeur de K qui représentera la répartition des dégats, et voilà! Comme on a classé les unités par ordre croissant, on fixe K>=0, et comme l'unité N ne peut pas "gagner" de santé, on a SanteUnite{N}=f(N)=TotalSante/N + K*(N-N/2)<=SantePrecedente{N} donc K <= (100 - TotalSante/N)/(N-N/2) = (100 - TotalSante/N)*2/N
→ Hop, on synthétise, et on a:
• SanteUnite{N/2} = (SantePrecedente-Degats)/N
• 0 <= K <= 2*(SantePrecedente{N} - (SantePrecedente-Degats)/N)/N
Bon, je sais pas si c'est plus clair en fait... Ca mériterait un article propre dédié ^^
A noter, la santé de certaines unités pourra être négative, ce qui représente une unité attaquée par plusieurs ennemis en même temps.
Une autre façon de faire (qui sera peut être plus simple) serait de répartir le groupe en deux: une partie des unités meurt, encaissant des dégâts, et l'autre partie se répartie les dégâts de façon linéaire. C'est à dire que les unités de 0 à K sont toutes mortes, et les unités de K à N ont une vie de 0 à 100 (vie(n)=100*(n-K)/N).