28-06-2023, 07:09 AM
Bon, on a fini le termi qui tire
. Le faire tirer au canon d'assaut (qui en plus est une arme classe) permet d'ajouter les blessures mortelles dans l'arbre de probabilité.

Code:
package com.calculateur.warhammer.calcul.mort.arbre.calcul;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.math3.fraction.Fraction;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import com.calculateur.warhammer.base.exception.FunctionnalExeption;
import com.calculateur.warhammer.calcul.mort.arbre.ENatureNoeud;
import com.calculateur.warhammer.calcul.mort.arbre.INoeudArbre;
import com.calculateur.warhammer.calcul.mort.arbre.calcul.builder.space.marine.TerminatorBuilderAttaque;
import com.calculateur.warhammer.calcul.mort.arbre.calcul.builder.tyranide.TermagantBuilderDefense;
import com.calculateur.warhammer.calcul.mort.arbre.data.DataCalculProbabiliteBuilder;
import com.calculateur.warhammer.calcul.mort.arbre.data.IDataCalculProbabilite;
import com.calculateur.warhammer.calcul.test.utils.FractionCheminBuilder;
import com.calculateur.warhammer.data.action.IContexteAction;
import com.calculateur.warhammer.data.enumeration.EBlessure;
import com.calculateur.warhammer.data.enumeration.EGestionDe;
import com.calculateur.warhammer.data.enumeration.EMouvement;
import com.calculateur.warhammer.data.enumeration.ESimule;
import com.calculateur.warhammer.data.identifiable.batiment.RecordBatiment;
import com.calculateur.warhammer.data.regles.detachement.space.marine.ESermentInstantChoix;
import com.calculateur.warhammer.data.unite.IConstituantAttaquant;
import com.calculateur.warhammer.data.unite.IConstituantDefenseur;
public class TerminatorSpaceMarineVsTermagauntTest extends AbstractCalculArbreTest{
@Test
public void testTerminatorBolterStorm10psPasSermentInstant() throws FunctionnalExeption{
INoeudArbre racine = doTestStandard(getDataBolterStorm(ESermentInstantChoix.NON, 10.0), getAttenduAttaqueFulgurantSansRelance(), 12);
valideTestsBolterStorm(racine, 1);
}
@Test
public void testTerminatorBolterStorm12psPasSermentInstant() throws FunctionnalExeption{
INoeudArbre racine = doTestStandard(getDataBolterStorm(ESermentInstantChoix.NON, 12.0), getAttenduAttaqueFulgurantSansRelance(), 12);
valideTestsBolterStorm(racine, 1);
}
@Test
public void testTerminatorBolterStorm118psPasSermentInstant() throws FunctionnalExeption{
INoeudArbre racine = doTestStandard(getDataBolterStorm(ESermentInstantChoix.NON, 18.0), getAttenduAttaqueFulgurantSansRelance(), 6);
valideTestsBolterStorm(racine, 1);
}
private Fraction getAttenduAttaqueFulgurantSansRelance() {
Fraction probaTouche = new Fraction(2,3);
Fraction probaBlesse = new Fraction(2,3);
Fraction probaRateSauvegarde = new Fraction(2,3);
return FractionCheminBuilder.getInstance().addFraction(probaTouche).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
}
@Test
public void testTerminatorBolterStorm10psSermentInstant() throws FunctionnalExeption{
INoeudArbre racine = doTestStandard(getDataBolterStorm(ESermentInstantChoix.OUI, 10.0), getAttenduAttaqueFulgurantAvecRelance(), 22);
valideTestsBolterStorm(racine, 4);
}
@Test
public void testTerminatorBolterStorm12psSermentInstant() throws FunctionnalExeption{
INoeudArbre racine = doTestStandard(getDataBolterStorm(ESermentInstantChoix.OUI, 12.0), getAttenduAttaqueFulgurantAvecRelance(), 22);
valideTestsBolterStorm(racine, 4);
}
@Test
public void testTerminatorBolterStorm118psSermentInstant() throws FunctionnalExeption{
INoeudArbre racine = doTestStandard(getDataBolterStorm(ESermentInstantChoix.OUI, 18.0), getAttenduAttaqueFulgurantAvecRelance(), 11);
valideTestsBolterStorm(racine, 4);
}
private Fraction getAttenduAttaqueFulgurantAvecRelance() {
Fraction probaTouche = new Fraction(5,6);
Fraction probaRateTouche = new Fraction(1,6);
Fraction probaBlesse = new Fraction(2,3);
Fraction probaRateBlesse = new Fraction(1,3);
Fraction probaRateSauvegarde = new Fraction(2,3);
Fraction chemin1 = FractionCheminBuilder.getInstance().addFraction(probaTouche).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction chemin2 = FractionCheminBuilder.getInstance().addFraction(probaRateTouche).addFraction(probaTouche)
.addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction chemin3 = FractionCheminBuilder.getInstance().addFraction(probaTouche)
.addFraction(probaRateBlesse).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction chemin4 = FractionCheminBuilder.getInstance().addFraction(probaRateTouche).addFraction(probaTouche)
.addFraction(probaRateBlesse).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
return chemin1.add(chemin2).add(chemin3).add(chemin4);
}
private void valideTestsBolterStorm(INoeudArbre racine,int nombreNoeudReussite) {
int trouve = 0;
Map<EBlessure, Integer> mAttendu = new HashMap<>();
mAttendu.put(EBlessure.NORMALES, 1);
for(INoeudArbre noeud:racine.arbre()) {
if(noeud.getNatureNoeud() == ENatureNoeud.REUSSITE) {
trouve++;
Assertions.assertThat(noeud.mapBlessuresAleatoires()).isEmpty();
Map<EBlessure, Integer> map = noeud.mapBlessure();
Assertions.assertThat(map).isEqualTo(mAttendu);
}
}
Assertions.assertThat(trouve).isEqualTo(nombreNoeudReussite);
}
private IDataCalculProbabilite getDataBolterStorm(ESermentInstantChoix sermentInstant,Double distanceBelligerants) {
IContexteAction contextAction = ContextActionForTestProbaBuilder.getInstance()
.addSimule(ESimule.TIR_PHASE_TIR)
.addNumeroTour(2)
.addEffectifInitialAttaquant(10)
.addNombreAttaquant(10)
.addMouvementAttaquant(EMouvement.IMMOBILE)
.addBatimentAttaquant(new RecordBatiment(false, false))
.addNombreDefenseur(10)
.addMouvementDefenseur(EMouvement.IMMOBILE)
.addBatimentDefenseur(new RecordBatiment(false, false))
.addDistanceEntreBelligerant(distanceBelligerants)
.build();
IConstituantDefenseur termagaunt = TermagantBuilderDefense.getInstance(contextAction, 10).build();
IConstituantAttaquant terminator = TerminatorBuilderAttaque.getInstance(contextAction, 10).addSermentInstant(sermentInstant).build();
return DataCalculProbabiliteBuilder.getInstance().addAttaquant(terminator).addDefenseur(termagaunt).addContextAction(contextAction)
.addGestionNombreAttaque(EGestionDe.SIMULATION_OPTIMISTE).addGestionJetToucheBlessure(EGestionDe.SIMULATION_OPTIMISTE).addGestionSauvegardeDefenseur(EGestionDe.SIMULATION_OPTIMISTE).build();
}
@Test
public void testTerminatorTirCanonAssautSansSermentInstant() throws FunctionnalExeption {
INoeudArbre racine = doTestStandard(getDataCanonAssaut(ESermentInstantChoix.NON), getProbaCanonAssautSansRelance(), 2);
validateCanonAssaut(racine, 1, 1);
}
private Fraction getProbaCanonAssautSansRelance() {
Fraction probaTouche = new Fraction(2,3);
Fraction probaBlesse = new Fraction(2,3);
Fraction probaBlessureMortelle = new Fraction(1,6);
Fraction probaRateSauvegarde = new Fraction(2,3);
Fraction cheminBlessureNormales = FractionCheminBuilder.getInstance().addFraction(probaTouche).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction cheminBlessureMortelles = FractionCheminBuilder.getInstance().addFraction(probaTouche).addFraction(probaBlessureMortelle).build();
return cheminBlessureNormales.add(cheminBlessureMortelles);
}
@Test
public void testTerminatorTirCanonAssautSermentInstant() throws FunctionnalExeption {
INoeudArbre racine = doTestStandard(getDataCanonAssaut(ESermentInstantChoix.OUI), getProbaCanonAssautAvecRelance(), 4);
validateCanonAssaut(racine, 4, 4);
}
private Fraction getProbaCanonAssautAvecRelance() {
Fraction probaTouche = new Fraction(5,6);
Fraction probaRateTouche = new Fraction(1,6);
Fraction probaBlesse = new Fraction(2,3);
Fraction probaBlessureMortelle = new Fraction(1,6);
Fraction probaRateBlessure = new Fraction(1,6);
Fraction probaRateSauvegarde = new Fraction(2,3);
//Normale
Fraction cNormal1 = FractionCheminBuilder.getInstance().addFraction(probaTouche).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction cNormal2 = FractionCheminBuilder.getInstance().addFraction(probaRateTouche).addFraction(probaTouche)
.addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction cNormal3 = FractionCheminBuilder.getInstance().addFraction(probaTouche)
.addFraction(probaRateBlessure).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction cNormal4 = FractionCheminBuilder.getInstance().addFraction(probaRateTouche).addFraction(probaTouche)
.addFraction(probaRateBlessure).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction cheminNormal = cNormal1.add(cNormal2).add(cNormal3).add(cNormal4);
//Mortelle
Fraction cMortelle1 = FractionCheminBuilder.getInstance().addFraction(probaTouche).addFraction(probaBlessureMortelle).build();
Fraction cMortelle2 = FractionCheminBuilder.getInstance().addFraction(probaRateTouche).addFraction(probaTouche)
.addFraction(probaBlessureMortelle).build();
Fraction cMortelle3 = FractionCheminBuilder.getInstance().addFraction(probaTouche)
.addFraction(probaRateBlessure).addFraction(probaBlessureMortelle).build();
Fraction cMortelle4 = FractionCheminBuilder.getInstance().addFraction(probaRateTouche).addFraction(probaTouche)
.addFraction(probaRateBlessure).addFraction(probaBlessureMortelle).build();
Fraction cheminMortelle = cMortelle1.add(cMortelle2).add(cMortelle3).add(cMortelle4);
return cheminNormal.add(cheminMortelle);
}
private void validateCanonAssaut(INoeudArbre racine,int attenduNormal,int attenduMortelle) {
int nbNormal = 0;
int nbMortelle = 0;
Map<EBlessure, Integer> map;
Integer nbBlessure;
for(INoeudArbre noeud:racine.arbre()) {
if(noeud.getNatureNoeud() == ENatureNoeud.REUSSITE) {
Assertions.assertThat(noeud.mapBlessuresAleatoires()).isEmpty();
map = noeud.mapBlessure();
Assertions.assertThat(map).hasSize(1);
if(map.containsKey(EBlessure.NORMALES)) {
nbNormal++;
nbBlessure = map.get(EBlessure.NORMALES);
Assertions.assertThat(nbBlessure).isEqualTo(1);
}else if(map.containsKey(EBlessure.MORTELLES)) {
nbMortelle++;
nbBlessure = map.get(EBlessure.MORTELLES);
Assertions.assertThat(nbBlessure).isEqualTo(1);
}
}
}
Assertions.assertThat(nbNormal).isEqualTo(attenduNormal);
Assertions.assertThat(nbMortelle).isEqualTo(attenduMortelle);
}
private IDataCalculProbabilite getDataCanonAssaut(ESermentInstantChoix sermentInstant) {
IContexteAction contextAction = ContextActionForTestProbaBuilder.getInstance()
.addSimule(ESimule.TIR_PHASE_TIR)
.addNumeroTour(2)
.addEffectifInitialAttaquant(10)
.addNombreAttaquant(10)
.addMouvementAttaquant(EMouvement.IMMOBILE)
.addBatimentAttaquant(new RecordBatiment(false, false))
.addNombreDefenseur(10)
.addMouvementDefenseur(EMouvement.IMMOBILE)
.addBatimentDefenseur(new RecordBatiment(false, false))
.addDistanceEntreBelligerant(12.0)
.build();
IConstituantDefenseur termagaunt = TermagantBuilderDefense.getInstance(contextAction, 10).build();
IConstituantAttaquant terminator = TerminatorBuilderAttaque.getInstance(contextAction, 1).equipeCanonAssaut().addSermentInstant(sermentInstant).build();
return DataCalculProbabiliteBuilder.getInstance().addAttaquant(terminator).addDefenseur(termagaunt).addContextAction(contextAction)
.addGestionNombreAttaque(EGestionDe.SIMULATION_OPTIMISTE).addGestionJetToucheBlessure(EGestionDe.SIMULATION_OPTIMISTE).addGestionSauvegardeDefenseur(EGestionDe.SIMULATION_OPTIMISTE).build();
}
}